Skip to main content
Version: 2.4.0

客户端接入原理

应用客户端接入是指将你的微服务接入到Apache ShenYu网关,当前支持HttpDubboSpring CloudgRPCMotanSofaTars等协议的接入。

将应用客户端接入到Apache ShenYu网关是通过注册中心来实现的,涉及到客户端注册和服务端同步数据。注册中心支持HttpZookeeperEtcdConsulNacos

客户端接入的相关配置请参考用户文档中的 客户端接入配置

设计原理#

注册中心客户端#

在你的微服务配置中声明注册中心客户端类型,如HttpZookeeper。 应用程序启动时使用SPI方式加载并初始化对应注册中心客户端,通过实现Spring Bean相关的后置处理器接口,在其中获取需要进行注册的服务接口信息,将获取的信息放入Disruptor中。

注册中心客户端从Disruptor中读取数据,并将接口信息注册到shenyu-adminDisruptor在其中起数据与操作解耦的作用,利于扩展。

注册中心服务端#

shenyu-admin配置中声明注册中心服务端类型,如HttpZookeeper。当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使用ZookeeperWatch机制,对数据的更新和删除等事件进行监听,数据变更后触发对应的注册处理逻辑。在收到MetaDataRegisterDTO节点变更后,触发selectorrule的数据变更和数据同步事件发布。收到URIRegisterDTO节点变更后,触发selectorupstream的更新和数据同步事件发布。

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使用EtcdWatch机制,对数据的更新和删除等事件进行监听,数据变更后触发对应的注册处理逻辑。在收到MetaDataRegisterDTO节点变更后,触发selectorrule的数据变更和数据同步事件发布。收到URIRegisterDTO节点变更后,触发selectorupstream的更新和数据同步事件发布。

Consul注册原理#

ConsulMetadataURI分两部分存储,URIRegisterDTO随着服务注册记录在服务的metadata里,服务下线时随着服务节点一起消失。

ConsulMetaDataRegisterDTO存在Key/Value里,键值存储结构如下:

shenyu   ├──regsiter   ├    ├──metadata   ├    ├     ├──${rpcType}   ├    ├     ├      ├────${contextPath}   ├    ├     ├               ├──${ruleName} : save metadata data of MetaDataRegisterDTO

shenyu-client启动时,将服务接口信息(MetaDataRegisterDTO/URIRegisterDTO)分别放在ServiceInstanceMetadataURIRegisterDTO)和KeyValueMetaDataRegisterDTO),按照上述方式进行存储。

shenyu-admin通过监听CatalogKeyValueindex的变化,来感知数据的更新和删除,数据变更后触发对应的注册处理逻辑。在收到MetaDataRegisterDTO节点变更后,触发selectorrule的数据变更和数据同步事件发布。收到URIRegisterDTO节点变更后,触发selectorupstream的更新和数据同步事件发布。

Nacos注册原理#

Nacos注册分为两部分:URIMetadataURI 使用实例注册方式,在服务异常的情况下,相关URI数据节点会自动进行删除,并发送事件到订阅端,订阅端进行相关的下线处理。Metadata 使用配置注册方式,没有相关上下线操作,当有URI实例注册时,会相应的发布Metadata配置,订阅端监听数据变化,进行更新处理。

URI实例注册命令规则如下:

shenyu.register.service.${rpcType}

初始监听所有的RpcType节点,其下的${contextPath}实例会对应注册到其下,根据IPPort进行区分,并携带其对应的contextPath信息。URI 实例上下线之后,触发selectorupstream的更新和数据同步事件发布。

URI 实例上线时,会发布对应的 Metadata 数据,其节点名称命令规则如下:

shenyu.register.service.${rpcType}.${contextPath}

订阅端会对所有的Metadata配置继续监听,当初次订阅和配置更新后,触发selectorrule的数据变更和数据同步事件发布。

SPI扩展#

SPI 名称详细说明
ShenyuClientRegisterRepositoryShenYu网关客户端接入注册服务资源
已知实现类详细说明
HttpClientRegisterRepository基于Http请求的实现
ZookeeperClientRegisterRepository基于Zookeeper注册的实现
EtcdClientRegisterRepository基于Etcd注册的实现
ConsulClientRegisterRepository基于Consul注册的实现
NacosClientRegisterRepository基于Nacos注册的实现
SPI 名称详细说明
ShenyuServerRegisterRepositoryShenYu网关客户端注册的后台服务资源
已知实现类详细说明
ShenyuHttpRegistryController使用Http服务接口来处理客户端注册请求
ZookeeperServerRegisterRepository使用Zookeeper来处理客户端注册节点
EtcdServerRegisterRepository使用Etcd来处理客户端注册节点
ConsulServerRegisterRepository使用Consul来处理客户端注册节点
NacosServerRegisterRepository使用Nacos来处理客户端注册节点