动态ip

>

代理ip软件

>

换ip软件

>

HTTP代理

>
Socks5代理
黑核动态ip代理
您的位置: 首页 > 新闻资讯 > 正文

动态指定IP调用Dubbo服务

发布时间:2020-01-14 14:17:26 来源:黑核动态ip代理

分享到

  前面我们探讨了如何获取某一个Dubbo的服务的提供者列表,本节我们探讨如何使用Dubbo的扩展,实现指定IP调用。

  在Dubbo中集群容错策略Cluster是SPI扩展接口,DUbbo框架提供了丰富的集群容错策略实现,集群容错策略里面会先从RegistryDirectory获取所有服务提供者的Invoker列表,然后使用负载均衡策略从中选择一个Inovker来发起远程调用;基于此原理我们可以实现自己的集群容错策略,一开始还是使用RegistryDirectory获取所有服务提供者的Invoker列表,但是不进行负载均衡策略,而是使用我们在发起远程调用前指定的ip相匹配的Invoker来进行发远程调用;至于如何在每次调用前指定ip,可以使用RpcContext.getContext().set("ip","30.10.67.231")来做。

  基于上面思想本节我们就基于扩展接口实现指定IP调用功能,首先我们实现扩展接口Cluster:

  public class MyCluster implements Cluster{

    @Override
    public <T> Invoker<T> join(Directory<T> directory) throws RpcException {
        return new MyClusterInvoker(directory);
    }
}

  然后我们看自己实现的MyClusterInvoker

public class MyClusterInvoker<T> extends MyAbstractClusterInvoker<T> {

    public MyClusterInvoker(Directory<T> directory) {
        super(directory);
    }

    @Override
    protected Result doInvoke(Invocation invocation, List<Invoker<T>> invokers, LoadBalance loadbalance)
            throws RpcException {

        // 1.查看是否设置了指定ip
        String ip = (String) RpcContext.getContext().get("ip");
        if (StringUtils.isBlank(ip)) {
            throw new RuntimeException("ip is blank ");
        }
        // 2.检查是否有可用invoker
        checkInvokers(invokers, invocation);

        // 3.根据指定ip获取对应invoker
        Invoker<T> invoked = invokers.stream().filter(invoker -> invoker.getUrl().getHost().equals(ip)).findFirst()
                .orElseThrow(new Supplier<RpcException>() {
                    @Override
                    public RpcException get() {
                        return  new RpcException(RpcException.NO_INVOKER_AVAILABLE_AFTER_FILTER,
                                "Failed to invoke the method " + invocation.getMethodName() + " in the service "
                                        + getInterface().getName() + ". No provider available for the service "
                                        + directory.getUrl().getServiceKey() + " from ip " + ip + " on the consumer "
                                        + NetUtils.getLocalHost() + " using the dubbo version " + Version.getVersion()
                                        + ". Please check if the providers have been started and registered.");
                    }
                });
        
        // 4.发起远程调用,失败则抛出异常
        try {

            return invoked.invoke(invocation);
        } catch (Throwable e) {
            if (e instanceof RpcException && ((RpcException) e).isBiz()) { // biz exception.
                throw (RpcException) e;
            }
            throw new RpcException(e instanceof RpcException ? ((RpcException) e).getCode() : 0,
                    "Fail invoke providers " + (invoked != null ? invoked.getUrl() : "") + " "
                            + loadbalance.getClass().getSimpleName() + " select from all providers " + invokers
                            + " for service " + getInterface().getName() + " method " + invocation.getMethodName()
                            + " on consumer " + NetUtils.getLocalHost() + " use dubbo version " + Version.getVersion()
                            + ", but no luck to perform the invocation. Last error is: " + e.getMessage(),
                    e.getCause() != null ? e.getCause() : e);
        }
    }
}

  如上代码1,我们从RpcContext.getContext()获取了属性值ip,如果改值不为空,说明指定了ip。

  代码2则检查是否有可用的服务提供者,如果没有则抛出异常。

  代码3遍历invokers列表查找指定IP对应的Invoker,如果没有指定IP对应的Invoker,则抛出异常。

  代码4具体使用选择的invoker发起远程调用。

  注意我们还修改了框架的AbstractClusterInvoker为MyAbstractClusterInvoker:

public Result invoke(final Invocation invocation) throws RpcException {
    checkWhetherDestroyed();

    // binding attachments into invocation.
    Map<String, String> contextAttachments = RpcContext.getContext().getAttachments();
    if (contextAttachments != null && contextAttachments.size() != 0) {
        ((RpcInvocation) invocation).addAttachments(contextAttachments);
    }
    List<Invoker<T>> invokers = list(invocation);
    
    LoadBalance loadbalance = null;//initLoadBalance(invokers, invocation);

    RpcUtils.attachInvocationIdIfAsync(getUrl(), invocation);
    return doInvoke(invocation, invokers, loadbalance);

}

  这里我们把LoadBalance loadbalance=initLoadBalance(invokers,invocation);

  修改为了LoadBalance loadbalance=null;因为我们不需要负载均衡了。

  扩展实现写好后,要把扩展实现配置到下面文件

动态指定IP调用Dubbo服务

  然后在消费端调用时候进行下面设置就可以指定ip调用了,比如在demo的consumer模块的APiConsumerSetIpcall类:

public class APiConsumerSetIpcall {
    public static void main(String[] args) throws InterruptedException {

        // 1.创建服务引用对象实例
        ReferenceConfig<GreetingService> referenceConfig = new ReferenceConfig<GreetingService>();
        ...

        // 5.设置自定义负载均衡策略与集群容错策略(以便实现指定ip)
        referenceConfig.setCluster("myCluster");
        
        // 7.引用服务
        GreetingService greetingService = referenceConfig.get();

        //8.获取地址列表
        ZookeeperIpList zk = new ZookeeperIpList();
        zk.init("127.0.0.1:2181", "dubbo", "com.books.dubbo.demo.api.GreetingService:1.0.0", "dubbo");

        //9.指定ip调用
        for (String ip : zk.getIpList()) {
            RpcContext.getContext().set("ip", ip);
            System.out.println(greetingService.sayHello("world" + ip));
        }

    }
}

  如上代码(8)创建ZookeeperIpList对象并初始化,代码9则调用ZookeeperIpList的getIpList()方法获取所有服务提供者地址列表,然后轮询指定ip进行调用,也就是我们实现了动态ip指定路由调用,每次发起远程调用前,可以指定那一台服务提供方来提供服务。


相关资讯

换ip软件帮您解决ip被封烦恼!

换ip软件帮您解决ip被封烦恼!我想做互联网工作的基本上都需要换下ip吧,很多时候我们做推广经常被封账号,特别是同一个IP自问自答马上封你没商量,但是这些推广也

来源:黑核混拨IP网

2018-12-25 15:52:02

不知道怎么样修改ip地址可以用黑核混拨IP软件

现在做推广越来越难做了,动不动就被封号,要么就是一个IP只能登陆一个账号,这就尴尬了,如果只用一个账号推广根本不见效啊,或者说见效也效果不大,只能大批量的做推广

来源:黑核混拨ip加速器网

2018-12-25 16:28:24

黑核混拨IP加速器让你知道如何改变ip地址

被论坛禁言了?玩游戏作弊,被封号了?被人屏蔽IP是件很让人不爽的事情,平时正忙的时候被封禁,会有种天塌下来的感觉。如何改变ip地址成了我们比做的事情,不改变IP

来源:黑核混拨ip加速器网

2018-12-25 16:58:44

黑核混拨IP加速器轻松解决怎么修改手机ip地址问题

有些视频播放站很坑,一天只能观看几个视频就需要开通会员才能看了,但是我们又不想冲会员怎么办,那就需要修改手机IP地址了,但是怎么修改手机IP地址呢?不是谁都懂的

来源:黑核混拨ip加速器网

2018-12-25 17:39:01

还在找ip地址修改器吗?来试试黑核混拨IP加速器吧

国内ip地址修改器顾名思义就是转换自己的IP地址的一个工具或者一款软件,ip地址修改用哪些工具好处呢,因为工作或者个人需求,修改IP后可以注册一些限制IP注册的

来源:黑核混拨ip加速器网

2018-12-25 18:13:13

在国外想玩lol国服吗?来试试这个ip加速器吧

身在国外想玩下国服游戏是一件很痛苦的事情,因为网络延迟太高了,卡到让人怀疑人生的那种地步,有多卡呢?玩个游戏能卡出漫画的效果来,看着都着急啊。特别是玩游戏的时候

来源:黑核混拨ip加速器网

2018-12-27 17:07:17

什么是ip代理软件?可以修改ip地址吗?

经常碰到朋友问,代理IP是做啥的,有什么用。我对他一顿解释,然后他还是云里雾里,好吧,可能是我口才不好,这里写文再解释下。代理IP对于很多人来说,用处很大,他们

来源:黑核混拨ip加速器网

2018-12-27 17:27:18

怎么利用动态ip抓取豆瓣电影数据

学爬虫有一段时间了,作为一个悬疑片爱好者总是无限片荒,泛滥的Top250爬取以及填补不了我饥渴的内心。于是果然地决定:自己动手,爬完豆瓣,丰衣足食。(一)反爬虫

来源:黑核混拨ip代理

2019-03-29 10:55:32

怎么用代理IP爬取到网站的指定数据

怎么用代理IP爬取到网站的指定数据?这个代码是根据上一个爬取代理IP代码写出来的,当我们已经从那个国内高匿代理IP网站中爬取到存活时间比较久的IP地址后(此IP

来源:黑核动态ip代理

2019-09-18 11:33:44

http代理调用模式

近年来互联网的快速发展,各行各业发展尤为迅速,大数据时代来临,爬虫行业迎来高速发展,http代理的作用也日益重要。近几年来,各种代理IP的推出吸引了不少人的关注

来源:黑核动态ip代理

2019-11-28 14:18:11

动态指定IP调用Dubbo服务

前面我们探讨了如何获取某一个Dubbo的服务的提供者列表,本节我们探讨如何使用Dubbo的扩展,实现指定IP调用。在Dubbo中集群容错策略Cluster是SP

来源:黑核动态ip代理

2020-01-14 14:17:26

在线客服
QQ:800861888
客服电话
400-998-997
微信客服