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);这句代码。