相关文章
服务描述 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
目录
注册中心来实现服务发现与传统的 DNS 实现服务发现有什么不同
在分布式系统里的注册中心。原理是将部署服务的机器地址记录到注册中心,服务消费者在有需求的时候,只需要查询注册中心,输入提供的服务名,就可以得到地址,从而发起调用。
注册中心原理
在微服务架构下,主要有三种角色:服务提供者(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。<