Dubbo原理解析-注册中心之Zookeeper协议注册中心
下面我们来看下开源dubbo推荐的业界成熟的zookeeper做为注册中心, zookeeper是hadoop的一个子项目是分布式系统的可靠协调者,他提供了配置维护,名字服务,分布式同步等服务。对于zookeeper的原理本文档不分析,后面有时间在做专题。
zookeeper注册中心
Zookeeper对数据存储类似linux的目录结构,下面给出官方文档对dubbo注册数据的存储示例
假设读者对zookeeper有所了解,能够搭建zookeeper服务,其实不了解也没关系,谷歌百度下分分钟搞起。
作为测试调试dubbo,我是在本地起的zookeeper
指定zookeeper配置文件地址
配置文件中两个关键参数:
dataDir zookeeper存储文件的地址
clientPort 客户端链接的端口号
Dubbo服务提供者配置
<dubbo:registry protocol=”zookeeper” address="127.0.0. 1:2181" />
<beanid="demoService" class="com.alibaba.dubbo.demo.provi der.DemoServiceImpl"/>
<dubbo:serviceinterface="com.alibaba.dubbo.demo.DemoServi ce" ref="demoService"/>
除了配置注册中心的,其他都一样
Dubbo服务消费者配置
<dubbo:registry protocol=”zookeeper” address="127.0.0. 1:2181" />
<dubbo:referenceid="demoService"interface="com.alibaba.dubbo.demo.DemoService"/>
除了配置注册中心的,其他都一样
客户端获取注册器
服务的提供者和消费者在RegistryProtocol利用注册中心暴露(export)和引用(refer)服务的时候会根据配置利用Dubbo的SPI机制获取具体注册中心注册器
Registry registry = registryFactory.getRegistry(url);
这里的RegistryFactory是ZookeeperRegistryFactory看如下工厂代码
public class ZookeeperRegistryFactory extends AbstractRegistryFactory {
public Registry createRegistry(URL url) {
return new ZookeeperRegistry(url, zookeeperTransporter);
}
}
这里创建zookeepr注册器ZookeeperRegistry
ZookeeperTransporter是操作zookeepr的客户端的工厂类,用来创建zookeeper客户端,这里客户端并不是zookeeper源代码的自带的,而是采用第三方工具包,主要来简化对zookeeper的操作,例如用zookeeper做注册中心需要对zookeeper节点添加watcher做反向推送,但是每次回调后节点的watcher都会被删除,这些客户会自动维护了这些watcher,在自动添加到节点上去。
接口定义:
@SPI("zkclient")
public interface ZookeeperTransporter {
@Adaptive({Constants.CLIENT_KEY, Constants.TRANSPORTER_KEY})
ZookeeperClient connect(URL url);
}
默认采用zkClient, dubbo源码集成两种zookeeper客户端,除了zkClient还有一个是curator
ZookeeperRegistry注册器的实现
1.构造器利用客户端创建了对zookeeper的连接,并且添加了自动回复连接的监听器。
zkClient = zookeeperTransporter.connect(url);
zkClient.addStateListener(new StateListener() {
public void stateChanged(int state) {
if (state ==RECONNECTED)
recover();
}
});
2.注册url就是利用客户端在服务器端创建url的节点,默认为临时节点,客户端与服务端断开,几点自动删除
zkClient.create(toUrlPath(url),url.getParameter(Constants.DYNAMIC_KEY,true));
3.取消注册的url,就是利用zookeeper客户端删除url节点
zkClient.delete(toUrlPath(url));
4. 订阅url, 功能是服务消费端订阅服务提供方在zookeeper上注册地址,这个功能流程跟DubboRegister不一样, DubboRegister是通过Dubbo注册中心实现SimpleResgiter在注册中心端,对url变换、过滤筛选然后将获取的provierUrl(提供者ulr)利用服务消费者暴露的服务回调在refer。
由于这里注册中心采用的是zookeeper,zookeeper不可能具有dubbo的业务逻辑,这里对订阅的逻辑处理都在消费服务端订阅的时候处理。
1) 对传入url的serviceInterface是*代表订阅url目录下所有节点即所有服务,这个注册中心需要订阅所有
2) 如果指定了订阅接口通过toCategoriesPath(url)转换需要订阅的url
如传入url consumer://10.33.37.8/com.alibaba.dubbo.demo.DemoService?application=demo-consumer&category=providers,configurators,routers&dubbo=2.5.4-SNAPSHOT&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=4088&side=consumer×tamp=1417405597808
转换成urls
/dubbo/com.alibaba.dubbo.demo.DemoService/providers,/dubbo/com.alibaba.dubbo.demo.DemoService/configurators, /dubbo/com.alibaba.dubbo.demo.DemoService/routers
3) 设配传入的回调接口NotifyListener,转换成dubbo对zookeeper操作的ChildListener
4)以/dubbo/com.alibaba.dubbo.demo.DemoService/providers为例创建节点zkClient.create(path, false);
但是一般情况下如果服务提供者已经提供服务,那么这个目录节点应该已经存在,Dubbo在Client层屏蔽掉了创建异常。
5) 以/dubbo/com.alibaba.dubbo.demo.DemoService/providers为例给节点添加监听器,返回所有子目录
List<String> children = zkClient.addChildListener(path, zkListener);
if (children !=null) {urls.addAll(toUrlsWithEmpty(url, path,hildren));}
toUrlsWtihEmpty用来配置是不是需要订阅的url,是加入集合
6) 主动根据得到服务提供者urls回调NotifyListener,引用服务提供者生成invoker可执行对象
5. 取消订阅url, 只是去掉url上的注册的监听器
Dubbo原理解析-注册中心之Zookeeper协议注册中心的更多相关文章
- Java进阶专题(二十六) 将近2万字的Dubbo原理解析,彻底搞懂dubbo
前言 前面我们研究了RPC的原理,市面上有很多基于RPC思想实现的框架,比如有Dubbo.今天就从Dubbo的SPI机制.服务注册与发现源码及网络通信过程去深入剖析下Dubbo. Dubbo架构 ...
- 【DUBBO】Dubbo原理解析-服务引用
服务引用是服务的消费方向注册中心订阅服务提供方提供的服务地址后向服务提供方引用服务的过程. 服务的应用方在spring的配置实例如下: <dubbo:referenceid="demo ...
- 【DUBBO】Dubbo原理解析-服务发布
转载:http://blog.csdn.net/quhongwei_zhanqiu/article/details/41651205 服务发布方在spring的配置文件中配置如下: <bean ...
- Dubbo原理解析(非常透彻)
一.概述 dubbo是一款经典的rpc框架,用来远程调用服务的. dubbo的作用: 面向接口的远程方法调用 智能容错和负载均衡 服务自动注册和发现. 自定义序列化协议 Dubbo 架构中的核心角色有 ...
- 2. Dubbo原理解析-Dubbo内核实现之基于SPI思想Dubbo内核实现(转)
转载自 斩秋的专栏 http://blog.csdn.net/quhongwei_zhanqiu/article/details/41577159 SPI接口定义 定义了@SPI注解 public ...
- 【DUBBO】 Dubbo原理解析-Dubbo内核实现之基于SPI思想Dubbo内核实现
转载:http://blog.csdn.net/quhongwei_zhanqiu/article/details/41577235 SPI接口定义 定义了@SPI注解 public @interfa ...
- Java进阶专题(二十七) 将近2万字的Dubbo原理解析,彻底搞懂dubbo (下)
...接上文 服务发现 服务发现流程 整体duubo的服务消费原理 Dubbo 框架做服务消费也分为两大部分 , 第一步通过持有远程服务实例生成Invoker,这个Invoker 在客户端是核心的远程 ...
- Dubbo原理解析-监控
Dubbo发布代码中,自带了一个简易的监控中心实现.对于一般的小业务这个监控中心应该能够满足需求,对于那些大业务量的大公司一般都会有自己的监控中心,更加丰富的功能如常用的报警短信通知等等.这章讲解分析 ...
- 分布式服务框架dubbo原理解析(转)
libaba有好几个分布式框架,主要有:进行远程调用(类似于RMI的这种远程调用)的(dubbo.hsf),jms消息服务(napoli.notify),KV数据库(tair)等.这个框架/工具/产品 ...
随机推荐
- MotionEvent
getAction() returns a pointer id and an event (i.e., up, down, move) information. getActionMasked() ...
- sdk manager更新超时 time out
sdk manager选择菜单tools->options,勾选下面的force https......重启sdk manager
- 屏幕实战效果解析:IPS/TFT/AMOLED/SLCD
现在手机市场上,智能手机种类繁多,手机屏幕材质也是五花八门.对于一般消费者来说,一款手机是否值得购买,除了关心它的硬件参数以外,更重要的一点就是看它的屏幕.除了屏幕尺寸以外,影响着大家对该手机的第一感 ...
- Java:正则表达式的详解
正则表达式:符合一定规则的表达式. 作用:用于专门操作字符串. 特点:用一些特定的符号来表示一些代码的操作.这样就简化书写.所以学习正则表达式就是学习一些特殊符号的使用. 好处:可以简化对字符串的操作 ...
- Linux和远程系统同步文件(未完成)
实验环境: 本地主机:192.168.0.1 远程主机:192.168.0.101 1. 使用 scp,把/root/tardir1/achieve2.tar.gz复制到远程主机的root用户的hom ...
- 深入理解Java内存模型(四)——volatile
volatile的特性 当我们声明共享变量为volatile后,对这个变量的读/写将会很特别.理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个监视器锁对这 ...
- Myeclipse的web项目移植到Eclipse中需要添加的包
3.jstl.jar 4.standard-1.1.2.jar 把Myeclipse的web项目一直到Eclipse当中需要添加的包主要有一下4个: 1.servlet-api.jar 2.jsp-a ...
- HDFS的基本shell操作,hadoop fs操作命令
(1)分布式文件系统 随着数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,因此迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管 ...
- java之并发
一.线程 在java中多线程执行任务,主要有两种方式,一种是通过继承Thread类,重写run方法,优点是比较方便的创建一个线程,缺点是java中每个类只能有一个基类,所有继承了T火热ad类后,就不能 ...
- 什么是HotSpot VM & 深入理解Java虚拟机
参考 http://book.2cto.com/201306/25434.html 另外,这篇文章也是从一个系列中得出的: <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> ...