客户端注册设计
应用客户端接入是指将你的微服务接入到Apache ShenYu网关,当前支持Http、 Dubbo、 Spring Cloud、 gRPC、 Motan、 Sofa、 Tars等协议的接入。
将应用客户端接入到Apache ShenYu网关是通过注册中心来实现的,涉及到客户端注册和服务端同步数据。注册中心支持Http、Zookeeper、Etcd、Consul和Nacos。
客户端接入的相关配置请参考用户文档中的 客户端接入配置 。
设计原理
注册中心客户端

在你的微服务配置中声明注册中心客户端类型,如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