ZooKeeper(注:ZooKeeper是著名Hadoop的一个子项目,旨在解决大规模分布式应用场景下,服务协调同步(Coordinate Service)的问题;它可以为同在一个分布式系统中的其他服务提供:统一命名服务、配置管理、分布式锁服务、集群管理等功能)是个伟大的开源项目,它很成熟,有相当大的社区来支持它的发展,而且在生产环境得到了广泛的使用。
按照Apache官网的描述是:
ZooKeeper is a centralized service for maintaining configuration information,naming,providing distributed synchronization,and providing group services.
参照官网的定义,它能够做:
1. 作为配置信息的存储的中心服务器
2. 命名服务
3. 分布式的协调
4. Mater选举等
在定义中特别提到了命名服务。Zookeeper作为服务注册与发现的解决方案,它有如下优点:
1.它提供的简单API
2. 已有互联网公司(例如:Pinterest,Airbnb)使用它来进行服务注册与发现
3. 支持多语言的客户端
4. 通过Watcher机制实现Push模型,服务注册信息的变更能够及时通知服务消费方
以上zk提供的功能已经基本满足作为注册中心的基础功能。
分布式(为服务架构中的主要角色)
1、注册中心 :保存所有服务的名字,服务提供者的ip列表,服务消费者的IP列表
2、服务提供者: 提供跨进程服务
3、服务消费者: 寻找到指定命名的服务并消费。
服务提供者通过将自己的服务发布到注册中心,消费者订阅注册中心的消息获取服务列表同时更新自己的服务列表。这样就完成了服务发现和服务上下线的功能。
zk作为注册中心
简单来讲,zookeeper可以充当一个服务注册表(Service Registry),让多个服务提供者形成一个集群,让服务消费者通过服务注册表获取具体的服务访问地址(ip+端口)去访问具体的服务提供者。
在zookeeper中,进行服务注册,实际上就是在zookeeper中创建了一个znode节点,该节点存储了该服务的IP、端口、调用方式(协议、序列化方式)等。该节点承担着最重要的职责,它由服务提供者(发布服务时)创建,以供服务消费者获取节点中的信息,从而定位到服务提供者真正网络拓扑位置以及得知如何调用。RPC服务注册、发现过程简述如下:
服务提供者启动时,会将其服务名称,ip地址注册到配置中心。
服务消费者在第一次调用服务时,会通过注册中心找到相应的服务的IP地址列表,并缓存到本地,以供后续使用。当消费者调用服务时,不会再去请求注册中心,而是直接通过负载均衡算法从IP列表中取一个服务提供者的服务器调用服务。
当服务提供者的某台服务器宕机或下线时,相应的ip会从服务提供者IP列表中移除。同时,注册中心会将新的服务IP地址列表发送给服务消费者机器,缓存在消费者本机。
当某个服务的所有服务器都下线了,那么这个服务也就下线了。
同样,当服务提供者的某台服务器上线时,注册中心会将新的服务IP地址列表发送给服务消费者机器,缓存在消费者本机。
服务提供方可以根据服务消费者的数量来作为服务下线的依据。
zookeeper提供了“心跳检测”功能,它会定时向各个服务提供者发送一个请求(实际上建立的是一个 socket 长连接),如果长期没有响应,服务中心就认为该服务提供者已经“挂了”,并将其剔除,比如100.19.20.02这台机器如果宕机了,那么zookeeper上的路径就会只剩/HelloWorldService/1.0.0/100.19.20.01:16888。
服务消费者会去监听相应路径(/HelloWorldService/1.0.0),一旦路径上的数据有任务变化(增加或减少),zookeeper都会通知服务消费方服务提供者地址列表已经发生改变,从而进行更新。
更为重要的是zookeeper 与生俱来的容错容灾能力(比如leader选举),可以确保服务注册表的高可用性。