服务发现模块
#
1. 概述#
1.1 模块名称Discovery
#
1.2 设计- 模块设计图
- 数据库设计
#
1.3 模块功能Discovery 模块赋予了 ShenYu 网关一种主动感知和响应被代理服务列表变化的能力。 通过 Discovery 网关 admin 服务的主动监听,ShenYu 网关能够及时掌握被代理服务的变动情况。 这一功能的设计具有灵活性,可以根据需要在选择器级别或插件级别进行配置。 目前,已经引入了 Discovery 功能的插件包括 TCP 插件、Divide 插件、Websocket 插件和 gRPC 插件。
#
1.4 监听模式LOCAL, ZOOKEEPER, NACOS, EUREKA, ETCD
- LOCAL 模式: 主要依靠手动维护 upstream 列表,并推送到网关;
- ZOOKEEPER 模式: 监听 ZooKeeper 中指定节点下临时节点的变化来获取数据;
- NACOS 模式:监听 Nacos 中指定服务名称下实例的变化来获取数据;
- EUREKA 模式: 监听 Eureka 中指定服务名称下实例的变化来获取数据;
- ETCD 模式:通过监听 etcd 中指定节点键值对的变化来获取数据。
#
1.5 作用范围- 插件级别:影响整个插件,所有该插件下的选择器都将默认采用当前的监听模式;
- 选择器级别:适用于当前选择器,对于当前插件下的不同选择器,可以使用不同的监听模式。
#
2. 使用#
2.1 插件级别配置#
2.1.1 服务发现配置- 在支持 Discovery 模块的插件中(当前只有 TCP 插件支持在admin控制台页面,进行插件级别 discovery 配置,其他插件可以通过 shenyu-client 进行插件级别 discovery 配置,见下文中的“配合Shenyu-client使用”), 点击
服务发现配置
, 在弹出的表单中,选择需要的监听模式, 并填写服务发现名称、注册服务器URL、注册中心配置参数等:
#
2.1.2 在选择器中使用点击
添加选择器
,在新增选择器页面中,我们发现类型
强制选择刚才配置的插件级监听模式,表示所添加的选择器也将采用相同的配置。 此时,仅需输入需要监听的监听节点
:这里的
转换处理
是指,ShenYu 规定的 upstream 注册数据是以下 JSON 格式传输,包括:- url: upstream 的 url
- protocol: upstream 的通信协议
- status: upstream 节点的状态 (0: healthy, 1: unhealthy)
- weight: 权重,计算负载均衡时使用
{ "url": "127.0.0.1::6379", "protocol": "tcp", "status": 0, "weight": 10}
- 如果您的服务别名与ShenYu定义的JSON格式不匹配,您可以在
转换处理
中进行别名映射。 例如,如上图所示,如果您需要将"status"改为"healthy",而保留其他键不变, 进行如下操作:起一个新的别名,将"status"映射为"healthy", 同时保留原有JSON键的形式。 - 进行选择器剩余的属性的配置,详情见具体插件对应的文档。
#
2.2 选择器级别配置- 在支持 Discovery 模块的插件中,点击
添加选择器
,在服务发现
标签页中, 配置类型、监听节点、服务器URL列表、注册中心参数等字段内容,配置内容仅对当前选择器有效,每次新增选择器需要重新配置。
- 对于Divide、gRPC、Websocket插件,添加选择器页面有
导入后台服务发现配置
功能, 指的是,如果服务接入 ShenYu 网关时配置了 shenyu-discovery 相关的属性(见配合shenyu-client使用),可以选择导入并沿用后台的配置,如下图我们首先点击导入后台服务发现配置
查看后台配置:
- 如果确认导入,点击后台配置弹出框中的
导入
按钮后,后台的服务发现属性将会自动填充进表单, 此时仅需要再配置监听节点:
注意:如果确认导入后台配置,后台的服务发现属性将会自动填充进表单,并沿用之前的discovery对象, 此时,在表单中修改服务发现属性将无效,依然保持后台配置。
- 若选择了 LOCAL 模式,则无需接入注册中心,用户需要手动维护 upstream 列表。
#
3. 不同模式下的配置#
3.1 local模式- local模式只支持选择器级别的配置。无需接入注册中心,用户需要手动维护 upstream 列表。这里的列表是一个可编辑表格,
点击表格每行的
编辑
按钮,可以对 upstream 的每个参数进行修改:
#
3.2 ZooKeeper/Nacos/Eureka/Etcd模式- ZooKeeper/Nacos/Eureka/Etcd模式下,支持插件级别和选择器级别的服务发现配置。
- 针对每个模式下的注册中心属性,以zookeeper为例,用户可以在
shenyu-admin
--> 基础配置 --> 字典管理 中,搜索字典名称为“zookeeper”,对默认属性对应的字典值进行修改编辑 (注意:不可修改字典类型和字典名称)。 - 这些模式下,网关会动态地从注册中心获取服务实例信息,服务实例的新增、下线、修改等,将会实时显示在 upstream 列表中。
#
4. 配合 Shenyu-client 使用#
4.1 介绍- 与 shenyu-client 配合使用需要依赖对应模式的注册中心中间件:zookeeper,nacos,etcd,eureka,这些模式可以通过Shenyu Admin实现自动感知服务的上线和下线。
- 另外,如果您使用了 local 模式,则需要手动维护upstream列表。
- shenyu-client 使用详见 shenyu-client 模块。
#
4.2 Local 模式示例#
4.2.1 使用shenyu-client- shenyu-client 默认为 Local模式,无需进行特殊的 discovery 配置,便可以自动把当前服务注册上去;
- 对于自动注册上来的服务,可以手动在页面的upstream列表进行添加、修改和删除:
#
4.2.2 不使用shenyu-client- 如果不使用shenyu-client,也可以手动在
添加选择器
的服务发现
标签页上添加、修改、删除服务信息:
- 配置选择器其他信息:
- 配置规则:
- 测试连接
curl http://localhost:9195/http/hello
hello! I'm Shenyu-Gateway System. Welcome!%
#
4.2 Zookeeper模式示例(以 Divide 插件为例)
- 添加依赖
<dependencies> <dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-discovery-zookeeper</artifactId> <version>${project.version}</version> </dependency>
<dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-spring-boot-starter-client-http</artifactId> </dependency></dependencies>
- application.yml 中添加如下配置
shenyu: discovery: enable: true type: zookeeper serverList: ${your.zookeeper.ip}:{your.zookeeper.port} registerPath: /shenyu/discovery/demo_http_common props: baseSleepTimeMilliseconds: 1000 maxRetries: 4 maxSleepTimeMilliseconds: 5000 connectionTimeoutMilliseconds: 60000 sessionTimeoutMilliseconds: 8
- 启动服务 shenyu-examples-http
- 服务注册成功,在选择器页面可以看到自动注册上来的服务实例列表:
- 用户可以点击服务实例列表中的
编辑
,对服务实例信息进行编辑(非Local模式下,URL由注册中心维护,不可手动编辑):
- 测试连接
curl http://localhost:9195/http/hello
hello! I'm Shenyu-Gateway System. Welcome!%
#
4.3 Etcd示例- 添加依赖
<dependencies> <dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-discovery-etcd</artifactId> <version>${project.version}</version> </dependency>
<dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-spring-boot-starter-client-http</artifactId> </dependency></dependencies>
- application.yml 中添加如下配置
shenyu: discovery: enable: true protocol: http:// type: etcd serverList: http://${your.etcd.host}:${your.etcd.port} registerPath: /shenyu/test/http_common props: etcdTimeout: 3000 etcdTTL: 5
- 启动服务 shenyu-examples-http,同样地,在选择器页面可以看到自动注册上来的服务实例列表,并可进行编辑:
- 测试连接
curl http://localhost:9195/http/hello
hello! I'm Shenyu-Gateway System. Welcome!%
#
4.4 Eureka示例- 添加依赖
<dependencies> <dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-discovery-eureka</artifactId> <version>${project.version}</version> </dependency>
<dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-spring-boot-starter-client-http</artifactId> </dependency></dependencies>
- application.yml 中添加如下配置(此处的
registerPath
可以理解为需要监听的服务的名称)
shenyu: discovery: enable: true protocol: http:// type: eureka serverList: http://${your.eureka.host}:${your.eureka.port}/eureka registerPath: shenyu_discovery_demo_http_common props: eurekaClientRefreshInterval: 10 eurekaClientRegistryFetchIntervalSeconds: 10
- 启动服务 shenyu-examples-http,同样地,在选择器页面可以看到自动注册上来的服务实例列表,并可进行编辑:
- 测试连接
curl http://localhost:9195/http/hello
hello! I'm Shenyu-Gateway System. Welcome!%
#
4.5 Nacos示例<dependencies> <dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-discovery-eureka</artifactId> <version>${project.version}</version> </dependency>
<dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-spring-boot-starter-client-http</artifactId> </dependency></dependencies>
- application.yml 中添加如下配置(此处的
registerPath
同样可以理解为需要监听的服务的名称)
shenyu: discovery: enable: true protocol: http:// type: nacos serverList: ${your.nacos.host}:${your.nacos.port} registerPath: shenyu_discovery_demo_http_common props: groupName: SHENYU_GROUP
- 启动服务 shenyu-examples-http,同样地,在选择器页面可以看到自动注册上来的服务实例列表,并可进行编辑:
- 测试连接
curl http://localhost:9195/http/hello
hello! I'm Shenyu-Gateway System. Welcome!%
注意:通过shenyu-client配置服务发现,本质上是配置插件级别的服务发现,同一种服务发现模式下, 实际上只有一个discovery对象(即:只能够配置同一套类型-服务器URL-服务发现参数),监听节点可以有多个。
注意:Divide插件和Grpc插件中,可以通过在application.yml文件中配置protocol来修改协议,Websocket 插件的协议默认均为ws
#
5. 注意事项- local 模式下,可以在服务列表页面上手动对 upstream 的所有参数进行修改;
- 非local模式下,可以对除URL、开始时间以外的参数进行手动修改;
- 手动修改服务实例的状态(status:open/close),权重(weight),仅对当前插件生效;
- 对于同一插件,后台通过shenyu-client配置discovery相关参数后,本质上是配置插件级别的服务发现, 控制台页面上可以手动添加选择器以配置选择器级别的服务发现,但实际上只有一个discovery对象(即:只能够配置同一套类型-服务器URL-服务发现参数),监听节点可以有多个。