(exporter, originInvoker, overrideSubscribeUrl, registedProviderUrl);
在之前的文章中分析了 dubbo 通过 netty 暴露服务,然后获取到 zookeeper 注册中心 --- ZookeeperRegistry。下面就是把 Provider (服务提供者)的信息注册到注册中心上。这样 Consumer (服务消费者)就可以通过 Registry (注册中心)获取到 Provider 的信息。这样就解耦了 Provider 与 Consumer,并且可以通过 Registry 来修改路由规则、权重等控制。这样就达到的服务的治理。下面我们就来讲解一下,服务的注册与订阅。
2、ZookeeperRegistry#register
这个就是把服务信息注册到 Zookeeper 上面去。
1、AbstractRegistry#register添加注册Set
dubbo://192.168.75.1:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.0.0&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=2076&side=provider×tamp=1522237459900
dubbo 会基于这个 URL 生成一个新的URL,生成规则为:
"/dubbo/" + url里面的interface的值 + "/providers/" + URL.encode(url)
生成后的值 :
/dubbo/com.alibaba.dubbo.demo.DemoService/providers/dubbo%3A%2F%2F192.168.75.1%3A20880%2Fcom.alibaba.dubbo.demo.DemoService%3Fanyhost%3Dtrue%26application%3Ddemo-provider%26dubbo%3D2.0.0%26generic%3Dfalse%26interface%3Dcom.alibaba.dubbo.demo.DemoService%26methods%3DsayHello%26pid%3D2076%26side%3Dprovider%26timestamp%3D1522237459900
然后在 Zookeeper 上面把 /dubbo/com.alibaba.dubbo.demo.DemoService/providers/ 创建成持久化节点,而后面部分的 URL 就会创建成临时节点。
把服务提供者信息创建成临时节点的好处就是如果当前服务挂掉,这个节点就会自动删除。这样失效服务就可以自动剔除。
>Zookeeper 持久化节点 和临时节点有什么区别? >持久化节点:一旦被创建,触发主动删除掉,否则就一直存储在ZK里面。 >临时节点:与客户端会话绑定,一旦客户端会话失效,这个客户端端所创建的所有临时节点都会被删除。
3、ZookeeperRegistry#subscribe
通过订阅 Zookeeper 上面的的节点信息变更, 可以通过 dubbo-admin来修改服务路由规则、权重等。
1、创建一个 NotifyListener 实例 OverrideListener, 当收到服务变更通知时触发。 2、在 Zookeeper 注册中心创建持久化节点/dubbo/com.alibaba.dubbo.demo.DemoService/configurators,用于接收 dubbo-admin这个客户端上对于集群的服务治理。
ZookeeperRegistry#doSubscribe { zkClient.create(path, false)}
3、启动加入订阅/dubbo/com.alibaba.dubbo.demo.DemoService/configurators,如果该节点信息发生改变,就会交给FailbackRegistry.notify处理。
ZookeeperRegistry#doSubscribe { zkClient.addChildListener(path, zkListener)}
4、FailbackRegistry#notify
1、把服务端的注册 url 信息更新到本地缓存(AbstractRegistry#saveProperties),以Window为例:
C:\Users\Carl\.dubbo\dubbo-registry-10.65.209.12.cache
2、调用传入的OverrideListener#notify,如果修改了 URL 信息,调用RegistryProtocol.this.doChangeLocalExport(originInvoker, newUrl)重新暴露当前服务。
前面二篇加上这一篇就是 dubbo 远程服务暴露的整个过程。下面这张图片就是 dubbo 进行服务暴露、服务远程调用添加 dubbo monitor 后 Zookeeper 上面 dubbo 节点的结构图。
![dubbo源码分析 之 服务远程暴露(下)](http://p2.ttnews.xyz/loading.gif)
dubbo源码分析 之 服务远程暴露(中)未能发表出来,有兴趣了解一下的可以直接
看链接http://bbs.dongnaoedu.com/?thread-65.htm
另外分享给大家一个zookeeper分布式锁的视频详解
链接: https://pan.baidu.com/s/1X3q25cqF1_BtNe1TazHpxw 密码: pndp
分享不易,来波关注吧~
閱讀更多 Java小優秀 的文章