1. 概述

1.1 插件名称

  • SpringCloud插件

1.2 适用场景

  • 用来将http协议 转成 Spring Cloud协议
  • 用于SpringCloud微服务灰度流量控制。

1.3 插件功能

  • http协议 转成 Spring Cloud协议

1.4 插件代码

  • 核心模块 shenyu-plugin-springcloud

  • 核心类 org.apache.shenyu.plugin.springcloud.SpringCloudPlugin

1.5 添加自哪个shenyu版本

  • 2.4.0

2. 如何使用插件

2.1 插件使用流程图

Spring Cloud插件 - 图1

2.2 导入pom

  • Eureka Registry
  1. <dependency>
  2. <groupId>org.apache.shenyu</groupId>
  3. <artifactId>shenyu-spring-boot-starter-plugin-springcloud</artifactId>
  4. <version>${project.version}</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.cloud</groupId>
  8. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  9. <version>${eureka-client.version}</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.cloud</groupId>
  13. <artifactId>spring-cloud-commons</artifactId>
  14. <version>${spring-cloud-commons.version}</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.apache.shenyu</groupId>
  18. <artifactId>shenyu-spring-boot-starter-plugin-httpclient</artifactId>
  19. <version>${project.version}</version>
  20. </dependency>
  • Nacos Registry
  1. <dependency>
  2. <groupId>org.apache.shenyu</groupId>
  3. <artifactId>shenyu-spring-boot-starter-plugin-springcloud</artifactId>
  4. <version>${project.version}</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.alibaba.cloud</groupId>
  8. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  9. <version>${nacos-discovery.version}</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.cloud</groupId>
  13. <artifactId>spring-cloud-commons</artifactId>
  14. <version>${spring-cloud-commons.version}</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.apache.shenyu</groupId>
  18. <artifactId>shenyu-spring-boot-starter-plugin-httpclient</artifactId>
  19. <version>${project.version}</version>
  20. </dependency>

2.3 在ShenYu Bootstrap配置SpringCloud

2.3.1 配置SpringCloud的Eureka服务注册发现

  1. spring:
  2. cloud:
  3. discovery:
  4. enabled: true
  5. eureka:
  6. client:
  7. enabled: true
  8. serviceUrl:
  9. defaultZone: http://localhost:8761/eureka/
  10. instance:
  11. prefer-ip-address: true

2.3.2 配置SpringCloud的Nacos服务注册发现

  1. spring:
  2. cloud:
  3. discovery:
  4. enabled: true
  5. nacos:
  6. discovery:
  7. server-addr: 127.0.0.1:8848 # Spring Cloud Alibaba Dubbo use this.
  8. enabled: true
  9. namespace: ShenyuRegisterCenter

2.3.3 配置SpringCloud插件负载均衡

注意

在ShenYu 2.5.0(包括)之后,ShenYu使用自有的shenyu-loadbalancer作为负载均衡客户端,你只需要在springcloud插件的规则配置中配置负载均衡。 如果你没有配置负载均衡,将使用默认的roundRobin算法。

在ShenYu 2.4.3(包括)之前,ShenYu使用Ribbon作为负载均衡客户端,你必须如下配置负载均衡。

  1. spring:
  2. cloud:
  3. loadbalancer:
  4. ribbon:
  5. enabled: true

2.4 启用插件

  • shenyu-admin —> 基础配置 —> 插件管理-> springCloud ,设置为开启。

Spring Cloud插件 - 图2

2.5 配置插件

2.5.1 插件配置

  • 你必须配置你的服务注册发现中心并将插件打开。

2.5.2 选择器和灰度流量配置

Spring Cloud插件 - 图3

  • 灰度路由

如果您想在springCloud插件中使用灰色路由,可以单击“灰色”按钮。

Spring Cloud插件 - 图4

  • 灰度发布可以在发布新版本应用时,自定义控制新版本应用流量比重,渐进式完成新版本应用的全量上线,最大限度地控制新版本发布带来的业务风险,降低故障带来的影响面,同时支持快速回滚。

当开启灰度是,网关的负载平衡算法将从当前节点列表中选择一个节点进行路由,并且您可以通过修改节点权重以更改负载平衡算法中节点的权重。

Spring Cloud插件 - 图5

需要注意的是,如果您的业务实例没有使用shenyu-client-springcloud的客户端进行业务注册发现,您应该在当前选择器页面上手动添加节点信息进行灰度路由。

  • 处理配置详解:

    • serviceId:serviceId。

    • gray:启用灰度路由。

      • protocol:协议默认值为’http://'。

      • upstreamUrl: 服务器节点地址。

      • weight: 服务器节点权重。

      • status:true:服务器可用,false:服务器不可用。

      • timestamp:节点的启动时间。

      • warmup:节点的预热时间,参与负载均衡计算。

2.5.3 规则配置

规则处理,即handle字段,是网关对流量完成最终匹配后,可以进行处理的操作。更多信息请参考插件管理中的 插件处理管理

  • 使用 shenyu-client-springcloud 的规则配置

Spring Cloud插件 - 图6

  • 规则配置详解:

    • timeout:设置请求超时时间。
    • loadbalance:负载均衡算法,有三个可选项:roundRobin,random,hash
  • 未使用 shenyu-client-springcloud 的规则配置

Spring Cloud插件 - 图7

  • 规则配置详解:

    • path:请求路径。
    • timeout:设置请求超时时间。

2.5.4 SpringCloud服务实例缓存配置

你能在shenyu-bootstrap.yml文件中修改如下配置:

  1. shenyu:
  2. springCloudCache:
  3. enabled: false

此配置将帮助您在每次心跳时从springcloud注册中心获取serviceInstance(通过监听springcloud心跳事件)

  • 当您使用nacos或者eureka作为注册中心时,您可以将springcloud serviceInstance缓存设置为false
  • 当您使用zookeeper或者consul作为注册中心时,您可以将springcloud serviceInstance缓存设置为true

2.6 示例

2.6.1 使用ShenYu访问SpringCloud服务

2.6.1.1 准备工作

  • 启动 EurekaNacos 服务注册发现中心, 如果你使用eureka, 启动 shenyu-examples-eureka即可
  • 启动 ShenYu Admin
  • 启动 shenyu-examples-springcloud

2.6.1.2 插件配置

  • shenyu-admin —> 基础配置 —> 插件管理-> springCloud ,设置为开启。

  • ShenYu Bootstrap配置服务注册发现中心, 请查看 [2.3 在ShenYu Bootstrap配置SpringCloud](#2.3 在ShenYu Bootstrap配置SpringCloud)

2.6.1.3 选择器配置

Spring Cloud插件 - 图8

如果你想使用注册到ShenYu的灰度流量,你必须配置灰度路由。

Spring Cloud插件 - 图9

2.6.1.4 规则配置

如果你使用shenyu-client-springcloud注册服务到ShenYu,你可以不用配置规则,如果你想改变规则,请查看[2.5.3 规则配置](#2.5.3 规则配置)

2.6.1.5 请求服务并且验证结果

Spring Cloud插件 - 图10

2.6.2 使用ShenYu访问未注册到ShenYu的SpringCloud服务

2.6.2.1 准备工作

  • 启动 EurekaNacos 服务注册发现中心, 如果你使用eureka, 启动 shenyu-examples-eureka即可
  • 启动 ShenYu Admin
  • 启动 shenyu-examples-springcloud

2.6.2.2 插件配置

  • shenyu-admin —> 基础配置 —> 插件管理-> springCloud ,设置为开启。

  • ShenYu Bootstrap配置服务注册发现中心, 请查看 [2.3 在ShenYu Bootstrap配置SpringCloud](#2.3 在ShenYu Bootstrap配置SpringCloud)

2.6.2.3 选择器配置

Spring Cloud插件 - 图11

如果你想使用未注册到ShenYu的灰度流量,你必须配置灰度流量相关的配置

Spring Cloud插件 - 图12

2.6.2.4 规则配置

Spring Cloud插件 - 图13

你必须在规则配置中配置path字段,path字段为你的服务uri,例如:/springcloud/new/feature/gateway/not, timeout为你的服务允许的超时时间。

2.6.2.5 通过配置访问未注册的服务

2.6.2.5.1 在请求头使用 rpc_type字段进行访问
  1. ### shengyu getway proxy not support
  2. POST http://localhost:9195/springcloud/new/feature/gateway/not
  3. Accept: application/json
  4. Content-Type: application/json
  5. rpc_type: springCloud
2.6.2.5.2 在ShenYuAdmin 添加元信息

Spring Cloud插件 - 图14

2.6.2.6 请求服务并且验证结果

Spring Cloud插件 - 图15

3. 如何禁用插件

  • shenyu-admin —> 基础配置 —> 插件管理-> springCloud ,设置为关闭。