1. 概述

1.1 插件名称

  • Sentinel插件

1.2 适用场景

  • sentinel插件是网关用来对流量进行限流与熔断的可选选择之一。
  • sentinel插件为网关熔断限流提供能力。

1.3 插件功能

  • 流量控制
  • 请求熔断和服务降级

1.4 插件代码

  • 核心包 shenyu-plugin-sentinel.

  • 核心类 org.apache.shenyu.plugin.sentinel.SentinelPlugin

1.5 添加自哪个shenyu版本

  • 2.4.0

2. 如何使用插件

2.1 插件使用流程图

Sentinel插件 - 图1

2.2 导入pom

  • 在网关的 pom.xml 文件中添加 sentinel 依赖。
  1. <!-- apache shenyu sentinel plugin start-->
  2. <dependency>
  3. <groupId>org.apache.shenyu</groupId>
  4. <artifactId>shenyu-spring-boot-starter-plugin-sentinel</artifactId>
  5. <version>${project.version}</version>
  6. </dependency>
  7. <!-- apache shenyu sentinel plugin end-->

2.3 启用插件

  • 在 基础配置 --> 插件管理 --> sentinel,设置为开启。

2.4 配置插件

2.4.1 插件配置

2.4.2 选择器配饰

用于对流量第一次筛选,不需要特殊处理字段。

Sentinel插件 - 图2

2.4.3 规则配置

用于对流量最终筛选,有规则处理逻辑。

Sentinel插件 - 图3

fielddefault valuefield typedesc
degradeRuleCountDoule降级阈值
degradeRuleEnable1(enabled)Integer(是否开启流控 (1或0) ) :是否开启sentinel的流控。
degradeRuleGrade0(slow call ratio)Integer(断路器策略): 支持秒级RT/秒级Error Ratio/分钟级Error Count策略。
degradeRuleMinRequestAmount5Integer断路器最小请求量。
degradeRuleSlowRatioThreshold1.0dDouble退化的慢比率阈值。
degradeRuleStatIntervals1Integer降级的状态间隔。
degradeRuleTimeWindowInteger退化时间(单位:秒)。
flowRuleControlBehavior0(direact reject)Integer效果(直接拒绝/排队/慢启动/冷启动+匀速器),不支持调用关系流控。
flowRuleControlBehavior-direct rejection by defaultdirect rejection by default (直接拒绝)
flowRuleControlBehavior-warm upwarm up (冷启动)
flowRuleControlBehavior-constant speed queuingconstant speed queuing (匀速排队,漏桶算法 )
flowRuleControlBehavior-preheating uniformly queued冷启动+匀速器,除了让流量缓慢增加,还还控制的了请求的间隔时间,让请求均匀速度通过。)
flowRuleMaxQueueingTimeMs500msInteger最大排队等待时长(在 “preheating uniformly queued“, “constant speed queuing“ 模式生效)。
flowRuleWarmUpPeriodSec10Integer冷启动预热时长(秒) (在 “preheating uniformly queued” “warm up” 模式下生效)
flowRuleCountInteger哨兵流控制计数。
flowRuleEnable1(enabled)Integer是否开启哨兵流控功能。
flowRuleGrade1(QPS)Integer限流阈值的类型(QPS 或 Thread Count)。
fallbackUriString断路后降级的uri。

2.5 示例

2.5.1 使用sentinel进行流量控制

2.5.1.1 插件配置

  • 在 基础配置 --> 插件管理 --> sentinel,设置为开启。

2.5.1.2 选择器配置

Sentinel插件 - 图4

2.5.1.3 规则配置

关于选择器和规则配置的更多说明,请参考:选择器和规则管理, 这里只对部分字段进行了介绍。

Sentinel插件 - 图5

使用qps限流策略,并且qps为10,拒绝策略为直接拒绝。

代码如下:

  1. @RestController
  2. @RequestMapping("/order")
  3. @ShenyuSpringMvcClient("/order")
  4. public class OrderController {
  5. /**
  6. * Save order dto.
  7. *
  8. * @param orderDTO the order dto
  9. * @return the order dto
  10. */
  11. @PostMapping("/save")
  12. @ShenyuSpringMvcClient("/save")
  13. public OrderDTO save(@RequestBody final OrderDTO orderDTO) {
  14. orderDTO.setName("hello world save order");
  15. return orderDTO;
  16. }
  17. }

2.5.1.4 通过Apache Jmeter请求网关

  • Jmeter线程组配置

Sentinel插件 - 图6

  • Jmeter http请求配置

Sentinel插件 - 图7

2.5.1.5 验证结果

Sentinel插件 - 图8

2.5.2 使用sentinel进行熔断降级控制

2.5.2.1 插件配置

  • 在 基础配置 --> 插件管理 --> sentinel,设置为开启。

2.5.2.2 选择器配置

Sentinel插件 - 图9

2.5.2.3 规则配置

Sentinel插件 - 图10

当degrade strategy为exception number时,degradeRuleSlowRatioThreshold无效。 当单位时间内的最小请求数为 5,且请求发生的异常大于 3 时,将触发断路器。

当degrade strategy为slow call ratio时,degradeRuleSlowRatioThreshold有效,degradeRuleCount表示RT(例如200)。

代码如下:

  1. @RestController
  2. @RequestMapping("/order")
  3. @ShenyuSpringMvcClient("/order")
  4. public class OrderController {
  5. /**
  6. * Save order dto.
  7. *
  8. * @param orderDTO the order dto
  9. * @return the order dto
  10. */
  11. @PostMapping("/save")
  12. @ShenyuSpringMvcClient("/save")
  13. public OrderDTO save(@RequestBody final OrderDTO orderDTO) {
  14. Random random = new Random();
  15. int num = random.nextInt(100);
  16. if (num > 40) {
  17. throw new RuntimeException("num great than 20");
  18. }
  19. orderDTO.setName("hello world save order");
  20. return orderDTO;
  21. }
  22. }

2.5.2.4 通过Apache Jmeter请求网关

  • Jmeter线程组配置

Sentinel插件 - 图11

  • Jmeter http请求配置

Sentinel插件 - 图12

2.5.2.5 验证结果

Sentinel插件 - 图13

3. 如何禁用插件

  • 在 基础配置 --> 插件管理 --> sentinel,设置为关闭。