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系统客户端分为ProviderConsumer,在设计上,两者的区别为是否注册自身。若服务不注册,则在系统中只能做为Consumer, 否则既可作为Provider,也可作为Consumer。在客户端启动后,客户端便会轮询进行长连接查询请求,已达到当其他服务状态发生变更时,被及时通知的目的;另外,Provider也会定时发送心跳,告知注册中心自身处于健康状态。整体流程如下图:

可用性考虑

场景 影响 降级 原因
某个数据中心下线 数据库主库不可用 将数据库域名指向备份数据库
注册中心部分实例下线 无影响 注册中心多实例运行,若有实例下线,其他实例依旧可运行,同时重新选举maseter清理过期实例
注册中心所有实例下线 注册中心不可用,客户端数据无法更新,依赖本地缓存快照运行 客户端内有缓存换照,保存最近的所有应用数据
数据库完全宕机 注册中心不可用,客户端数据无法更新,依赖本地缓存快照运行 客户端内有缓存换照,保存最近的所有应用数据