客户端注册设计
应用客户端接入是指将你的微服务接入到Apache ShenYu
网关,当前支持Http
、 Dubbo
、 Spring Cloud
、 gRPC
、 Motan
、 Sofa
、 Tars
等协议的接入。
将应用客户端接入到Apache ShenYu
网关是通过注册中心来实现的,涉及到客户端注册和服务端同步数据。注册中心支持Http
、Zookeeper
、Etcd
、Consul
和Nacos
。
客户端接入的相关配置请参考用户文档中的 客户端接入配置 。
#
设计原理#
术语说明为了便于读者理解,避免产生歧义,本节的图、文中所提到的"注册中心客户端","注册中心服务端","register-center-client","register-center-server"等 均指的是shenyu-register-client和shenyu-register-client-server,也就是讲的都是由shenyu所包装的一些模块和类。 读者在理解时不要和实际注册中心的客户端、注册中心服务概念搞混淆了(例如:nacos-client、nacos-server)
#
整体流程1.微服务应用启动时,会通过指定的注册中心客户端将注册信息写入到注册中心中(例如:nacos)
2.shenyu-admin启动会从指定的注册中心中订阅注册信息,放入Disruptor中
3.借助shenyu的数据同步机制,将注册信息实时同步给shenyu-gateway
数据同步机制设计可参考 数据同步机制设计
http服务注册比较特殊,直接由shenyu-admin完成
#
注册中心客户端在你的微服务配置中声明注册中心客户端类型,如Http
或Zookeeper
。
应用程序启动时使用SPI
方式加载并初始化对应注册中心客户端,通过实现Spring Bean
相关的后置处理器接口,在其中获取需要进行注册的服务接口信息,将获取的信息放入Disruptor
中。
注册中心客户端从Disruptor
中读取数据,并将接口信息最终注册到shenyu-admin
,Disruptor
在其中起数据与操作解耦的作用,利于扩展。
#
注册中心服务端在shenyu-admin
配置中声明注册中心服务端类型,如Http
或Zookeeper
。当shenyu-admin
启动时,读取配置类型,加载并初始化对应的注册中心服务端,注册中心服务端收到shenyu-client
注册的接口信息后,将其放入Disruptor
中,然后会触发注册处理逻辑,将服务接口信息更新并发布同步事件。
Disruptor
在其中起到数据与操作解耦,利于扩展。如果注册请求过多,导致注册异常,也有数据缓冲作用。
#
Http注册原理Http
服务注册原理较为简单,在shenyu-client
启动后,会调用shenyu-admin
的相关服务注册接口,上传数据进行注册。
shenyu-admin
收到请求后进行数据更新和数据同步事件发布,将接口信息同步到Apache ShenYu
网关。
#
Zookeeper注册原理Zookeeper
存储结构如下:
shenyu ├──regsiter ├ ├──metadata ├ ├ ├──${rpcType} ├ ├ ├ ├────${contextPath} ├ ├ ├ ├──${ruleName} : save metadata data of MetaDataRegisterDTO ├ ├──uri ├ ├ ├──${rpcType} ├ ├ ├ ├────${contextPath} ├ ├ ├ ├──${ip:port} : save uri data of URIRegisterDTO ├ ├ ├ ├──${ip:port}
shenyu-client
启动时,将服务接口信息(MetaDataRegisterDTO/URIRegisterDTO
)写到如上的zookeeper
节点中。
shenyu-admin
使用Zookeeper
的Watch
机制,对数据的更新和删除等事件进行监听,数据变更后触发对应的注册处理逻辑。在收到MetaDataRegisterDTO
节点变更后,触发selector
和rule
的数据变更和数据同步事件发布。收到URIRegisterDTO
节点变更后,触发selector
的upstream
的更新和数据同步事件发布。
#
Etcd注册原理Etcd
的键值存储结构如下:
shenyu ├──regsiter ├ ├──metadata ├ ├ ├──${rpcType} ├ ├ ├ ├────${contextPath} ├ ├ ├ ├──${ruleName} : save metadata data of MetaDataRegisterDTO ├ ├──uri ├ ├ ├──${rpcType} ├ ├ ├ ├────${contextPath} ├ ├ ├ ├──${ip:port} : save uri data of URIRegisterDTO ├ ├ ├ ├──${ip:port}
shenyu-client
启动时,将服务接口信息(MetaDataRegisterDTO/URIRegisterDTO
)以Ephemeral
方式写到如上的Etcd
节点中。
shenyu-admin
使用Etcd
的Watch
机制,对数据的更新和删除等事件进行监听,数据变更后触发对应的注册处理逻辑。在收到MetaDataRegisterDTO
节点变更后,触发selector
和rule
的数据变更和数据同步事件发布。收到URIRegisterDTO
节点变更后,触发selector
的upstream
的更新和数据同步事件发布。
#
Consul注册原理Consul
的Metadata
和URI
分两部分存储,URIRegisterDTO
随着服务注册记录在服务的metadata
里,服务下线时随着服务节点一起消失。
Consul
的MetaDataRegisterDTO
存在Key/Value
里,键值存储结构如下:
shenyu ├──regsiter ├ ├──metadata ├ ├ ├──${rpcType} ├ ├ ├ ├────${contextPath} ├ ├ ├ ├──${ruleName} : save metadata data of MetaDataRegisterDTO
shenyu-client
启动时,将服务接口信息(MetaDataRegisterDTO/URIRegisterDTO
)分别放在ServiceInstance
的Metadata
(URIRegisterDTO
)和KeyValue
(MetaDataRegisterDTO
),按照上述方式进行存储。
shenyu-admin
通过监听Catalog
和KeyValue
的index
的变化,来感知数据的更新和删除,数据变更后触发对应的注册处理逻辑。在收到MetaDataRegisterDTO
节点变更后,触发selector
和rule
的数据变更和数据同步事件发布。收到URIRegisterDTO
节点变更后,触发selector
的upstream
的更新和数据同步事件发布。
#
Nacos注册原理Nacos
注册分为两部分:URI
和 Metadata
。URI
使用实例注册方式,在服务异常的情况下,相关URI
数据节点会自动进行删除,并发送事件到订阅端,订阅端进行相关的下线处理。Metadata
使用配置注册方式,没有相关上下线操作,当有URI
实例注册时,会相应的发布Metadata
配置,订阅端监听数据变化,进行更新处理。
URI
实例注册命令规则如下:
shenyu.register.service.${rpcType}
初始监听所有的RpcType
节点,其下的${contextPath}
实例会对应注册到其下,根据IP
和Port
进行区分,并携带其对应的contextPath
信息。URI
实例上下线之后,触发selector
的upstream
的更新和数据同步事件发布。
URI
实例上线时,会发布对应的 Metadata
数据,其节点名称命令规则如下:
shenyu.register.service.${rpcType}.${contextPath}
订阅端会对所有的Metadata
配置继续监听,当初次订阅和配置更新后,触发selector
和rule
的数据变更和数据同步事件发布。
#
SPI扩展应用微服务通过shenyu-client接入注册时使用到的一些类
SPI 名称 | 详细说明 |
---|---|
ShenyuClientRegisterRepository | ShenYu网关客户端接入注册服务资源 |
已知实现类 | 详细说明 |
---|---|
HttpClientRegisterRepository | 基于Http请求的实现 |
ZookeeperClientRegisterRepository | 基于Zookeeper注册的实现 |
EtcdClientRegisterRepository | 基于Etcd注册的实现 |
ConsulClientRegisterRepository | 基于Consul注册的实现 |
NacosClientRegisterRepository | 基于Nacos注册的实现 |
shenyu-admin从注册中心中订阅注册信息时用到的类
SPI 名称 | 详细说明 |
---|---|
ShenyuClientServerRegisterRepository | ShenYu网关客户端注册的后台服务资源 |
已知实现类 | 详细说明 |
---|---|
ShenyuHttpRegistryController | 使用Http服务接口来处理客户端注册请求 |
ZookeeperClientServerRegisterRepository | 使用Zookeeper来处理客户端注册节点 |
EtcdClientServerRegisterRepository | 使用Etcd来处理客户端注册节点 |
ConsulClientServerRegisterRepository | 使用Consul来处理客户端注册节点 |
NacosClientServerRegisterRepository | 使用Nacos来处理客户端注册节点 |