全部产品
云市场

实现限流降级

更新时间:2019-09-03 16:43:13

目前原生 Spring Cloud 应用已经支持新版本的限流降级功能。限流降级所使用的基础框架是开源项目 Sentinel

Sentinel 目前支持 WebServlet,RestTemplate, Feign。Zuul 和 Spring Cloud Gateway 需要 Spring Cloud Alibaba 发布新版本后才支持,或者您可以参考 网关限流 自行进行一些 Bean 的设置。

注意:Sentinel 1.6 版本才开始支持网关限流。

本地开发中主要描述开发中涉及的关键信息,如果您想了解完整的 Spring Cloud 程序,可下载 sentinel-flow-example 以及 sentinel-degrade-example

准备工作

在开始开发前,请确保您已经完成以下工作:

  • 下载 Maven 并设置环境变量。

  • 下载最新版本的 Sentinel Dashboard

    • yourPort为您本地 Sentinel Dashboard 设置的端口,如 8081
    • sentinel-dashboard-version.jar为您本地下载的 Sentinel Dashboard 的 JAR 包,如 sentinel-dashboard-1.6.0.jar
  • 在本地执行以下命令,启动 Sentinel Dashboard。

    java -jar -Dserver.port=yourPort sentinel-dashboard-version.jar

  • 登录本地 Sentinel Dashboard 控制台(用户名和密码同为 sentinel),新建限流规则。

本地开发

使用 Sentinel 实现限流

操作步骤

  1. 创建一个 Maven 工程,命名为 sentinel-flow-example。

  2. pom.xml文件中添加依赖。

    以 Spring Boot 2.1.4.RELEASE 和 Spring Cloud Greenwich.SR1 为例,依赖如下:

    1. <parent>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-parent</artifactId>
    4. <version>2.1.4.RELEASE</version>
    5. <relativePath/>
    6. </parent>
    7. <dependencies>
    8. <dependency>
    9. <groupId>org.springframework.boot</groupId>
    10. <artifactId>spring-boot-starter-web</artifactId>
    11. </dependency>
    12. <dependency>
    13. <groupId>org.springframework.cloud</groupId>
    14. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    15. <version>0.9.0.RELEASE</version>
    16. </dependency>
    17. </dependencies>
    18. <dependencyManagement>
    19. <dependencies>
    20. <dependency>
    21. <groupId>org.springframework.cloud</groupId>
    22. <artifactId>spring-cloud-dependencies</artifactId>
    23. <version>Greenwich.SR1</version>
    24. <type>pom</type>
    25. <scope>import</scope>
    26. </dependency>
    27. </dependencies>
    28. </dependencyManagement>
    29. <build>
    30. <plugins>
    31. <plugin>
    32. <groupId>org.springframework.boot</groupId>
    33. <artifactId>spring-boot-maven-plugin</artifactId>
    34. </plugin>
    35. </plugins>
    36. </build>

示例中使用的版本为 Spring Cloud Greenwich ,对应 Spring Cloud Alibaba 版本为 0.9.0.RELEASE。

  • 如果使用 Spring Cloud Finchley 版本,对应 Spring Cloud Alibaba 版本为 0.2.2.RELEASE。

  • 如果使用 Spring Cloud Edgware 版本,对应 Spring Cloud Alibaba 版本为 0.1.2.RELEASE。

    说明:Spring Cloud Edgware 版本的生命周期即将在 2019 年 8 月结束,不推荐使用这个版本开发应用。

  1. src\main\java 下创建 Package com.aliware.edas

  2. 在 Package com.aliware.edas中创建 sentinel-flow-example 的启动类 SentinelFlowExampleApplication

    1. import org.springframework.boot.SpringApplication;
    2. import org.springframework.boot.autoconfigure.SpringBootApplication;
    3. @SpringBootApplication
    4. public class SentinelFlowExampleApplication {
    5. public static void main(String[] args) {
    6. SpringApplication.run(SentinelFlowExampleApplication.class, args);
    7. }
    8. }
  3. 在 Packagecom.aliware.edas中创建一个简单的 ControllerSentinelFlowController,并暴露一些方法。

    1. @RestController
    2. public class SentinelFlowController {
    3. @GetMapping("/flow")
    4. public String flow() {
    5. return "success";
    6. }
    7. @GetMapping("/save")
    8. @SentinelResource(value = "test", blockHandler = "block")
    9. public String save() {
    10. return "test";
    11. }
    12. public String block(BlockException e) {
    13. return "block";
    14. }
    15. }

    说明@SentinelResource 用于定义资源,并提供可选的异常处理和 fallback 配置项。详情请参见注解支持

  4. src\main\resources路径下创建文件application.properties,在application.properties中添加如下配置,指定 Sentinel Dashboard 的地址。

    其中 127.0.0.1:8081 为 Sentinel Dashboard 的地址,如果您的 Sentinel Dashboard 部署在另外一台机器,则需要修改成对应的 IP 和 端口。如果有其它需求,可以参考配置项参考application.properties文件中增加配置。

    1. spring.application.name=sentinel-flow-example
    2. server.port=18888
    3. spring.cloud.sentinel.eager=true
    4. spring.cloud.sentinel.transport.dashboard=127.0.0.1:8081
  5. 执行SentinelFlowExampleApplication中的 main 函数,启动应用。

新建流控规则

在本地 Sentinel Dashboard 中对 sentinel-flow-example 应用新建流控规则。

  1. 访问 http://127.0.0.1:8081, 进入 Sentinel 控制台。

    会看到运行的 sentinel-flow-example 应用。

  2. 在左侧导航栏单击该应用右侧的下拉箭头,然后在菜单中单击流控规则

  3. 流控规则页面添加两个流控规则。

    • 资源名为/flow,来源应用会 “default”, 阈值类型是 QPS,单机阈值为 0。

      流控规则-flow

    • 资源名为test,来源应用会 “default”, 阈值类型是 QPS,单机阈值为 0。

      流控规则-test

结果验证

使用 Sentinel 实现降级

操作步骤

  1. 创建一个 Maven 工程,命名为sentinel-degrade-example

  2. pom.xml文件中添加依赖。

    以 Spring Boot 2.1.4.RELEASE 和 Spring Cloud Greenwich.SR1 为例,依赖如下:

    1. <parent>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-parent</artifactId>
    4. <version>2.1.4.RELEASE</version>
    5. <relativePath/>
    6. </parent>
    7. <dependencies>
    8. <dependency>
    9. <groupId>org.springframework.boot</groupId>
    10. <artifactId>spring-boot-starter-web</artifactId>
    11. </dependency>
    12. <dependency>
    13. <groupId>org.springframework.cloud</groupId>
    14. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    15. <version>0.9.0.RELEASE</version>
    16. </dependency>
    17. </dependencies>
    18. <dependencyManagement>
    19. <dependencies>
    20. <dependency>
    21. <groupId>org.springframework.cloud</groupId>
    22. <artifactId>spring-cloud-dependencies</artifactId>
    23. <version>Greenwich.SR1</version>
    24. <type>pom</type>
    25. <scope>import</scope>
    26. </dependency>
    27. </dependencies>
    28. </dependencyManagement>
    29. <build>
    30. <plugins>
    31. <plugin>
    32. <groupId>org.springframework.boot</groupId>
    33. <artifactId>spring-boot-maven-plugin</artifactId>
    34. </plugin>
    35. </plugins>
    36. </build>

示例中使用的版本为 Spring Cloud Greenwich ,对应 Spring Cloud Alibaba 版本为 0.9.0.RELEASE。

  • 如果使用 Spring Cloud Finchley 版本,对应 Spring Cloud Alibaba 版本为 0.2.2.RELEASE。

  • 如果使用 Spring Cloud Edgware 版本,对应 Spring Cloud Alibaba 版本为 0.1.2.RELEASE。

    说明:Spring Cloud Edgware 版本的生命周期即将在 2019 年 8 月结束,不推荐使用这个版本开发应用。

  1. src\main\java 下创建 Package com.aliware.edas

  2. 在 Package com.aliware.edas中创建 sentinel-degrade-example 的启动类 SentinelDegradeExampleApplication

    1. import org.springframework.boot.SpringApplication;
    2. import org.springframework.boot.autoconfigure.SpringBootApplication;
    3. @SpringBootApplication
    4. public class SentinelDegradeExampleApplication {
    5. public static void main(String[] args) {
    6. SpringApplication.run(SentinelDegradeExampleApplication.class, args);
    7. }
    8. }
  3. src\main\resources路径下创建文件application.properties,在application.properties中添加如下配置,指定 Sentinel Dashboard 的地址。

    其中 127.0.0.1:8081 为 Sentinel Dashboard 的地址,如果您的 Sentinel Dashboard 部署在另外一台机器,则需要修改成对应的 IP 和 端口。如果有其它需求,可以参考配置项参考application.properties文件中增加配置。

    1. spring.application.name=sentinel-degrade-example
    2. server.port=19999
    3. spring.cloud.sentinel.eager=true
    4. spring.cloud.sentinel.transport.dashboard=127.0.0.1:8081
  4. 执行SentinelDrgradeExampleApplication中的 main 函数,启动应用。

新建降级规则

在本地 Sentinel Dashboard 中对sentinel-degrade-example应用新建降级规则。

  1. 访问http://127.0.0.1:8081,进入 Sentinel 控制台。

    会看到运行的sentinel-degrade-example应用。

  2. 在左侧导航栏单击该应用右侧的下拉箭头,然后在菜单中单击降级规则

  3. 降级规则页面添加两个流控规则。

    • 资源名为/rt,降级策略是 RT,,RT 阈值为 200(毫秒),时间窗口为 30(秒)

      新建降级规则-rt

    • 资源名为/exception,降级策略是 异常比例, 异常比列阈值0.5,阈值为 0.5,时间窗口为 30(秒)

      新建降级规则-exception

结果验证

  • RT 验证

    执行脚本 rt.sh

    1. #!/usr/bin/env bash
    2. n=1
    3. while [ $n -le 10 ]
    4. do
    5. echo `curl -s http://localhost:19999/rt`
    6. let n++
    7. done

    执行 5 次后,接口被降级(降级至少要发生 5 次):

    降级监控

  • 异常比例验证

    执行脚本 exception.sh

    1. #!/usr/bin/env bash
    2. n=1
    3. while [ $n -le 10 ]
    4. do
    5. echo `curl -s http://localhost:19999/exception`
    6. let n++
    7. done

    执行 5 次后,接口被降级(降级至少要发生 5 次):

    降级监控1

关于 RestTemplate 和 Feign 的限流降级

Spring Cloud Alibaba Sentinel Starter 提供了对 RestTemplate 的支持(构造 RestTemplate 的时候需要加上@SentinelRestTemplate注解):

  1. @Bean
  2. @SentinelRestTemplate
  3. public RestTemplate restTemplate() {
  4. return new RestTemplate();
  5. }

具体内容请参见 Sentinel 支持 RestTemplate

Feign 的内容请参见 Sentinel 支持 Feign

将应用部署到 EDAS

当在本地完成应用的开发和测试后,便可将应用程序打包并部署到 EDAS。您可以根据您的实际情况选择将 Spring Cloud 应用可以部署到 ECS 集群、容器服务 Kubernetes集群或 EDAS Serverless。部署应用的详细步骤请参见部署应用概述

EDAS 配置管理中心提供了商业化版本 Sentinel Dashboard Server。您只需添加如下依赖即可:

  1. <dependency>
  2. <groupId>com.alibaba.csp</groupId>
  3. <artifactId>spring-boot-starter-ahas-sentinel-client</artifactId>
  4. <version>1.2.1</version>
  5. </dependency>

注意:如果要部署到 EDAS 上spring-boot-starter-ahas-sentinel-client 依赖必须要引入,否则在 EDAS 控制台上对规则的操作无法真正生效。

为应用 sentinel-flow-example 配置限流规则

  1. 登录 EDAS 控制台。

  2. 在左侧导航栏中选择应用管理 > 应用列表

  3. 应用列表页面选择部署应用的地域和命名空间,然后单击部署的应用 sentinel-flow-example

  4. 在应用详情页左侧导航栏选择限流降级 > 流控规则

  5. 流控规则页面右上角单击新建流控规则

  6. 在新建流控规则页面设置流控规则参数,然后单击新建

    • /flow 流控规则

      /flow 流控

    • test 规则

      test 流控

为应用 sentinel-degrade-example 配置降级规则

  1. 登录 EDAS 控制台。

  2. 在左侧导航栏中选择应用管理 > 应用列表

  3. 应用列表页面选择部署应用的地域和命名空间,然后单击部署的应用 sentinel-flow-example

  4. 在应用详情页左侧导航栏选择限流降级 > 降级规则

  5. 降级规则页面右上角单击新建降级规则

  6. 新建降级规则页面设置降级规则参数,然后单击新建

    • rt 降级规则

      rt 降级规则

    • /exception 规则

      exception 降级规则

结果验证

  1. 部署完成后,查看日志,确认应用是否启动成功。详情请参见查看实例日志

  2. 查看 sentinel-flow-example 流控结果。

    1. 执行命令curl http://<应用实例 IP>:<服务端口>/flow,如curl http://192.168.0.34:9999/flow 查看是否返回Blocked by Sentinel (flow limiting)

    2. 执行命令curl http://<应用实例 IP>:<服务端口>/save,如curl http://192.168.0.34:9999/save查看是否返回block

    说明:实际的服务端口可以在应用详情页的基本信息页面查询。

  3. 查看 sentinel-degrade-example 降级结果。

    1. 执行脚本rt.sh

      假设 IP 是 192.168.0.34, 服务端口是 9999。

      说明:实际的服务端口可以在应用详情页的基本信息页面查询。

      1. #!/usr/bin/env bash
      2. n=1
      3. while [ $n -le 10 ]
      4. do
      5. echo `curl -s http://192.168.0.34:9999/rt`
      6. let n++
      7. done

      看执行 5 次后,接口是否被降级(降级至少要发生 5 次)。

    2. 执行脚本exception.sh

      假设 ip 是 192.168.0.34, 服务端口是 9999。

      说明:实际的服务端口可以在应用详情页的基本信息页面查询。

      1. #!/usr/bin/env bash
      2. n=1
      3. while [ $n -le 10 ]
      4. do
      5. echo `curl -s http://192.168.0.34:9999/exception`
      6. let n++
      7. done

      看执行 5 次后,接口是否被降级(降级至少要发生 5 次)。