九、服务注册中心

1 几个概念

1.1 服务提供者

1.2 服务消费者

1.3 服务注册中心

服务注册中心是分布式服务框架的目录服务器,相比于传统的目录服务器,它有如下几个特点:

  1. 高 HA:支持数据持久化、支持集群。
  2. 数据一致性问题:集群中所有的客户端应该看到同一份数据,不能出现读或者写数据不一致。
  3. 数据变更主动推送:当注册中心的数据发生变更时(增加、删除、修改)需要能够及时将变化的数据通知给客户端。

2 关键功能特性设计

服务注册中心的工作原理如下:

  1. 服务提供者在启动时,根据服务发布文件中配置的服务发布信息向注册中心注册自己提供的服务。
  2. 服务消费者在启动时,根据消费者配置文件中配置的服务消费信息向注册中心订阅自己所需的服务,消费者刷新本地缓存的路由表。
  3. 注册中心返回服务提供者地址列表,如果有变更,注册中心主动推送变更数据给消费者,消费者刷新本地缓存的路由表。
  4. 服务消费者从本地缓存的服务提供者地址列表中,基于负载均衡算法选择一台服务提供者进行调用。

2.1 支持对等集群

服务注册中心需要支持对等集群,如下图,其中某一个或者多个服务注册中心进程宕机,不会导致服务注册中心集群功能不可用。

对于客户端,无论服务注册中心集群配置多少个进程,客户端只需要连接其中某一个即可(服务端之间自己进行数据同步),如下图:

2.2 提供 CRUD 接口

客户端连接服务注册中心之后,需要能够对服务注册中心的数据进行操作:

  1. 查询接口:查询系统当前发布的服务信息和订阅的消费者信息。
  2. 修改接口:修改已经发布的服务属性或者消费者属性信息,通常用于运行态的服务治理。
  3. 新增接口:发布或者订阅新的服务。
  4. 删除接口:去注册已经发布的服务,或者消费者取消订阅关系。

2.3 安全加固

服务注册中心需要进行安全加固,安全加固主要涉及两部分:

  1. 链路的安全性。
  2. 数据的安全性。

链路的安全性指的是服务注册中心对客户端连接进行安全认证,认证策略非常多,最简单的就是基于 IP地址的黑名单校验,更加复杂的有基于用户名+密码的认证,或者基于秘钥+数字证书的认证。
认证失败,则关闭链路,拒绝客户端连接。

数据的安全性主要针对服务注册中心的数据进行权限控制:

  1. 非授权客户端既不能读取也不能写入数据。
  2. 普通运维人员只能读取数据,不能修改数据。
  3. 管理员既可以读取也可以修改数据。
  4. 不同的服务目录可以设置不同的访问权限,例如消费者只能查看它所在机房的服务。
    数据安全性工作原理如下:

2.4 订阅发布机制

对于服务提供者,可以根据服务名等信息动态发布服务;对于消费者,可以根据订阅关系主动获得服务发布者的地址信息等。订阅发布机制还有一个比较重要的机制就是对变化的监听和主动推送能力:

  1. 消费者可以监听一个或者多个服务目录,当目录名称、内容发生变更时,消费者可以实时地获得变更的数据或者变更后的结果信息。
  2. 服务提供者可以发布一个或者多个服务,动态修改服务名称、服务内容等,可以主动将修改后的数据或者修改后的结果推送给所有监听此服务目录的消费者。
    订阅发布机制有如下优点:
  3. 透明化路由:服务提供者和消费者互相解耦,服务提供者未知透明,消费者不需要再硬编码服务提供者地址。
  4. 服务健康状态监测:服务注册中心可以实时监测发布服务的质量,如果服务提供者宕机,由服务注册中心实时通知消费者。
  5. 弹性伸缩能力(动态发现):应用在云端部署之后,由于 VM资源占用率过高,动态伸展出一个新的服务提供者,服务注册中心会将新增的服务提供者地址信息推送给消费者,消费者刷新本地路由表之后可以访问新的服务提供者,实现服务的弹性伸缩。

2.3 可靠性

服务注册中心需要支持对等集群,任意一台宕机后,服务都能自动切换到其它正常的服务注册中心。
如果服务注册中心全部宕机,只影响新的服务注册、已发布服务的下线。(想想为什么)
服务提供者的健康状态监测也由服务注册中心负责监测,通过长连接心跳检测服务提供者的存在,宕机则实时推送消息,实现实时故障隔离。

3 基于 ZooKeeper 的服务注册中心设计

3.1 服务订阅发布流程设计

流程设计如下图:

3.2 服务健康状态监测

基于 ZK 客户端和服务端的长连接和会话超时控制机制,来实现服务健康状态监测。

3.3 对等集群防止单点故障

ZK 使用了原子广播(恢复服务和广播服务)实现故障转移以及同步。

4 个人总结

服务注册中心要保证可靠性、安全性、可扩展性。ZK 是常用的技术。