微服务之注册中心

本文深入探讨了微服务架构下的注册中心原理和实现方式,包括注册中心的API、集群部署、目录存储、服务健康状态检测、服务状态变更通知及白名单机制。对比了注册中心与传统DNS服务发现的差异,并详细介绍了服务发布和引用的实践,如XML配置方式。此外,还分析了主流的注册中心解决方案,如Eureka和Consul,并讨论了注册中心的高可用性和数据一致性策略。
摘要由CSDN通过智能技术生成

相关文章

服务描述   https://blog.csdn.net/haponchang/article/details/90746408

注册中心   https://blog.csdn.net/haponchang/article/details/93467008

服务框架   https://blog.csdn.net/haponchang/article/details/93468031

服务监控   https://blog.csdn.net/haponchang/article/details/93469050

服务追踪   https://blog.csdn.net/haponchang/article/details/93486963

服务治理   https://blog.csdn.net/haponchang/article/details/93488503


目录

注册中心原理

注册中心实现方式

1. 注册中心 API

2. 集群部署

3. 目录存储

4. 服务健康状态检测

5. 服务状态变更通知

6. 白名单机制

注册中心来实现服务发现与传统的 DNS 实现服务发现有什么不同

服务发布和引用的实践

XML 配置方式的服务发布和引用流程

注册中心选型

主流的服务注册与发现的解决方案

对比分析

注册中心的高可用性和数据一致性

1. 高可用性

2. 数据一致性


在分布式系统里的注册中心。原理是将部署服务的机器地址记录到注册中心,服务消费者在有需求的时候,只需要查询注册中心,输入提供的服务名,就可以得到地址,从而发起调用。

注册中心原理

在微服务架构下,主要有三种角色:服务提供者(RPC Server)、服务消费者(RPC Client)和服务注册中心(Registry),三者的交互关系请看下面这张图,我来简单解释一下。

RPC Server 提供服务,在启动时,根据服务发布文件 server.xml 中的配置的信息,向 Registry 注册自身服务,并向 Registry 定期发送心跳汇报存活状态。

RPC Client 调用服务,在启动时,根据服务引用文件 client.xml 中配置的信息,向 Registry 订阅服务,把 Registry 返回的服务节点列表缓存在本地内存中,并与 RPC Sever 建立连接。

当 RPC Server 节点发生变更时,Registry 会同步变更,RPC Client 感知后会刷新本地内存中缓存的服务节点列表。

RPC Client 从本地缓存的服务节点列表中,基于负载均衡算法选择一台 RPC Sever 发起调用。

 

注册中心实现方式

1. 注册中心 API

根据注册中心原理的描述,注册中心必须提供以下最基本的 API,例如:

服务注册接口:服务提供者通过调用服务注册接口来完成服务注册。

服务注册流程主要有下面几个步骤:

首先查看要注册的节点是否在白名单内?如果不在就抛出异常,在的话继续下一步。

其次要查看注册的 Cluster(服务的接口名)是否存在?如果不存在就抛出异常,存在的话继续下一步。

然后要检查 Service(服务的分组)是否存在?如果不存在则抛出异常,存在的话继续下一步。

最后将节点信息添加到对应的 Service 和 Cluster 下面的存储中。

服务反注册接口:服务提供者通过调用服务反注册接口来完成服务注销。

节点反注册流程主要包含下面几个步骤:

查看 Service(服务的分组)是否存在,不存在就抛出异常,存在就继续下一步。

查看 Cluster(服务的接口名)是否存在,不存在就抛出异常,存在就继续下一步。

删除存储中 Service 和 Cluster 下对应的节点信息。

更新 Cluster 的 sign 值。

心跳汇报接口:服务提供者通过调用心跳汇报接口完成节点存活状态上报。

服务订阅接口:服务消费者通过调用服务订阅接口完成服务订阅,获取可用的服务提供者节点列表。

服务变更查询接口:服务消费者通过调用服务变更查询接口,获取最新的可用服务节点列表。

除此之外,为了便于管理,注册中心还必须提供一些后台管理的 API,例如:

服务查询接口:查询注册中心当前注册了哪些服务信息。

服务消费者查询节点信息主要分为下面几个步骤:

首先从 localcache(本机内存)中查找,如果没有就继续下一步。这里为什么服务消费者要把服务信息存在本机内存呢?主要是因为服务节点信息并不总是时刻变化的,并不需要每一次服务调用都要调用注册中心获取最新的节点信息,只需要在本机内存中保留最新的服务提供者的节点列表就可以。

接着从 snapshot(本地快照)中查找,如果没有就继续下一步。这里为什么服务消费者要在本地磁盘存储一份服务提供者的节点信息的快照呢?这是因为服务消费者同注册中心之间的网络不一定总是可靠的,服务消费者重启时,本机内存中还不存在服务提供者的节点信息,如果此时调用注册中心失败,那么服务消费者就拿不到服务节点信息了,也就没法调用了。本地快照就是为了防止这种情况的发生,即使服务消费者重启后请求注册中心失败,依然可以读取本地快照,获取到服务节点信息。

服务修改接口:修改注册中心中某一服务的信息。

服务消费者如何订阅服务提供者的变更主要分为下面几个步骤:

服务消费者从注册中心获取了服务的信息后,就订阅了服务的变化,会在本地保留 Cluster 的 sign 值。

服务消费者每隔一段时间,调用 getSign() 函数,从注册中心获取服务端该 Cluster 的 sign 值,并与本地保留的 sign 值做对比,如果不一致,就从服务端拉取新的节点信息,并更新 localcache 和 snapshot。

2. 集群部署

注册中心作为服务提供者和服务消费者之间沟通的桥梁,它的重要性不言而喻。所以注册中心一般都是采用集群部署来保证高可用性,并通过分布式一致性协议来确保集群中不同节点之间的数据保持一致。

以开源注册中心 ZooKeeper 为例,ZooKeeper 集群中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值