服务发现-从原理到实现 (3)

zookeeper 树形结构

zookeeper 树形结构

zookeeper是一个树形结构,如上图所示。

使用zookeeper实现服务发现的功能,简单来讲,就是使用zookeeper作为注册中心。服务提供者在启动的时候,向zookeeper注册其信息,这个注册过程其实就是实际上在zookeeper中创建了一个znode节点,该节点存储了ip以及端口等信息,服务消费者向zookeeper获取服务提供者的信息。 服务注册、发现过程简述如下:

服务提供者启动时,会将其服务名称,ip地址注册到配置中心

服务消费者在第一次调用服务时,会通过注册中心找到相应的服务的IP地址列表,并缓存到本地,以供后续使用。当消费者调用服务时,不会再去请求注册中心,而是直接通过负载均衡算法从IP列表中取一个服务提供者的服务器调用服务

当服务提供者的某台服务器宕机或下线时,相应的ip会从服务提供者IP列表中移除。同时,注册中心会将新的服务IP地址列表发送给服务消费者机器,缓存在消费者本机

当某个服务的所有服务器都下线了,那么这个服务也就下线了

同样,当服务提供者的某台服务器上线时,注册中心会将新的服务IP地址列表发送给服务消费者机器,缓存在消费者本机

服务提供方可以根据服务消费者的数量来作为服务下线的依据

服务注册

假设我们服务提供者的服务名称为services,首先在zookeeper上创建一个path /services,在服务提供者启动时候,向zookeeper进行注册,其注册的原理就是创建一个路径,路径为/services/$ip:port,其中ip:port为服务提供者实例的ip和端口。如下图所示,我们现在services实例有三个,其ip:port分别为192.168.1.1:1234、192.168.1.2:1234、192.168.1.3:1234和192.168.1.4:1234,如下图所示:

服务发现-从原理到实现

健康检查

zookeeper实现了一种TTL的机制,就是如果客户端在一定时间内没有向注册中心发送心跳,则会将这个客户端摘除。

获取服务提供者的列表

前面有提过,zookeeper实际上是一个树形结构,那么服务消费者是如何获取到服务提供者的信息呢?最重要的也是必须的一点就是 知道服务提供者信息的父节点路径。以上图为例,我们需要知道

/services

通过zookeeper client提供的接口 getchildren(path)来获取所有的子节点。

感知服务上线与下线

zookeeper提供了“心跳检测”功能,它会定时向各个服务提供者发送一个请求(实际上建立的是一个 socket 长连接),如果长期没有响应,服务中心就认为该服务提供者已经“挂了”,并将其剔除,比如192.168.1.2这台机器如果宕机了,那么zookeeper上的路径/services/下就会只剩下192.168.1.1:1234, 192.168.1.2:1234,192.168.1.4:1234。如下图所示:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwwdsd.html