dubbo系列之zookeeper连接
简介
dubbo和zookeeper是啥关系呢?打个比方:dubbo就是动物园的动物,zookeeper就是动物园,我们把很多不同的dubbo(动物)放到zookeeper(动物园中)提供给我们游客进行观赏。搞清楚了dubbo和zookeeper的关系,接下来我们看一下dubbo源码中是如何使用zookeeper的吧。
源码构成
RegistryFactory类
1  | final Registry registry = getRegistry(originInvoker);//创建ZK连接  | 
在RegistryFactory类中的export()方法中的上面那段代码,就是用于ZK连接,debug进去看看前,先看看他内部的时序图。

registryFactory.getRegistry(registryUrl)–>ExtensionLoader.getExtensionLoader(RegistryFactory.class).getExtension(“zookeeper”) –>extension.getRegistry(arg0)
                  -->AbstractRegistryFactory.getRegistry//创建一个注册中心,存储在REGISTRIES
                        –>createRegistry(url)
                          –>new ZookeeperRegistry(url, zookeeperTransporter)
                            –>AbstractRegistry
1  | public AbstractRegistry(URL url) {  | 
dubbo-registry-127.0.0.1.cache
1  | #Dubbo Registry Cache  | 
问:dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能进行通信吗?
答案是可以的,因为我们看到zookeeper的信息会缓存到本地作为一个缓存文件,并转换为properties对象方便使用。
FailbackRegistry
1  | public FailbackRegistry(URL url) {  | 
这里的做法是,建立线程池,定时的检测并连接注册中心,如果失败了就重连。其实也就是一个`定时任务执行器。
ZookeeperRegistry
1  | public ZookeeperRegistry(URL url, ZookeeperTransporter zookeeperTransporter) {  | 
ZookeeperTransporter
1  | 
  | 
看一下zookeeperTransporter的类图和继承体系图

问:zookeeper的java客户端你使用过哪些?
从继承体系图我们就只有,zookeeper是支持ZkClient和Curator两种java客户端(其实就类似jedis是redis的java客户端一样),同时@SPI("zkclient")这里就可以看出它默认是用ZkClient的。
这样,zkClient = zookeeperTransporter.connect(url);也就走完了。接着看,接着重试机制。
1  | zkClient.addStateListener(new StateListener() {  | 
以上就是整个zk连接的过程了,也就是执行了 getRegistry(originInvoker);这句代码。