Dubbo的注册中心有好多种,包括Multicast(广播协议)、Zookeeper、Redis、Simple等。Dubbo官方推荐使用Zookeeper注册中心。如需了解Dubbo使用,请移步:Dubbo实例快速上手
1.基于ZooKeeper解析Dubbo注册中心实现原理
①当服务端启动完成后,会在ZooKeeper上注册到/dubbo这个节点下;
②消费端,在xml中配置<dubbo:reference>远程服务调用,如果改地址发生变化,都会去通过watch监听/dubbo节点下的该接口名的节点变化;
③消费端访问服务端时,会拿到该节点下的所有子节点,当子节点发生变化时,Watch监听会通知给消费端。消费端此时拿到服务端注册在ZooKeeper中的节点地址信息列表,然后根据地址列表对应的服务去发布。如果服务端采用的是集群,那么消费端在得到该服务的过程中,就会通过负载均衡的算法来完成具体的调用过程,Dubbo会对这个地址做负载均衡算法,最后选择一个可用的地址,然后发起调用(如图所示)
2.注册中心缓存机制
现在,我们会有如下一些问题:
①消费端每次在调用服务之前,都必须先去访问zookeeper,拿到服务地址,然后再去调用服务,这样会严重影响性能;
②如果ZooKeeper宕机,又该怎么办?(ZooKeeper集群除外)
Dubbo已经为我们考虑到了这些情况,所以Dubbo为注册中心引入了缓存机制。当消费端在获得注册中心信息后,会将服务地址缓存至本地。我们需要在消费端注册中心,使用file属性,进行自定义地址配置。配置如下:
<dubbo:registry address="zookeeper://192.168.204.201:2181" file="D:/dubbo-server"/>
当启动完成后,我们便能够在配置的路径下,看到当前服务对应的地址信息文件。如果zookeeper挂掉之后,它便会直接从本地缓存去拿注册中心地址,从而避免整个服务都受牵连。
缓存信息内容如下:
#Dubbo Registry Cache
#Thu Aug 01 16:16:33 CST 2019
com.test.dubbo.ISayHello=empty\://192.168.41.126/com.test.dubbo.ISayHello?application\=dubbo-client&category\=configurators&check\=false&dubbo\=2.0.2&interface\=com.test.dubbo.ISayHello&methods\=sayHello&owner\=test&pid\=305488&release\=2.7.0&revision\=1.0-SNAPSHOT&side\=consumer×tamp\=1564647392165 empty\://192.168.41.126/com.test.dubbo.ISayHello?application\=dubbo-client&category\=routers&check\=false&dubbo\=2.0.2&interface\=com.test.dubbo.ISayHello&methods\=sayHello&owner\=test&pid\=305488&release\=2.7.0&revision\=1.0-SNAPSHOT&side\=consumer×tamp\=1564647392165 dubbo\://192.168.41.126\:20880/com.test.dubbo.ISayHello?anyhost\=true&application\=dubbo-server&bean.name\=com.test.dubbo.ISayHello&dubbo\=2.0.2&generic\=false&interface\=com.test.dubbo.ISayHello&methods\=sayHello&owner\=test&pid\=300832&release\=2.7.0&side\=provider×tamp\=1564634218870
END