首先,Dubbo默认采用Zookeeper实现服务注册与服务发现,就是多个Dubbo服务之间的通信地址,是使用Zookeeper来维护的。在Zookeeper上,会采用树形结构
的方式来维护Dubbo服务提供端的协议地址,Dubbo服务消费端会从Zookeeper Server上去查找目标服务的地址列表,从而完成服务的注册和消费的功能。
Zookeeper会通过心跳检测机制
,来判断Dubbo服务提供端的运行状态,来决定是否应该把这个服务从地址列表剔除。当Dubbo服务提供方出现故障导致Zookeeper剔除了这个服务的地址,那么Dubbo服务消费端需要感知到地址的变化,从而避免后续的请求发送到故障节点,导致请求失败,也就是说Dubbo要提供服务下线的动态感知能力。
这个能力是通过Zookeeper里面提供的Watch机制
来实现的。简单来说,Dubbo服务消费端会使用Zookeeper里面的Watch来针对Zookeeper Server端的/providers节点注册监听,一旦这个节点下的子节点发生变化,Zookeeper Server就会发送一个事件通知Dubbo Client端。Dubbo Client端收到事件以后,就会把本地缓存的这个服务地址删除,这样后续就不会把请求发送到失败的节点上,完成服务下线感知。