Sentinel服务限流、降级、热点规则

àì夳堔傛蜴生んèń 2023-01-22 13:53 161阅读 0赞

Sentinel服务限流、降级、热点规则

git地址: https://github.com/alibaba/Sentinel

中文文档: https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D

  sentinel实际和hystrix的作用一样,实现服务降级、熔断等。但是hystrix的不足之处大概有:1.需要程序员手工搭建监控平台;2.没有一套web界面可以给我们进行细粒度化的配置。Sentinel也是实现流量控制、速率控制、服务熔断、服务降级。Sentinel有的优点如下:1.单独的组件,可以独立出来。2.直接界面化的细粒度统一配置。

1.下载安装

1.下载jar包

到git https://github.com/alibaba/Sentinel/releases 下载即可。例如我下载的是:

sentinel-dashboard-1.8.0.jar

2. 启动

直接以jar包的方式运行即可。

  1. java -jar ./sentinel-dashboard-1.8.0.jar

3.访问即可

默认的端口是8080,启动后访问,登录: sentinel/sentinel

b2999ef03627930744cc0c7c7d1f6691.png

2. 新建项目使用sentinel初始化监控

  新建一个项目,注册中心为nacos,端口8848; 熔断流量监控使用sentinel,端口8080.

1.新建项目cloudalibaba-sentinel-service8401

2.修改pom

复制代码

  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>cloud</artifactId>
  7. <groupId>cn.qz.cloud</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>cloudalibaba-sentinel-service8401</artifactId>
  12. <dependencies>
  13. <!--引入自己抽取的工具包-->
  14. <dependency>
  15. <groupId>cn.qz.cloud</groupId>
  16. <artifactId>cloud-api-commons</artifactId>
  17. <version>${project.version}</version>
  18. </dependency>
  19. <!--SpringCloud ailibaba nacos -->
  20. <dependency>
  21. <groupId>com.alibaba.cloud</groupId>
  22. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  23. </dependency>
  24. <!--SpringCloud ailibaba sentinel-datasource-nacos 后续做持久化用到-->
  25. <dependency>
  26. <groupId>com.alibaba.csp</groupId>
  27. <artifactId>sentinel-datasource-nacos</artifactId>
  28. </dependency>
  29. <!--SpringCloud ailibaba sentinel -->
  30. <dependency>
  31. <groupId>com.alibaba.cloud</groupId>
  32. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  33. </dependency>
  34. <!--openfeign-->
  35. <dependency>
  36. <groupId>org.springframework.cloud</groupId>
  37. <artifactId>spring-cloud-starter-openfeign</artifactId>
  38. </dependency>
  39. <!-- SpringBoot整合Web组件+actuator -->
  40. <dependency>
  41. <groupId>org.springframework.boot</groupId>
  42. <artifactId>spring-boot-starter-web</artifactId>
  43. </dependency>
  44. <dependency>
  45. <groupId>org.springframework.boot</groupId>
  46. <artifactId>spring-boot-starter-actuator</artifactId>
  47. </dependency>
  48. <!--日常通用jar包配置-->
  49. <dependency>
  50. <groupId>org.springframework.boot</groupId>
  51. <artifactId>spring-boot-devtools</artifactId>
  52. <scope>runtime</scope>
  53. <optional>true</optional>
  54. </dependency>
  55. <dependency>
  56. <groupId>org.projectlombok</groupId>
  57. <artifactId>lombok</artifactId>
  58. <optional>true</optional>
  59. </dependency>
  60. <dependency>
  61. <groupId>org.springframework.boot</groupId>
  62. <artifactId>spring-boot-starter-test</artifactId>
  63. <scope>test</scope>
  64. </dependency>
  65. </dependencies>
  66. </project>

复制代码

3.yml配置

复制代码

  1. server:
  2. port: 8401
  3. spring:
  4. application:
  5. name: cloudalibaba-sentinel-service
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: localhost:8848 #Nacos服务注册中心地址
  10. sentinel:
  11. transport:
  12. dashboard: localhost:8080 #配置Sentinel dashboard地址
  13. # 默认就是8719端口,如果占用会依次+1开始扫描
  14. port: 8719
  15. management:
  16. endpoints:
  17. web:
  18. exposure:
  19. include: '*'

复制代码

4.主启动类

复制代码

  1. package cn.qz.cloud.alibaba;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  5. /**
  6. * @Author: qlq
  7. * @Description
  8. * @Date: 22:06 2020/11/25
  9. */
  10. @EnableDiscoveryClient
  11. @SpringBootApplication
  12. public class MainApp8401 {
  13. public static void main(String[] args) {
  14. SpringApplication.run(MainApp8401.class, args);
  15. }
  16. }

复制代码

5.测试Controller

复制代码

  1. package cn.qz.cloud.alibaba.controller;
  2. import cn.qz.cloud.utils.JSONResultUtil;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. /**
  6. * @Author: qlq
  7. * @Description
  8. * @Date: 22:07 2020/11/25
  9. */
  10. @RestController
  11. public class FlowLimitController {
  12. @GetMapping("/testA")
  13. public JSONResultUtil<String> testA() {
  14. return JSONResultUtil.successWithData("testA");
  15. }
  16. @GetMapping("/testB")
  17. public JSONResultUtil<String> testB() {
  18. return JSONResultUtil.successWithData("testB");
  19. }
  20. }

复制代码

6.启动后到nacos查看服务列表

1528daa45e5e176dfe96dcdcbbb5f745.png

7. 访问sentinel

需要注意sentinel采用的是懒加载,如果直接启动服务没有访问,sentinel是不会拦截到请求的。所以需要访问几次服务然后到sentinel中查看。sentinel控制台如下:

cf53b534624cded52f14e87ebb6b0d14.png

3. sentinel流控

1.实时监控

可以实时的查看每个请求的访问QPS情况。

2.簇点链路

  和上面1差不多。展示最近的访问情况。

3.流控规则

新增流控规则的时候,界面如下:

efcdf4e373e019d2fcde70eaf3c9dd05.png

概念性问题:

  • 资源名:唯一名称,默认请求路径
  • 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)
  • 阈值类型/单机阈值

(1)QPS(每秒钟的请求数):当掉该api达到阈值的时候,进行限流

(2)线程数: 当调用该API的线程数达到阈值时,进行限流

  • 是否集群:不需要集群
  • 流控模式

(1)直接:直接限流

(2)关联:当关联的资源达到阈值时,限流自己

(3)链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【api级别的针对来源】

  • 流控效果

(1)快速失败:直接失败,抛异常

(2)Warm up:根据code Factor(冷加载印子,默认3)的值,从阈值/cedeFactor,经过预热时长,才达到预设的QPS

(3)排队等待: 匀速排队,让请求匀速的通过,阈值类型必须设置QPS。否则无效。

4. 流控模式使用

  1. QPS 快速失败

aff4b54b263eefd17ee16c591a0da29a.png

多次访问查看结果如下:

959e4464a259ff11962aaf45f6dd2a8a.png

  1. 线程数直接失败

ef30ba40a32de2021dca539af632fd27.png

这个是接收请求,但是当处理的线程数超过1的时候报上面的【Blocked by Sentinel (flow limiting)】。和上面不同的是这个允许请求进去,上面是达到阈值就不让请求进去。

3.关联流控

  关联流控就是关联的资源达到阈值,限流自己。比如如下:当B超过QPS为1之后,A限流:

1fc9017efe5b43b84b023209eaa5ae99.png

测试方法:

(1) 使用postman或者jmeter并发访问testB,如下:加到collections中,然后没300ms访问一次,访问30次

3523bd94f5da50c7560d34fef779a9e7.png

(2)访问A发现A阻塞

009e812dbbcdc790dd527646afb8717f.png

  1. 链路流控规则

(1)查看簇点链路,/testA的资源入口是sentinel_web_servlet_context

a7aa7f383cfed8edb1a3d4c58596685b.png

(2) 对A进行链路流控

36e364e25373a57bb3e708527b51b710.png

(3)频繁访问会报Blocked by Sentinel (flow limiting)

5. 流控效果

1.直接快速失败

默认的就是快速失败,抛出阻塞信息。实现类是 com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController

2.warm up预热: com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController.WarmUpController

根据code Factor(冷加载印子,默认3)的值,从阈值/cedeFactor,经过预热时长,才达到预设的QPS。比如下面规则表示:初始的时候阈值是10/3 = 3 ;5s的预热时间达到10。

831bcd58cb61d3d389908cfe1a783fb5.png

这种模式的应用场景是秒杀系统,开启瞬间会有很多流量上来,很有可能把系统打死,预热就是为了保护系统,让流量缓慢的进来。

  1. 排队等待

匀速排队,让请求匀速的通过。这种很好理解,就是每秒钟放行多少个请求。如下:每秒钟处理1个,超过的话进行排队;排队时长超过2s报阻塞错误。源码是com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController。采用的算法是令牌桶算法。

75fb3a7bc7639c98b7cbe371411f76d6.png

4.sentinel熔断降级

参考: https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7

提供以下几种熔断策略:

(1)慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
(2)异常比例 (ERROR_RATIO):当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
(3)异常数 (ERROR_COUNT):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

1. 慢调用比例模式

满足两个条件会触发熔断:

1》单位统计时长请求数大于设置的最小值。下面是每秒钟5个。

2》慢请求达到设置的比例。

bffe3e65e17911f5918ea0a4b82fb8da.png

(1)新增方法

  1. @GetMapping("/testD")
  2. public JSONResultUtil<String> testD() throws InterruptedException {
  3. TimeUnit.SECONDS.sleep(1);
  4. return JSONResultUtil.successWithData("testD");
  5. }

(2)jmeter 以每秒钟10次请求访问

(3)curl访问

  1. $ curl http://localhost:8401/testD
  2. % Total % Received % Xferd Average Speed Time Time Time Current
  3. Dload Upload Total Spent Left Speed
  4. 100 35 0 35 0 0 249 0 --:--:-- --:--:-- --:--:-- 280Blocked by Sentinel (flow limiting)

(4)上面jmeter每秒钟10次请求大于最小值5;每个请求处理时长超过200ms,满足第二个条件,因此触发降级。

2. 异常比例模式

如下:这个也是需要两个条件。

1》每秒钟请求超过五个

2》异常比例超过50%触发熔断

ee2d85dab05ecc56ec37f685e81547ee.png

(1)新增方法

  1. @GetMapping("/testE")
  2. public JSONResultUtil<String> testE() {
  3. int i = 1 / 0;
  4. return JSONResultUtil.successWithData("testE");
  5. }

(2)jmeter每秒钟十个访问

(3)curl访问:发现触发降级

  1. $ curl http://localhost:8401/testE
  2. % Total % Received % Xferd Average Speed Time Time Time Current
  3. Dload Upload Total Spent Left Speed
  4. 100 35 0 35 0 0 140 0 --:--:-- --:--:-- --:--:-- 149Blocked by Sentinel (flow limiting)

(4)停掉jmeter再次curl,直接爆程序错误。也就是没触发sentinel熔断

  1. $ curl http://localhost:8401/testE
  2. % Total % Received % Xferd Average Speed Time Time Time Current
  3. Dload Upload Total Spent Left Speed
  4. 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0{"timestamp":"2020-12-01T14:41:15.196+0000","status":500,"error":"Internal Server Error","message":"/ by zero","trace":"java.lang.ArithmeticException: / by zero\r\n\tat cn.qz.cloud.alibaba.controller.FlowLimitController.testE(FlowLimitController.java:43)\r\n\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\r\n\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n\tat java.lang.reflect.Method.invoke(Method.java:498)\r\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)\r\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)\r\n\tat org.springframework.web.servl

3.异常数模式

和上面的区别是根据异常数判断是否需要进行熔断。

a675c1a58bcd034cd56ac7874bd32bac.png

5. 热点规则

参考:https://github.com/alibaba/Sentinel/wiki/%E7%83%AD%E7%82%B9%E5%8F%82%E6%95%B0%E9%99%90%E6%B5%81

  这个和hystrix挺像的。@SentinelResource代替@HystrixCommand。

1.新增方法

复制代码

  1. @GetMapping("/testHotKey")
  2. @SentinelResource(value = "testHotKey", blockHandler = "deal_testHotKey")
  3. public JSONResultUtil<String> testHotKey(@RequestParam(value = "p1", required = false) String p1,
  4. @RequestParam(value = "p2", required = false) String p2) {
  5. return JSONResultUtil.successWithData("testHotKey");
  6. }
  7. public JSONResultUtil<String> deal_testHotKey(String p1, String p2, BlockException exception) {
  8. return JSONResultUtil.successWithData("deal_testHotKey"); //sentinel系统默认的提示:Blocked by Sentinel (flow limiting)
  9. }

复制代码

解释:

@SentinelResource注解的value是便于唯一标识,在后面sentinel限流配置的时候可以使用 /testHotKey ,也可以使用 testHotKey唯一标识

blockHandler 类似于hystrixCommand注解的兜底方法。

2.sentinel增加如下配置:

fa1948250f6e28e61a0bb52b47744746.png

上面的配置规则是:

(1)如果 testHotKey 方法不带p1 参数不进行限流

(2)如果待了p1参数且值不为”1”,阈值为2;如果值为”1”, 阈值可达到20。 (这里需要注意例外项的参数类型只支持8种基本数据类型和String类型)

(3)p2参数不参数限流

6. 系统规则

参考:https://github.com/alibaba/Sentinel/wiki/%E7%B3%BB%E7%BB%9F%E8%87%AA%E9%80%82%E5%BA%94%E9%99%90%E6%B5%81

  系统保护规则是从应用级别的入口流量进行控制,从单台机器的 load、CPU 使用率、平均 RT、入口 QPS 和并发线程数等几个维度监控应用指标,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

  • Load 自适应(仅对 Linux/Unix-like 机器生效):系统的 load1 作为启发指标,进行自适应系统保护。当系统 load1 超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR 阶段)。系统容量由系统的 maxQps * minRt 估算得出。设定参考值一般是 CPU cores * 2.5
  • CPU usage(1.5.0+ 版本):当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0),比较灵敏。
  • 平均 RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
  • 并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
  • 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。

可以理解为系统规则是全局的限流配置,可以针对服务的全局QPS、机器的CPU等参数进行限流。

7.@SentinelResource

  这个注解类似于HystrixCommand注解,可以用于方法的降级处理。

1.常规用法

复制代码

  1. package cn.qz.cloud.alibaba.controller;
  2. import cn.qz.cloud.utils.JSONResultUtil;
  3. import com.alibaba.csp.sentinel.annotation.SentinelResource;
  4. import com.alibaba.csp.sentinel.slots.block.BlockException;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. @RestController
  8. public class RateLimitController {
  9. @GetMapping("/byResource")
  10. @SentinelResource(value = "byResource", blockHandler = "handleException")
  11. public JSONResultUtil<String> byResource() {
  12. return JSONResultUtil.successWithData("byResource");
  13. }
  14. public JSONResultUtil<String> handleException(BlockException exception) {
  15. return JSONResultUtil.successWithData("handleException");
  16. }
  17. @GetMapping("/rateLimit/byUrl")
  18. @SentinelResource(value = "byUrl")
  19. public JSONResultUtil<String> byUrl() {
  20. return JSONResultUtil.successWithData("byUrl");
  21. }
  22. }

复制代码

(1)新建两条限流规则:

第一条: 资源名是@SentinelResource 的value属性

39b5e68def128231b993743f07953a04.png

第二条: 资源名是URL,等价于上面的@SentinelResource的value属性

9333ac874264591b6bd1d1e479afaa7e.png

(2)测试:

1》 byResource 超出会走自己指定的方法

ed120bee3ab3aa8c066491aba3c6104a.png

2》byUrl 超出后走默认的限流方法

5a6bbf21a4678e2e03e7c2e20bed084f.png

(3)存在的问题:

1》系统默认限流,满足不了业务要求。

2》自定义的处理方法和业务代码耦合在一起,不直观。

3》每个方法都添加一个兜底的,代码膨胀加剧。

4》全局统一的处理方法没有体现。

2. 自定义异常处理器

(1)新建异常处理器

复制代码

  1. package cn.qz.cloud.alibaba.myhandler;
  2. import cn.qz.cloud.utils.JSONResultUtil;
  3. import com.alibaba.csp.sentinel.slots.block.BlockException;
  4. public class CustomerBlockHandler {
  5. public static JSONResultUtil<Object> handlerException(BlockException exception) {
  6. return JSONResultUtil.errorWithMsg("-1", "error");
  7. }
  8. public static JSONResultUtil<Object> handlerException2(BlockException exception) {
  9. return JSONResultUtil.errorWithMsg("-1", "error2");
  10. }
  11. }

复制代码

(2)Controller使用@SentinelResource注解指明异常处理器以及方法

复制代码

  1. @GetMapping("/rateLimit/cusError")
  2. @SentinelResource(value = "cusError", blockHandlerClass = CustomerBlockHandler.class, blockHandler = "handlerException2")
  3. public JSONResultUtil<String> cusError() {
  4. return JSONResultUtil.successWithData("cusError");
  5. }

复制代码

(3)新建流控

b9fb030dfe33de28850c16a3bca6a920.png

(3) 测试超出限制

67b3d514d8cb29cae7ba58b2dff84df4.png

8.@SentnelResource 补充

主要属性 fallback和blockHandler。fallback管运行异常,blockHandler管配置违规,包括流量超限等。IllegalArgumentException 可以指定忽略的异常。例如:

复制代码

  1. package cn.qz.cloud.alibaba.controller;
  2. import cn.qz.cloud.bean.Payment;
  3. import cn.qz.cloud.utils.JSONResultUtil;
  4. import com.alibaba.csp.sentinel.annotation.SentinelResource;
  5. import com.alibaba.csp.sentinel.slots.block.BlockException;
  6. import lombok.extern.slf4j.Slf4j;
  7. import org.springframework.web.bind.annotation.PathVariable;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.RestController;
  10. import org.springframework.web.client.RestTemplate;
  11. import javax.annotation.Resource;
  12. @RestController
  13. @Slf4j
  14. public class CircleBreakerController {
  15. public static final String SERVICE_URL = "http://nacos-payment-provider";
  16. @Resource
  17. private RestTemplate restTemplate;
  18. @RequestMapping("/consumer/fallback/{id}")
  19. //@SentinelResource(value = "fallback") //没有配置
  20. //@SentinelResource(value = "fallback",fallback = "handlerFallback") //fallback只负责业务异常
  21. //@SentinelResource(value = "fallback",blockHandler = "blockHandler") //blockHandler只负责sentinel控制台配置违规
  22. @SentinelResource(value = "fallback", fallback = "handlerFallback", blockHandler = "blockHandler",
  23. exceptionsToIgnore = {IllegalArgumentException.class})
  24. public JSONResultUtil<Payment> fallback(@PathVariable Long id) {
  25. JSONResultUtil<Payment> result = restTemplate.getForObject(SERVICE_URL + "/list/" + id, JSONResultUtil.class, id);
  26. if (id == 4) {
  27. throw new IllegalArgumentException("IllegalArgumentException,非法参数异常....");
  28. } else if (result.getData() == null) {
  29. throw new NullPointerException("NullPointerException,该ID没有对应记录,空指针异常");
  30. }
  31. return result;
  32. }
  33. //本例是fallback
  34. public JSONResultUtil<Payment> handlerFallback(@PathVariable Long id, Throwable e) {
  35. JSONResultUtil<Payment> objectJSONResultUtil = JSONResultUtil.successWithData(null);
  36. objectJSONResultUtil.setMsg("handlerFallback: " + e);
  37. return objectJSONResultUtil;
  38. }
  39. //本例是blockHandler
  40. public JSONResultUtil<Payment> blockHandler(@PathVariable Long id, BlockException blockException) {
  41. JSONResultUtil<Payment> objectJSONResultUtil = JSONResultUtil.successWithData(null);
  42. objectJSONResultUtil.setMsg("blockHandler : " + blockException);
  43. return objectJSONResultUtil;
  44. }
  45. }

复制代码

nacos-payment-provider服务只有1、2、3 ID返回数据。测试:

(1)ID为4抛出非法参数异常,这种异常exceptionsToIgnore 忽略兜底

1223a2ed83a4b4c70d3616dbb3e41d6f.png

(2)ID为4以后的走fallback

26582811e62ff0003a99fa39925cd5ea.png

9.sentinel持久化

  持久化需要借助nacos,就相当于配置信息存到nacos,然后后nacos读取配置。

1.应用的yml增加如下配置:

复制代码

  1. spring:
  2. application:
  3. name: nacos-order-consumer
  4. cloud:
  5. nacos:
  6. discovery:
  7. server-addr: localhost:8848
  8. sentinel:
  9. transport:
  10. #配置Sentinel dashboard地址
  11. dashboard: localhost:8080
  12. #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
  13. port: 8719
  14. datasource:
  15. ds1:
  16. nacos:
  17. server-addr: localhost:8848
  18. dataId: nacos-order-consumer
  19. groupId: DEFAULT_GROUP
  20. data-type: json
  21. rule-type: flow

复制代码

2.到nacos新建配置

这里需要注意,data Id 和 上面应用中配置的一样。

26f141e2cd481e9f8e1af2e894baafb0.png

内容如下:

复制代码

  1. [
  2. {
  3. "resource": "/consumer/fallback/2",
  4. "limitApp": "default",
  5. "grade": 1,
  6. "count": 5,
  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表示Warm up,2表示排队等待

【当你用心写完每一篇博客之后,你会发现它比你用代码实现功能更有成就感!】

发表评论

表情:
评论列表 (有 0 条评论,161人围观)

还没有评论,来说两句吧...

相关阅读