目录

一 引入Sentinel学习

二 Sentinel入门

三 搭建Sentinel Dashboard

四 Springboot项目接入Sentinel

五 接入限流埋点

六 限流配置

七 熔断降级

八 熔断降级Spring Cloud示例

九 黑白名单(授权规则)

十 持久化

十一 Spring Cloud Alibaba Sentinel三种保护应用方式

一 引入Sentinel学习

提起Spring Cloud的限流降级组件,一般首先想到的是Netflix的Hystrix。

不过就在2018年底,Netflix宣布不再积极开发Hystrix,该项目将处于维护模式。官方表示1.5.18 版本的Hystrix已经足够稳定,可以满足Netflix 现有应用的需求,所以接下来其会把焦点转向对于自适应的实现,更多关注对应用程序的实时性能做出响应。对于新应用的熔断需求,将采用其它项目实现,Netflix推荐了Resilience4j。

作为Spring Cloud Netflix重要套件,Hystrix已经成为保障微服务稳定性的首选应用。其实除了Netflix和Resilience4j,限流降级还有一个新的选择,就是阿里巴巴的Sentinel组件。

二 Sentinel入门

官方文档:https://sentinelguard.io/zh-cn/docs/introduction.html

1 什么是Sentinel?

1.1 问题:

随着微服务的流行,服务与服务之间的调用稳定性变得越来越重要;

1、当服务访问量达到一定程度,流量扛不住的时候,该如何处理?(限流)

2、服务之间相互依赖,当服务B出现响应时间过长,影响到服务A的响应(A调用B),进而产生连锁反应,直至影响整个依赖链上的所有服务(雪崩),该如何处理?(熔断降级)

这是分布式、微服务开发不可避免的问题。

1.2 Sentinel是什么?

Sentinel(分布式系统的流量防卫兵)是阿里开源的一套用于服务容错的综合性解决方案,随着微服务的流行,服务和服务之间的稳定性变得越来越重要。它以流量为切入点,从流量控制,熔断降级,系统负载保护等多个维度来保护服务的稳定性。

2 Sentinel的特征

1、丰富的应用场景:Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围),消息削峰填谷。集群流量控制,实时熔断下游不可用应用等。

2、完备的实时监控:Sentinel提供了实时的监控功能。通过控制可以看到接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总运行情况。

3、广泛的开源生态:Sentinel提供开箱即用的与其他开源框架/库的整合模块,例如与SpringCLoud,Dubbo,gRPC的整合。只需要进入相应的依赖并进行简单的配置即可快速地接入Sentinel。

4、完善的SPI扩展点:Sentinel提供简单易用,完善的SPI扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理,适配动态数据源等。

3 Sentinel组成

Sentinel分为两个部分,具体如下:

1、核心库(Java客户端):不依赖任何框架/库,能够运行于所有Java运行时环境,同时对Dubbo/Spring Cloud等框架也有比较好的支持(你的微服务程序,可以直接添加sentinel.jar包)。

2、控制台(Dashboard)基于Spring Boot开发,打包后可以直接运行,不需要额外的Tomcat等应用容器(因为控制台是使用springboot开发,springboot内嵌了tomcat容器)。

这里我们先学习一下控制台的使用方式。

三 搭建Sentinel Dashboard

将应用接入Sentinel,最好搭建Sentinel控制台,可以在控制台上配置规则。

Dashboard是Alibaba写好的SpringBoot程序,我们直接下载启动即可.

1 下载Sentinel Dashboard

下载地址:https://github.com/alibaba/Sentinel/releases

2 启动控制台

我们可以在Linux系统或者Windows系统启动Sentinel控制台,这里是直接在Windows上启动

  1. #直接使用jar命令启动项目(控制台本身是一个SpringBoot项目)
  2. java -Dserver.port=9090 -jar sentinel-dashboard-1.8.5.jar
    其中,-Dserver.port=9090 代表控制台项目的端口号

3 访问控制台

启动Sentinel Dashboard通过地址和端口号控制台

  1. http://localhost:9090/#/login
  2. #如果在Linux上启动,ip需要对应上

输入默认用户名和密码(sentinel/sentinel),之后控制台可以看到sentinel-dashboard监控的指标。

如果要自定义用户名和密码,在启动命令加上设置用户名和密码参数即可,如下:

  1. -Dsentinel.dashboard.auth.username=admin -Dsentinel.dashboard.auth.password=123456

注意:默认启动后,控制台上没有任何服务被注册到控制台。在启动控制台时,可以通过参数设置将控制台本身注册到控制台上

  1. -Dcsp.sentinel.dashboard.server=localhost:9090
  2. -Dproject.name=sentinel-dashboard
  3. # 其中:
  4. # -Dcsp.sentinel.dashboard.server=localhost:9090 代表本控制台服务将会注册到自己的控制台
  5. # -Dproject.name=sentinel-dashboard 代表本控制台服务的项目名称。

我们可以看到控制台自身的服务已经注册到了控制台上。

默认情况下,Sentinel Dashboard 中的增加的配置规则是存储在内存中,重启后就会丢失;

Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包,所以要确保客户端有访问量;

Sentinel Dashboard是一个独立的web应用(springboot开发的),可以接受客户端(微服务)的连接,然后与客户端(微服务)之间进行通讯,他们之间使用http协议进行通讯。

四 Springboot项目接入Sentinel

1 添加Sentinel依赖

  1. <dependency>
  2. <groupId>com.alibaba.cloud</groupId>
  3. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  4. <version>2.2.9.RELEASE</version>
  5. </dependency>

项目其他关联的部分配置

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.3.12.RELEASE</version>
  5. </parent>
  6.  
  7. <properties>
  8. <maven.compiler.source>8</maven.compiler.source>
  9. <maven.compiler.target>8</maven.compiler.target>
  10. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  11. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  12. <java.version>1.8</java.version>
  13. <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
  14. </properties>
  15.  
  16. <dependencies>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-web</artifactId>
  20. </dependency>
  21. </dependencies>
  22.  
  23. <dependencyManagement>
  24. <dependencies>
  25. <dependency>
  26. <groupId>org.springframework.cloud</groupId>
  27. <artifactId>spring-cloud-dependencies</artifactId>
  28. <version>${spring-cloud.version}</version>
  29. <type>pom</type>
  30. <scope>import</scope>
  31. </dependency>
  32. </dependencies>
  33. </dependencyManagement>
  34.  
  35. <build>
  36. <plugins>
  37. <plugin>
  38. <groupId>org.springframework.boot</groupId>
  39. <artifactId>spring-boot-maven-plugin</artifactId>
  40. </plugin>
  41. </plugins>
  42. </build>

2 配置文件信息

  1. server:
  2. port: 8081
  3.  
  4. spring:
  5. cloud:
  6. sentinel:
  7. transport:
         # 默认就是8719
  8. port: 8719
  9. dashboard: http://localhost:9090
  10. web-context-unify: false
  11. application:
  12. name: sentinel-demo

配置文件说明:

spring.cloud.sentinel.transport.port端口配置会在应用对应的机器上启动一个Http Server,该 Server会与Sentinel控制台做交互。比如Sentinel控制台添加了1个限流规则,会把规则数据 push给这个Http Server接收,Http Server 再将规则注册到Sentinel 中。

spring.cloud.sentinel.transport.port:指定应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer。

客户端需要添加jar包

  1. <dependency>
  2. <groupId>com.alibaba.csp</groupId>
  3. <artifactId>sentinel-transport-simple-http</artifactId>
  4. <version>1.8.5</version>
  5. </dependency>

spring-cloud-starter-alibaba-sentinel依赖已经包含了上面的依赖,所以上面的依赖不需要再单独添加。

3 新建控制类

  1. 1 @RestController
  2. 2 public class DemoController {
  3. 3 @GetMapping("/demo/message")
  4. 4 public String message(){
  5. 5 return "message";
  6. 6 }
  7. 7 }

4 启动项目,访问控制类接口

http://localhost:8081/demo/message

五 接入限流埋点

1 HTTP埋点

Sentinel starter 默认为所有的HTTP服务提供了限流埋点,如果只想对HTTP服务进行限流,那么只需要添加依赖,无需修改代码。(简单说就是所有的 controller 层接口默认提供限流埋点)

2 自定义埋点

如果需要对某个特定的方法进行限流或降级,可以通过 @SentinelResource 注解来完成限流的埋点,示例代码如下:

  1. 1 #service层
  2. 2 @Service
  3. 3 public class HelloServiceImpl implements HelloService {
  4. 4 @Override
  5. 5 @SentinelResource("hello")
  6. 6 public String hello() {
  7. 7 return "hello";
  8. 8 }
  9. 9 }
  1. 1 #controller层
  2. 2 @RestController
  3. 3 public class HelloController {
  4. 4 @Resource
  5. 5 private HelloService helloService;
  6. 6 @GetMapping("/hello")
  7. 7 public String hello(){
  8. 8 return helloService.hello();
  9. 9 }
  10. 10 }

六 限流配置

1 认识流控规则

资源名:一般是我们的请求路径url或注解@SentinelResource的value属性值;

针对来源:来自于哪个应用;

阈值类型:分为QPS(每秒查询数)或并发线程数;

单机阈值:单个节点的QPS或线程数阈值;

是否集群:被请求的服务是否集群部署;

流控模式:

  1. 直接,就是直接对该资源进行控制;
  2. 关联,关联某一个资源(/app2),被关联的资源/app2达到阈值,则限制当前资源/test路径的访问;
  3. 链路,记录指定链路上的流量;

流控效果:

  1. 快速失败 ,直接限制;
  2. Warm Up,根据coldFactor(默认为3)的值,从阈值/coldFactor,经过预热的时长,才达到设置的QPS阈值,比如设置QPS阈值为100,那么100/3 =33,用33作为最初的阈值,然后在10秒到达100后再开始限流;
  3. 排队等待,在QPS阈值到达后,新的请求就等待,直到超时,可以适用于突发流量的请求;

2 直接限流

流量控制,其原理是监控应用流量的QPS(每秒查询率) 或并发线程数等指标,当达到指定的阈值时,对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。

2.1 添加限流规则

在Sentinel dashboard配置/demo/message的限流规则,每秒最多允许访问一次,超出访问,就会限流,返回默认的提示:Blocked by Sentinel (flow limiting)

说明:

QPS(Query Per Second),QPS 其实是衡量吞吐量(Throughput)的一个常用指标,就是说服务器在一秒的时间内处理了多少个请求 —— 我们通常是指 HTTP 请求,显然数字越大代表服务器的负荷越高、处理能力越强。作为参考,一个有着简单业务逻辑(包括数据库访问)的程序在单核心运行时可以提供 50 - 100 左右的 QPS,即每秒可以处理 50 - 100 个请求。

TPS(Transaction Per Second) 每秒钟系统能够处理的事务的数量。

QPS(TPS):每秒钟 request/事务的数量  (此处 / 表示 或的意思)

并发数: 系统同时处理的request/事务数  (此处 / 表示 或的意思)

响应时间RT(Response Time):  一般取平均响应时间

理解了上面三个要素的意义之后,就能推算出它们之间的关系:

  QPS(TPS)= 并发数/平均响应时间  并发数除以平均响应时间

2.2 快速访问,查看效果

打开浏览器频繁访问(使用F5 刷新浏览器访问)(1秒内必须超过一次请求)

3 关联限流

3.1 新建controller类

  1. 1 @RestController
  2. 2 @RequestMapping("/related")
  3. 3 public class RelatedController {
  4. 4 @GetMapping("/a")
  5. 5 public String a(){
  6. 6 return "关联限流a";
  7. 7 }
  8. 8 @GetMapping("/b")
  9. 9 public String b(){
  10. 10 return "关联限流b";
  11. 11 }
  12. 12 }

3.2 新建关联限流规则

这里关联的资源是 /related/b(即保护接口b),上图设置表示:如果接口b的QPS达到单机阈值“1”,则开始通过限流接口“a”,从而保护“b”。

3.3 测试

测试时,可以快速的使用F5 来刷新b,快速的切换到a,F5再刷新a,发现a被限流了

当接口b发送并发流量QPS值小于1时,接口“a”可以正常访问。

关联限流规则是保护重要服务的措施,即:如果某个服务(b)达到临界值,则代表b资源不足,需要先限制不重要的服务(a),防止服务(a)继续调用服务(b)。

4 链路限流

4.1 新建服务类

  1. 1 @Service
  2. 2 public class HelloServiceImpl implements HelloService {
  3. 3 @Override
  4. 4 @SentinelResource("hello")
  5. 5 public String hello() {
  6. 6 return "hello";
  7. 7 }
  8. 8 }

4.2 新建controller类

  1. 1 @RestController
  2. 2 @RequestMapping("/chain")
  3. 3 public class ChainController {
  4. 4 @Resource
  5. 5 private HelloService helloService;
  6. 6 @GetMapping("/a")
  7. 7 public String a(){
  8. 8 return helloService.hello();
  9. 9 }
  10. 10 @GetMapping("/b")
  11. 11 public String b(){
  12. 12 return helloService.hello();
  13. 13 }
  14. 14 }

4.3 新增配置文件application.yml

  1. server:
  2. port: 8081
  3.  
  4. spring:
  5. cloud:
  6. sentinel:
  7. transport:
  8. port: 8719
  9. dashboard: http://localhost:9090
  10. # 禁止收敛URL的入口context,加上它否则链路规则不起作用
  11. web-context-unify: false
  12. application:
  13. name: sentinel-demo

4.4 新建链路流控规则

4.5 测试链路流控规则

访问接口a,当超过QPS设定值1,则接口“a”被限流,接口b同样调用方法,但是不会被限流。

限流时会出现500错误

七 熔断降级

上面实现了实现接口限流。但是在实际应用中,当我们的某个服务接口出现了问题,不能正常提供服务,或者该接口响应速度很慢,导致调用方大量请求堆积,此时需要将该接口降级服务,从而保护调用该接口的服务(消费者),快速返回降级结果,防止因为过多的服务等待该接口的返回,导致系统雪崩。

熔断策略

1 Sentinel熔断策略:慢调用比例

慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。

1.1 名词解释:

调用:一个请求发送到服务器,服务器给与响应,一个响应就是一个调用

RT(Response Time):响应时间,指系统对请求作出响应的时间

慢调用:当调用的时间(响应的实际时间)>设置的RT时,这个调用叫做慢调用

慢调用比例:在所有调用中,慢调用占有实际的比例,= 慢调用次数 / 总调用次数

比例阈值:自己设定的 , 慢调用次数 / 总调用次数>=比例阈值

阈值(threshold value)又叫临界值,比如:水变成冰和水蒸气

统计时长:时间的判断依据

最小请求数:设置的调用最小请求数

1.2 状态转换

进入熔断状态判断依据:当统计时长内,实际请求数目大于最小请求数目,慢调用比例> 比例阈值,进入熔断状态

熔断状态:在接下来的熔断时长内请求会自动被熔断

探测恢复状态:熔断时长结束后进入探测恢复状态

结束熔断:在探测恢复状态,如果接下来的一个请求响应时间小于设置的慢调用 RT,则结束熔断;否则,继续熔断,等待进入探测恢复状态

1.3 实例测试

1.3.1 新建controller类

  1. 1 @RestController
  2. 2 public class PollyController {
  3. 3 @GetMapping("/polly")
  4. 4 public String polly(){
  5. 5 try {
  6. 6 Thread.sleep(1000);
  7. 7 } catch (InterruptedException e) {
  8. 8 e.printStackTrace();
  9. 9 }
  10. 10 return "熔断降级";
  11. 11 }
  12. 12 }

1.3.2 配置熔断规则

注意:Sentinel默认统计的RT上限是4900ms,超出此阈值的都会算作4900ms,若需要变更此上限可以通过启动配置项-Dcsp.sentinel.statistic.max.rt=xxx来配置。

熔断推测:

在1000毫秒,也就是1秒内,如果发送到/polly 的请求数数量大于1,并且在这些请求中,所有请求的响应时长(因为比例阈值为1,所以是所有的请求响应时长)都大于500毫秒,也就是都大于0.5秒的时候,进入熔断状态。

1.3.3 使用浏览器测试熔断

2 Sentinel熔断策略:异常比例

异常比例:当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。

2.1 新建controller类

  1. 1 @RestController
  2. 2 @Slf4j
  3. 3 public class ExceptionController {
  4. 4 int i = 0;
  5. 5 @GetMapping("/exception")
  6. 6 public String exception(){
  7. 7 i++;
  8. 8 if (i % 3 == 0){
  9. 9 throw new RuntimeException("出现异常");
  10. 10 }
  11. 11 log.info("i的值为:{}", i);
  12. 12 return "异常";
  13. 13 }
  14. 14 }

2.2 配置熔断规则

2.3 使用浏览器测试熔断

3 Sentinel熔断策略:异常数

异常数 (ERROR_COUNT):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

3.1 配置熔断规则

3.2 使用浏览器测试熔断

八 熔断降级Spring Cloud示例

1 新建服务提供者工程

1.1 添加nacos依赖

  1. <dependency>
  2. <groupId>com.alibaba.cloud</groupId>
  3. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  4. <version>2.2.9.RELEASE</version>
  5. </dependency>

1.2 添加配置文件

  1. server:
  2. port: 8081
  3.  
  4. spring:
  5. application:
  6. name: sentinel-provider
  7.  
  8. cloud:
  9. nacos:
  10. discovery:
  11. server-addr: http://IP地址:8848/nacos
  12. username: nacos
  13. password: nacos
  14. namespace: 75101df2-2f52-4100-aa37-f3c76a7fc1a0
  15. group: test-group

1.3 新建controller类

  1. 1 @RestController
  2. 2 @Slf4j
  3. 3 public class HelloController {
  4. 4 @GetMapping("/hello/{username}")
  5. 5 public String hello(@PathVariable String username){
  6. 6 log.info("我是一个服务提供者,我被调用了");
  7. 7 return username;
  8. 8 }
  9. 9 }

1.4 启动服务提供者

2 新建服务消费者工程

2.1 添加主要依赖

  1. <dependency>
  2. <groupId>com.alibaba.cloud</groupId>
  3. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  4. <version>2.2.9.RELEASE</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.cloud</groupId>
  8. <artifactId>spring-cloud-starter-openfeign</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>com.alibaba.cloud</groupId>
  12. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  13. <version>2.2.9.RELEASE</version>
  14. </dependency>

2.2 添配置文件

  1. server:
  2. port: 8082
  3.  
  4. spring:
  5. application:
  6. name: sentinel-consumer
  7.  
  8. cloud:
  9. nacos:
  10. discovery:
  11. server-addr: http://IP地址:8848/nacos
  12. username: nacos
  13. password: nacos
  14. namespace: 75101df2-2f52-4100-aa37-f3c76a7fc1a0
  15. group: test-group
  16.  
  17. sentinel:
  18. transport:
  19. dashboard: http://localhost:9090
  20. port: 8719 #sentinel默认的与服务之间交互的接口
  21. # 打开openfeign对sentinel的支持
  22. feign:
  23. sentinel:
  24. enabled: true

2.3 新建feign接口

  1. 1 @FeignClient(value = "sentinel-provider", fallbackFactory = HelloFallbackFactory.class)
  2. 2 public interface HelloFeign {
  3. 3 @GetMapping("/hello/{username}")
  4. 4 String hello(@PathVariable String username);
  5. 5 }

2.4 新建FallbackFactory类

  1. 1 @Component
  2. 2 public class HelloFallbackFactory implements FallbackFactory<HelloFeign> {
  3. 3 @Override
  4. 4 public HelloFeign create(Throwable throwable) {
  5. 5 return username -> username + "说:我就是个被降级的";
  6. 6 }
  7. 7 }

2.5 新建controller类

  1. 1 @RestController
  2. 2 public class HelloController {
  3. 3 @Resource
  4. 4 private HelloFeign helloFeign;
  5. 5 @GetMapping("/hello/{username}")
  6. 6 public String hello(@PathVariable String username){
  7. 7 return helloFeign.hello(username);
  8. 8 }
  9. 9 }

2.6 启动服务消费者,使用浏览器进行测试

http://localhost:8082/hello/jack

可以正常访问

停止服务提供者,降级起作用了

九 黑白名单(授权规则)

很多时候,我们需要根据调用来源来判断该次请求是否允许放行,这时候可以使用Sentinel 的来源访问控制(黑白名单控制)的功能。来源访问控制根据资源的请求来源(origin)限制资源是否通过。

  1. 若配置白名单则只有请求来源位于白名单内时才可通过;
  2. 若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。

1 配置规则

来源访问控制规则(AuthorityRule)非常简单,主要有以下配置项:

resource:资源名,即限流规则的作用对象。

limitApp:对应的黑名单/白名单,不同origin 则用“,” 分隔,如 appA,appB。

strategy:限制模式,AUTHORITY_WHITE 为白名单模式,AUTHORITY_BLACK 为黑名单模式,默认为白名单模式。

2  新建controller类

  1. 1 @RestController
  2. 2 public class WhiteAndBlackController {
  3. 3 @GetMapping("/list")
  4. 4 public String hello(){
  5. 5 return "hello";
  6. 6 }
  7. 7 }

3 新增接口来源类

流控应用:Sentinel提供了RequestOriginParser来处理接口来源。

  1. 1 @Component
  2. 2 public class TestRequestOrigin implements RequestOriginParser {
  3. 3 @Override
  4. 4 public String parseOrigin(HttpServletRequest httpServletRequest) {
  5. 5 // 表示请求参数中含有server键
  6. 6 String server = httpServletRequest.getParameter("server");
  7. 7 return server;
  8. 8 }
  9. 9 }

4 配置白名单规则(黑名单的作用与白名单相反)

 5 启动应用,使用浏览器访问

只有当参数值与规则中配置的流控应用相等时,才能正常访问

十 持久化

默认情况下,sentinel-dashboard 中的规则是存储在微服务内存中,重启后就会丢失。

持久化指的是,一旦重启sentinel的微服务,sentinel配置的各种规则不会丢失。

1 Sentinel结合Nacos持久化配置

Sentinel持久化支持的类型有,详情见:

  1. com.alibaba.cloud.sentinel.datasource.config.DataSourcePropertiesConfiguration

1.1 添加依赖

  1. <dependency>
  2. <groupId>com.alibaba.csp</groupId>
  3. <artifactId>sentinel-datasource-nacos</artifactId>
  4. <version>1.8.5</version>
  5. </dependency>

1.2 添加配置文件

  1. port: 8081
  2.  
  3. spring:
  4. cloud:
  5. nacos:
  6. discovery:
  7. server-addr: http://IP地址:8848/nacos
  8. username: nacos
  9. password: nacos
  10. namespace: 75101df2-2f52-4100-aa37-f3c76a7fc1a0
  11. group: test-group
  12. sentinel:
  13. transport:
  14. port: 8719
  15. dashboard: http://localhost:9090
  16. datasource:
  17. ds1:
  18. nacos:
  19. server-addr: http://IP地址:8848/nacos
  20. dataId: sentinel-datasource-nacos.json
  21. namespace: 75101df2-2f52-4100-aa37-f3c76a7fc1a0
  22. groupId: test-group
  23. # 只支持json和xml
  24. data-type: json
  25. #authority(授权规则)、degrade(降级规则)、flow(流控规则)、param(热点规则)、system(系统规则)五种规则持久化到Nacos中。 另外还增加网关的两个(api分组,限流)
  26. #rule-type这个属性没有提示,为空时,会报空指针错误
  27. rule_type: flow
  28. application:
  29. name: sentinel-datasource-nacos

1.3 登陆nacos,新建配置规则sentinel-datasource-nacos.json

  1. [
  2. {
  3. "resource": "/user/findById",
  4. "limitApp":"default",
  5. "grade":1,
  6. "count":1,
  7. "strategy":0,
  8. "controlBehavior":0,
  9. "clusterMode":false
  10. }
  11. ]

配置说明:

resource:资源名称

limitApp:来源应用

grade:阀值类型,0---线程数,1---QPS

count:单机阀值

strategy:流控模式,0---直接,1---关联,2---链路

controlBehavior:流控效果,0---快速失败,1---warmUp,2---排队等待

clusterMode:是否集群

参考官方文档:https://sentinelguard.io/zh-cn/docs/flow-control.html

注意:

  1. 此时如果是Nacos集群,每个节点务必要配置到同一个数据库上。并且保证每个节点都可用。如果有的节点宕掉了可能会导致配置持久化失败。
  2. 部署在nacos上的配置文件的名字并没有太多要求,只需要跟微服务项目中yml文件中配置的dataId一致即可。

1.4 查看sentinel流控规则,并测试访问

将配置规则持久化进Nacos保存,重启使用sentinel的微服务,只要访问一下基于流控规则的url,流控规则就会显示在sentinel的界面上。此时,持久化生效,只要Nacos里面的配置不删除,针对微服务上Sentinel上的流控规则持续

有效。

1.5 问题

目前有一个小问题,当我们在sentinel dashboard控制台更新或者新加规则,nacos里面的规则并不能得到更新;

2 其他限流规则

2.1 Sentinel熔断降级规则说明

参考地址:https://sentinelguard.io/zh-cn/docs/circuit-breaking.html

2.2 Sentinel【热点规则】热点参数规则

参考地址:https://sentinelguard.io/zh-cn/docs/parameter-flow-control.html

2.3 Sentinel系统规则

参考地址:https://sentinelguard.io/zh-cn/docs/origin-authority-control.html

十一 Spring Cloud Alibaba Sentinel三种保护应用方式

1 直接拦截我们所有controller的请求url路径

Sentinel为springboot程序提供了一个starter依赖,由于sentinel starter依赖默认情况下就会为所有的HTTP服务提供限流埋点,所以在springboot 中的Controller都可以受到Sentinel的保护;

只需为应用添加 spring-cloud-starter-alibaba-sentinel依赖,所有的HTTP接口都能获得Sentinel保护,当然,我们还需要为Sentinel配置保护的规则;底层通过一个拦截器对请求url进行拦截:

com.alibaba.csp.sentinel.adapter.spring.webmvc.SentinelWebInterceptor

可以通过如下配置关闭对微服务的保护:

#关闭sentinel对controller的url的保护

spring.cloud.sentinel.filter.enabled=false

2 通过代码方式保护应用(只是了解)

这种方式就是手动写代码,稍微比较繁琐

  1. 1 @GetMapping("/test3/{app}")
  2. 2 public String test3(@PathVariable("app") String app) {
  3. 3 System.out.println("/test3/{app} --> " + app);
  4. 4 Entry entry = null;
  5. 5 try {
  6. 6 entry = SphU.entry("test3");
  7. 7 return restTemplate.getForObject("http://29-nacos-discovery-provider/test", String.class);
  8. 8 } catch (BlockException e) {
  9. 9 e.printStackTrace();
  10. 10 return "熔断降级了...";
  11. 11 } finally {
  12. 12 if (entry != null) {
  13. 13 entry.exit();
  14. 14 }
  15. 15 }
  16. 16 }

3 通过@SentinelResource(value = "app")注解保护应用

属性

作用

是否必须

value

资源名称

entryType

entry类型,标记流量的方向,取值IN/OUT,默认是OUT

blockHandler

处理BlockException的函数名称。函数要求:

1. 必须是 public

2.返回类型与原方法一致

3. 参数类型需要和原方法相匹配,并在最后加 BlockException 类型的参数。

4. 默认需和原方法在同一个类中。若希望使用其他类的函数,可配置 blockHandlerClass ,并指定blockHandlerClass里面的方法。

blockHandlerClass

存放blockHandler的类。对应的处理函数必须static修饰,否则无法解析,其他要求:同blockHandler。

fallback

用于在抛出异常的时候提供fallback处理逻辑。fallback函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。函数要求:

1. 返回类型与原方法一致

2. 参数类型需要和原方法相匹配,Sentinel 1.6开始,也可在方法最后加 Throwable 类型的参数。

3.默认需和原方法在同一个类中。若希望使用其他类的函数,可配置 fallbackClass ,并指定fallbackClass里面的方法。

fallbackClass

存放fallback的类。对应的处理函数必须static修饰,否则无法解析,其他要求:同fallback。

defaultFallback

用于通用的 fallback 逻辑。默认fallback函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,以fallback为准。函数要求:

1. 返回类型与原方法一致

2. 方法参数列表为空,或者有一个 Throwable 类型的参数。

3. 默认需要和原方法在同一个类中。若希望使用其他类的函数,可配置 fallbackClass ,并指定 fallbackClass 里面的方法。

exceptionsToIgnore

指定排除掉哪些异常。排除的异常不会计入异常统计,也不会进入fallback逻辑,而是原样抛出。

exceptionsToTrace

需要trace的异常

Throwable

Spring Cloud Alibaba组件之Sentinel的更多相关文章

  1. Spring Cloud Alibaba入门篇

    学习条件 了解web三层架构 熟练应用SSM架构 了解Maven管理工具的使用 熟练使用SpringBoot,以及了解SpringBoot基本原理. 了解部分术语:应用.工具.耦合.负载等 温馨提示: ...

  2. Spring Cloud Alibaba | Nacos动态网关路由

    Spring Cloud Alibaba | Gateway基于Nacos动态网关路由 本篇实战所使用Spring有关版本: SpringBoot:2.1.7.RELEASE Spring Cloud ...

  3. Spring Cloud Alibaba基础教程:使用Sentinel实现接口限流

    最近管点闲事浪费了不少时间,感谢网友libinwalan的留言提醒.及时纠正路线,继续跟大家一起学习Spring Cloud Alibaba. Nacos作为注册中心和配置中心的基础教程,到这里先告一 ...

  4. Spring Cloud Alibaba Sentinel 整合 Feign 的设计实现

    作者 | Spring Cloud Alibaba 高级开发工程师洛夜 来自公众号阿里巴巴中间件投稿 前段时间 Hystrix 宣布不再维护之后(Hystrix 停止开发...Spring Cloud ...

  5. Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵基础实战

    Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵基础实战 Springboot: 2.1.8.RELEASE SpringCloud: Greenwich.SR2 ...

  6. Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵进阶实战

    Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵进阶实战 在阅读本文前,建议先阅读<Spring Cloud Alibaba | Sentinel:分布式系 ...

  7. Spring Cloud Alibaba(三)Sentinel之熔断降级

    本项目演示如何使用 Sentinel 完成 Spring Cloud 应用的熔断降级调用. Sentinel 是阿里巴巴开源的分布式系统的流量防卫组件,Sentinel 把流量作为切入点,从流量控制, ...

  8. 0.9.0.RELEASE版本的spring cloud alibaba sentinel实例

    sentinel即哨兵,相比hystrix断路器而言,它的功能更丰富.hystrix仅支持熔断,当服务消费方调用提供方发现异常后,进入熔断:sentinel不仅支持异常熔断,也支持响应超时熔断,另外还 ...

  9. Spring Cloud Alibaba 使用Sentinel实现接口限流

    Sentinel是什么 Sentinel的官方标题是:分布式系统的流量防卫兵.从名字上来看,很容易就能猜到它是用来作服务稳定性保障的.对于服务稳定性保障组件,如果熟悉Spring Cloud的用户,第 ...

  10. 替代 Hystrix,Spring Cloud Alibaba Sentinel 快速入门

    提起 Spring Cloud 的限流降级组件,一般首先想到的是 Netflix 的 Hystrix. 不过就在2018年底,Netflix 宣布不再积极开发 Hystrix,该项目将处于维护模式.官 ...

随机推荐

  1. printf-库函数重定向、重载

    重定向:这是针对标准C语言语法来讲,指的是我们可以重新声明库函数并定义库函数的执行体 重载:这是CPP引入的新特性,即根据函数不同参数个数或参数类型来对同一函数名进行不同定义 C和CPP对重定向处理机 ...

  2. 基于AIE的贵州省FVC提取

    植被覆盖度获取 植被覆盖度(Fractional Vegetation Cover,FVC),是指植被(包括叶.茎.枝)在地面的垂直投影面积占统计区总面积的百分比,范围在 [0,1] 之间.FVC 是 ...

  3. C++ 队列!还是要从 STL 中的说起……

    1. 前言 队列和栈一样,都是受限的数据结构. 队列遵循先进先出的存储原则,类似于一根水管,水从一端进入,再从另一端出去.进入的一端称为队尾,出去的一端称为队头. 队列有 2 个常规操作: 入队:进入 ...

  4. hadoop集群配置全过程

    一.nat配置1.虚拟机->编辑->虚拟网络编辑器->更改设置->移除原VMnet8->加新的VMnet8->点击NAT模式 桥接模式->NAT模式,初始化一 ...

  5. 什么是Scrum?Scrum的核心要点和精髓

    有点长,期望你能通过本文彻底了解 Scrum. 上一篇文章<研发效能组织能力建设之特性团队FeatureTeam(上)>,我们介绍了一个非常有意思且高效的组织模式-特性团队.我们首先介绍了 ...

  6. 2022-08-08-esp32把玩记-①

    layout: post cid: 4 title: esp32把玩记-① slug: 4 date: 2022/08/08 14:59:58 updated: 2022/08/08 14:59:58 ...

  7. flutter系列之:builder为构造器而生

    目录 简介 Builder StatefulBuilder LayoutBuilder 总结 简介 flutter中有很多种Builder,虽然所有的builder都是构造器,但是不同的builder ...

  8. docker gitlab迁移 备份 部署 搭建以及各种问题

    当前环境 服务器A 服务器B ubuntu docker gitlab(版本一致) docker安装gitlab 由于考虑到gitlab 包含了⾃身的nginx.数据库.端⼝占⽤等等因数,这⾥使⽤的是 ...

  9. Linux三剑客awk

    Linux三剑客awk awk是一个强大的linux命令,有强大的文本格式化的能力,好比将一些文本数据格式化成专业的excel表的样式 awk早期在Unix上实现,我们用的awk是gawk,是GUN ...

  10. 加速乐逆向 cookies 参数

    简介 加速乐用于解决网站访问速度过慢及网站反黑客问题. 爬取使用该技术网站时需要携带特定的cookies参数(有的是__jsl_clearance_s,有的__jsl_clearance),本项目以一 ...