JAVA面试题分享一百四十七:Dubbo 是如何动志感知服务下线的?

一、Zookeeper感知

首先,Dubbo 默认采用 Zookeeper 实现服务的注册与服务发现,简单来说,是多个 Dubbo 服务之间的通信地址,是使用 Zookeeper 来维护的。

而在 Zookeeper 上,会采用树形结构的方式来维护 Dubbo 服务提供端的协议地址,Dubbo 服务消费端会从 Zookeeper Server 上去查找目标服务的地址列表,从而完成服务的注册和消费功能。

JAVA面试题分享一百四十七:Dubbo 是如何动志感知服务下线的?_第1张图片

二、订阅基本原理

服务订阅通常有 pull 和 push 两种方式。pull 模式需要客户端定时向注册中心拉取配置,而 push 模式采用注册中心主动推送数据给客户端。

dubbo zk 注册中心采用是事件通知与客户端拉取方式。服务第一次订阅的时候将会拉取对应目录下全量数据,然后在订阅的节点注册一个 watcher。一旦目录节点下发生任何数据变化,zk 将会通过 watcher 通知客户端。客户端接到通知,将会重新拉取该目录下全量数据,并重新注册 watcher。利用这个模式,dubbo 服务就可以就做到服务的动态发现。

三、心跳检测-Watch机制

那Zookeeper呢,就会通过心跳检测机制,来判断 Dubbo 服务提供端的运行状态,来决定是否应该把这个服务从地址列表剔除。

JAVA面试题分享一百四十七:Dubbo 是如何动志感知服务下线的?_第2张图片

当Dubbo服务提供方出现故障导致Zookeeper剔除了这个服务的地址,

那么Dubbo服务消费端需要感知到地址的变化,从而避免后续的请求发送到故障节点,导致请求失败。

也就是说Dubbo要提供服务下线的动态感知能力。

这个能力是通过Zookeeper里面提供的Watch机制来实现的

 JAVA面试题分享一百四十七:Dubbo 是如何动志感知服务下线的?_第3张图片

简单来说呢,Dubbo服务消费端会使用Zookeeper里面的Watch来针对Zookeeper Server端的/providers节点注册监听,

一旦这个节点下的子节点发生变化,Zookeeper Server就会发送一个事件通知Dubbo Client端.

Dubbo Client端收到事件以后,就会把本地缓存的这个服务地址删除,这样后续就不会把请求发送到失败的节点上,完成服务下线感知。

 

你可能感兴趣的:(JAVA面试题分享,java,dubbo,开发语言)