Dubbo——服务发现

参考:https://blog.csdn.net/u012410733/article/details/79783347

           https://blog.csdn.net/zhonghuixiong/article/details/79351928

            http://humn-chou.iteye.com/blog/1866272?utm_source=tuicool&utm_medium=referral

1、RegistryFactory#getRegistry获取到 zookeeper 注册中心,和服务暴露获取注册中心的逻辑一样。 
2、创建注册服务目录 RegistryDirectory 
3、注册服务消费者 URL 到 zookeeper,其实就是创建 zookeeper 的节点,和服务端发布类似。

/dubbo/com.alibaba.dubbo.demo.DemoService/consumers /consumer%3A%2F%2F192.168.20.1%2Fcom.alibaba.dubbo.demo.DemoService%3Fapplication%3Ddemo-consumer%26category%3Dconsumers%26check%3Dfalse%26dubbo%3D2.0.0%26interface%3Dcom.alibaba.dubbo.demo.DemoService%26methods%3DsayHello%26pid%3D3808%26qos.port%3D33333%26side%3Dconsumer%26timestamp%3D1522590290256

 

4、订阅 zookeeper 以下结点,当服务发生变更时,销毁无效的 Invoke.刷新 RegistryDirectory 中的Map<String, List<Invoker<T>>> methodInvokerMap对象。

  • /dubbo/com.alibaba.dubbo.demo.DemoService/providers
  • /dubbo/com.alibaba.dubbo.demo.DemoService/configurators
  • /dubbo/com.alibaba.dubbo.demo.DemoService/routers

5、调用cluster#join(directory) 合并 invoker 创建并提供集群 failover (故障转移)调用策略

  • cluster#join(directory)//加入集群路由 
    • ExtensionLoader#getExtensionLoader(Cluster.class).getExtension(“failover”); 
      • MockClusterWrapper#join 
        • this.cluster#join(directory) 
          • FailoverCluster#join 
            • new FailoverClusterInvoker(directory)
        • return new MockClusterInvoker(directory, new FailoverClusterInvoker(directory));

总结:总得来说,就是根据配置文件的各个属性拼接成一个URL,在zookeeper 上创建节点,同时订阅providers,configurators,routers,并返回一个代理类, return (T) proxyFactory.getProxy(invoker);  当调用接口方法时,调用InvokerInvocationHandler.invoke()方法,从集群中根据负载均衡的策略(默认是RoundRobinLoadBalance,轮询策略)选择一个Invoker进行使用,然后客户端使用Netty发送请求给服务端,服务端处理请求后,返回结果给客户端,完成调用。

 

在返回代理之前,将方法名与Invoker对应起来,存在RegistryDirectory中。

{*=[com.alibaba.dubbo.registry.integration.RegistryDirectory$InvokerDelegete@551b8e9d],

sayHello=[com.alibaba.dubbo.registry.integration.RegistryDirectory$InvokerDelegete@551b8e9d]}

 

调用sayHello方法后,会根据方法名在RegistryDirectory找到对应的Invoker

 

在暴露服务时,已经把接口的对应关系存到了DubboProtocol的exporterMap中

{com.xbz.service.DemoService:20880=com.alibaba.dubbo.registry.integration.RegistryProtocol$InvokerDelegete@55dc9978}

通过上取得的invoker,然后调用invoker.invoke(inv)方法,来取得代理的实现类,最终返回包装好的结果给消费端。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值