什么是Sentinel

Sentinel 是阿里巴巴出品的面向分布式服务架构的高可用防护组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助用户保障微服务的稳定性。

安装Sentinel

Sentinel与Nacos类似,需要安装一个控制台程序,安装方法很简单,可以参考官方文档提供的安装教程:传送门,也可以使用我的Docker安装教程

整合Sentinel

第一步:创建SpringBoot模块alibaba-sentinel-rate-limiting
第二步:编辑pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>spring-cloud-learn</artifactId>
  7. <groupId>com.example</groupId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>alibaba-sentinel-rate-limiting</artifactId>
  12. <properties>
  13. <java.version>11</java.version>
  14. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  15. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  16. <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
  17. <spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
  18. <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
  19. </properties>
  20. <dependencyManagement>
  21. <dependencies>
  22. <dependency>
  23. <groupId>org.springframework.cloud</groupId>
  24. <artifactId>spring-cloud-dependencies</artifactId>
  25. <version>${spring-cloud.version}</version>
  26. <type>pom</type>
  27. <scope>import</scope>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-dependencies</artifactId>
  32. <version>${spring-boot.version}</version>
  33. <type>pom</type>
  34. <scope>import</scope>
  35. </dependency>
  36. <dependency>
  37. <groupId>com.alibaba.cloud</groupId>
  38. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  39. <version>${spring-cloud-alibaba.version}</version>
  40. <type>pom</type>
  41. <scope>import</scope>
  42. </dependency>
  43. </dependencies>
  44. </dependencyManagement>
  45. <dependencies>
  46. <dependency>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-starter-web</artifactId>
  49. </dependency>
  50. <dependency>
  51. <groupId>com.alibaba.cloud</groupId>
  52. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  53. </dependency>
  54. <dependency>
  55. <groupId>org.projectlombok</groupId>
  56. <artifactId>lombok</artifactId>
  57. <optional>true</optional>
  58. </dependency>
  59. <dependency>
  60. <groupId>org.springframework.boot</groupId>
  61. <artifactId>spring-boot-starter-test</artifactId>
  62. <scope>test</scope>
  63. <exclusions>
  64. <exclusion>
  65. <groupId>org.junit.vintage</groupId>
  66. <artifactId>junit-vintage-engine</artifactId>
  67. </exclusion>
  68. </exclusions>
  69. </dependency>
  70. </dependencies>
  71. </project>

第三步:编辑配置文件application.properties

  1. spring.application.name=alibaba-sentinel-rate-limiting
  2. server.port=8003
  3. spring.cloud.sentinel.transport.dashboard=localhost:9260

第四步:创建一个Controller

  1. package com.demo;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. /**
  8. * @author wujiawei
  9. * @see
  10. * @since 2021/4/14 下午1:32
  11. */
  12. @SpringBootApplication
  13. public class AlibabaSentinelRateLimitingApplication {
  14. public static void main(String[] args) {
  15. SpringApplication.run(AlibabaSentinelRateLimitingApplication.class, args);
  16. }
  17. @Slf4j
  18. @RestController
  19. static class EchoController {
  20. @GetMapping("echo")
  21. public String echo() {
  22. return "echo";
  23. }
  24. }
  25. }

第五步:启动程序,通过curl反复请求/echo接口

  1. wujiawei@wujiaweideMacBook-Pro sentinel % curl http://localhost:8003/echo
  2. echo

此时在Sentinel控制台出现了我们当前的应用,并且在实时监控菜单中可以看到刚才的请求,如图:
image.png

配置限流规则

Sentinel整合完成后,我们尝试使用它的限流功能。
打开控制台,在alibaba-sentinel-rate-limiting服务下,点击簇点链路菜单,可以看到我们调用过的/echo接口。点击流控按钮,为该接口设置流量控制规则。
image.png
这里用一个最简单的设置,修改单机阈值为2,其他属性保持不动。这个设置的意思就是每秒最多允许2个请求,超过两个后就会被拒绝。
image.png
新增完成后,可以看到流控规则中出现了我们创建的规则。
image.png
这时回到curl,再次尝试反复请求/echo接口,注意这里要快快快!可以看到一秒内连续调用两次之后,第三次直接被拦截了。

  1. wujiawei@wujiaweideMacBook-Pro sentinel % curl http://localhost:8003/echo
  2. echo
  3. wujiawei@wujiaweideMacBook-Pro sentinel % curl http://localhost:8003/echo
  4. echo
  5. wujiawei@wujiaweideMacBook-Pro sentinel % curl http://localhost:8003/echo
  6. Blocked by Sentinel (flow limiting)

代码示例

  • Github:
  • Gitee: