1.Radar架构设计 - SpringCloud/spring-cloud-radar GitHub Wiki
总体设计
1、名词解释
- App:应用,是指实现某些功能的集合,这是一个抽象的概念,比如某个web服务可以称为一个应用.canAppId 是指应用的外部唯一标识,canAppId和appName一一对应。都必须唯一。
- Cluster:集群,是指应用在某个环境下的分组,比如fat测试环境,测试有的时候需要部署多套子环境,这时子环境可以当做一个集群分组。
- Instance:实例,是指某个App在某个集群下的实例,比如一个应用可以部署多个统一对外提供的服务,每一个具体的应用称为一个实例。canInstanceId是应用实例的唯一标识。
2、概要设计
- Radar注册中心整体分为三个部分,portal,注册中心,客户端。
- portal用户管理各种应用和应用实例。
- 注册中心,用来相应客户端提供的各种服务。
- 客户端,客户端分为两种,一种是服务提供端(Provider),一种是消费端(Consumer)。服务提供端用来对外提供服务,消费端调用provider提供的服务。但是一个provider 也可以消费其他的provider提供的服务。
3、交互设计
服务端设计
下图是Radar架构模块的概览
1、Portal
- 提供Web界面供用户管理应用和实例信息。
- portal界面直接操作数据库,不调用其他服务接口。
2、注册中心
- 用来给客户端和其他第三方系统提供服务接口。
- 注册中心和portal 界面公用同一份数据,不依赖其他接口。
- 每个注册中心实例都有一个定时器,定时加载应用和实例变更信息。
- 注册中心集群中有个清理定时器。在注册中心集群中,会自动选举一个定时器,定时清理各种异常退出的超时的实例。
3、客户端
- 客户端通过调用注册中心提供的接口,完成注册,上下线,发送心跳,拉入拉出等操作。
- 客户端需要配置注册中心的地址可以配置一个或者多个,多个以逗号隔开。
- 客户端隐式埋点cat。当客户端宿主系统接入cat时,可以查看radar调用情况。如果没有不会有任何影响。
- 客户端默认每5秒向注册中心发送心跳,超过13秒无心跳会下线,如果超过5个小时无心跳,实例会被删除。
- 客户端设计请看 客户端设计
4、通知机制
应用和应用实例信息的变化有三种方式:
- 用户通过portal界面对应用和应用实例进行操作会产生变更信息
- 客户端注册到radar注册中心会产生应用实例变更信息。
- 第三方外部接口访问radar注册中心接口会产生实例变更信息。
以上三种方式都会产生应用实例信息的变更,任何信息的变更都会产生一条对应appid的变更信息,同时更新应用的版本号,每个注册中心启动时会同步系统中所有的应用信息,然后不断监控是否有新的变更信息产生,如果有则将变更信息同步到broker内存中。
Radar客户端通过长连接实现快速通知。Consumer客户端不断地向注册中心发送带有应用版本号的长连接请求,此时若注册中心缓存内没有更高版本号的数据,则保持长连接。如有变更及时响应客户端的长连接请求,完成更新通知,客户端完成更新后,发起下一轮请求。
5、状态逻辑
- Radar系统默认推送给客户端的都是
在线
的实例。注意最终拉入表示在线
,最终拉出表示下线
。 - Radar系统的实例最终
在线
状态控制通过基本槽位
(目前为心跳、发布、应用三个普通槽位)加上超级槽位
共同决定。当超级槽位
为1时,实例状态为拉入,也叫在线;当超级槽位
为-1时,实例状态为拉出,也叫下线;当超级槽位
为0时,实例状态由基本槽位直接决定。归纳入下表。
心跳槽位 | 发布槽位 | 应用槽位 | 超级槽位 | 实例最终状态 |
---|---|---|---|---|
任意 | 任意 | 任意 | -1 | 拉出 |
任意 | 任意 | 任意 | 1 | 拉入 |
拉入 | 拉入 | 拉入 | 0 | 拉入 |
拉出 | 任意 | 任意 | 0 | 拉出 |
任意 | 拉出 | 任意 | 0 | 拉出 |
任意 | 任意 | 拉出 | 0 | 拉出 |
客户端设计
Radar系统客户端分为Provider
和Consumer
,在设计上,两者的区别为是否注册自身。若服务不注册,则在系统中只能做为Consumer, 否则既可作为Provider
,也可作为Consumer
。在客户端启动后,客户端便会轮询进行长连接查询请求,已达到当其他服务状态发生变更时,被及时通知的目的;另外,Provider
也会定时发送心跳,告知注册中心自身处于健康状态。整体流程如下图:
可用性考虑
场景 | 影响 | 降级 | 原因 |
---|---|---|---|
某个数据中心下线 | 数据库主库不可用 | 将数据库域名指向备份数据库 | |
注册中心部分实例下线 | 无影响 | 注册中心多实例运行,若有实例下线,其他实例依旧可运行,同时重新选举maseter清理过期实例 | |
注册中心所有实例下线 | 注册中心不可用,客户端数据无法更新,依赖本地缓存快照运行 | 客户端内有缓存换照,保存最近的所有应用数据 | |
数据库完全宕机 | 注册中心不可用,客户端数据无法更新,依赖本地缓存快照运行 | 客户端内有缓存换照,保存最近的所有应用数据 |