软件企业网站模板,虚拟空间官网,国内十大网站建设,免费自助建站哪家好这是小卷对分布式系统架构学习的第8篇文章#xff0c;在写第2篇文章已经讲过服务发现了#xff0c;现在就从组件工作原理入手#xff0c;讲讲注册中心 以下是面试题#xff1a; 某团面试官#xff1a;你来说说怎么设计一个注册中心#xff1f; 我#xff1a;注册中心嘛在写第2篇文章已经讲过服务发现了现在就从组件工作原理入手讲讲注册中心 以下是面试题 某团面试官你来说说怎么设计一个注册中心 我注册中心嘛就要有服务发现的功能服务启动后把自己的信息注册上去然后消费端可以拉取生产者的信息嘛然后就能调用了 某团面试官那你说说分布式系统中注册中心怎么选型呢Eureka、Zookpeer、Nacos、Etcd这些中间件你实际用的时候怎么考虑的 我就用Nacos啊公司里大家都用这个 面试官… 面试官我知道了今天的面试就到这吧… 1.注册中心的功能
设计注册中心时先来思考下面几个问题
服务如何注册consumer如何知道provider注册中心怎么做到高可用服务发现怎么做的 要想实现一个服务注册中心必须具备以下功能
服务注册provider在注册中心完成注册服务注销服务提供者需在注册中心完成服务下线心跳检测检查服务提供者的健康状态服务查询消费者获取服务列表消息服务变更查询服务发生变更时消费者通过查询变更获取最新服务列表服务高可用
2.Zookeeper工作原理
我们还是选择一个比较活跃的中间件来展开学习注册中心的工作原理。
Zookeeper的文档官网Apache ZooKeeper
官网解释Zookeeper名字的由来是因为分布式系统就像个动物园Zoo目前国内Dubbo场景下大多选用Zookeeper作为注册中心。官方解释它使用一个具有层次结构的命名空间类似文件系统用斜杠“/”分隔路径元素根节点是“/”表示无父节点。通过znodesZooKeeper节点存储数据如果znode有子节点则无法删除该znode。这些数据可以被多个应用程序共享并提供高可用性和一致性。 2.1简单API
ZooKeeper的一个设计目标是提供一个非常简单的编程接口这些接口故意设计得十分简单。然而借此接口您可以实现更高阶的操作如同步原语、组成员管理、所有权等。编程接口支持以下操作
create在树中的某个位置创建一个节点。delete删除一个节点。exists测试某个位置是否存在节点。get data读取节点中的数据。set data向节点写入数据。get children获取节点的子节点列表。sync等待数据传播。
2.2 服务注册
客户端注册当一个服务提供者实例启动时它会向Zookeeper注册到某一路径上。
服务实例通过创建一个znode通常是临时节点来注册自己。这个znode包含服务实例的元数据注册路径为{service}/{version}/{ip:port}
示例将我们的HelloService部署启动后Zookeeper上会创建一个目录
/HelloWorldService/1.0.0/192.168.1.100:8080
下面简述服务注册的过程
服务提供者启动时会将其服务名称ip地址注册到注册中心服务消费者在第一次调用服务时会通过注册中心找到相应的服务的IP地址列表并缓存到本地。当消费者调用服务时不再请求注册中心而是直接通过负载均衡算法从IP列表中取一个服务提供者的服务器调用服务当服务提供者的某台服务器宕机或下线时相应的ip会从服务提供者IP列表中移除。同时注册中心会将新的服务IP地址列表发送给消费者机器缓存在消费者本机当某个服务的所有服务器都下线了那么这个服务也就下线了同样当服务提供者的某台服务器上线时注册中心会将新的服务IP地址列表发送给服务消费者机器缓存在消费者本机服务提供方可以根据服务消费者的数量来作为服务下线的依据
客户端代码示例
ZooKeeper zk new ZooKeeper(localhost:2181, 3000, null);
String path /services/myService;
zk.create(path, 192.168.1.100:8080.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);2.3 心跳检测机制
服务的某台机器下线时Zookeeper是如何感知到
zookeeper提供了“心跳检测”功能它会定时向各个服务提供者发送一个请求实际上建立的是一个 socket 长连接如果长期没有响应服务中心就认为该服务提供者已经“挂了”并将其删除。
2.4 服务发现
有关服务发现的概念可以看我之前的文章分布式系统架构2服务发现
上面说了有新的服务提供者出现时注册中心是怎么将这些变化通知给消费者客户端的呢
有2种方式
主动Pull方式消费者定期从注册中心拉取最新的服务提供者列表并更新本地缓存。如Eureka发布-订阅模式消费者实时监听服务更新状态采用的是监听器回调机制。Zookeeper用的是发布-订阅模式客户端在服务节点设置监视器Watcher。当节点发生变化如服务实例上线或下线时Zookeeper会通知所有设置了监视器的客户端
2.5 存在问题
Zookeeper作为注册中心不合适缺少可用性。
zk会出现这样一种情况当master节点因为网络故障与其他节点失去联系时剩余节点会重新进行leader选举。问题在于选举leader的时间太长30 ~ 120s, 且选举期间整个zk集群都是不可用的这就导致在选举期间注册服务瘫痪。
而作为注册中心可用性的要求高于一致性
2.6 Zookeeper总结
Zookeeper的心跳检测可以自动探测服务提供者机器的宕机或下线Zookeeper的Watch机制可以将变更的注册列表推给服务消费者Zookeeper是CP模型不太适合作为注册中心。