当前位置:   article > 正文

Sentinel 入门与实战

Sentinel 入门与实战

一、Sentinel概念

1.1 什么是Sentinel

Spring Cloud Alibaba Sentinel 是一个开源的流量控制和熔断框架,它是 Alibaba 开源的微服务框架 Spring Cloud Alibaba 中的一个组件。Sentinel 旨在解决分布式系统中的流量控制和熔断问题,帮助开发人员保护微服务应用免受系统负载过高和故障的影响。

Sentinel 主要有以下几个功能:

  1. 流量控制:可以通过配置规则对接口的访问量进行限制,避免因流量过高而导致系统崩溃。
  2. 服务熔断:当后端服务不可用或异常时,可以通过配置熔断规则,快速失败并返回错误信息,避免连锁故障。
  3. 系统负载保护:根据系统的负载情况,自动控制流量的通过,防止系统出现过载现象。
  4. 统计和监控:提供实时的流量控制和熔断统计信息,可以通过 Dashboard(控制台)进行可视化监控和配置。

1.2 为什么需要 Sentinel

需要使用 Sentinel 的原因主要有以下几个:

  1. 防止雪崩效应:当某个服务故障时,传统的做法是让请求一直等待,直到服务器恢复正常。然而,这可能导致请求积压,进而导致其他服务也出现故障,最终形成雪崩效应。Sentinel 可以通过熔断机制,及时返回错误信息,避免连锁故障。
  2. 流量控制:在高并发场景下,如果系统突然收到大量请求,可能会导致系统过载,影响正常的服务。Sentinel 可以通过流量控制机制,限制并发请求的数量,确保系统可用性和稳定性。
  3. 保护系统稳定性:在微服务架构中,多个服务之间互相依赖,一个服务的故障可能导致整个系统的崩溃。Sentinel 可以对请求进行流量控制和熔断,避免由于某个服务的故障导致整个系统不可用。

1.3 什么是流量控制

流量控制是指对系统中的请求流量进行限制和管理,以确保系统在承受能力范围内正常运行。

常见的流量控制算法

1.3.1 计数器算法 

计数器算法是在一定时间间隔里,记录请求的次数,当请求次数超过该时间限制时,就把计数器清零,然后重新计算。当请求次数超过间隔内最大次数时,拒绝访问。

计数器算法的特点:实现简单,但存在 " 突刺现象"。

突刺现象是指,比如限流 QPS 为 100,算法的实现思路就是从一个请求进来开始计时,再接下来的 1s 内,每来一个请求,就把计数加1,如果累加的数字达到了 100,后续的请求就会被全部拒绝。等到 1 秒结束后,把计数恢复成0,重新开始计数。如果再单位时间 1 秒内的前 10 毫秒处理了 100 个请求,那么后面的 990 毫秒会拒绝所有的请求,我们把这种现象称为“突刺现象”。

 1.3.2 漏桶算法

漏桶算法的实现思路是,有一个固定容量的漏桶,水流(请求)可以按照任意速率进入到漏桶里,但漏桶总是以固定的速率匀速流出,当流入量过大的时候(超过桶的容量),则多余水流(请求)直接溢出。

漏桶算法提供了一种机制,通过它可以让突发流量被整形,以便为系统提供稳定的请求,比如 Sentinel 中流量整形(匀速排队功能)就是此算法实现的。

1.3.3 令牌桶算法

令牌按照固定的速率被放入到令牌桶中,桶中最多放 N个令牌(Token), 当桶装满时,新添加的令牌被丢弃或拒绝,当请求到达时,将从桶中删除 1 个令牌。令牌中的令牌不仅可以被移除,还可以往里添加,所以为了保证接口随时有数据通过,必须不停地往桶里加令牌。由此可见,往桶里加令牌地速度就决定了数据通过接口地速度,我们通过控制往令牌桶里加令牌地速度从而控制接口地流量

1.4 Sentinel 流量控制

Sentinel 流量控制有以下几个角度:

  • 资源的调用关系,例如资源的调用链路,资源和资源之的地关系。
  • 运行指标,例如QPS(Queries Per Second 每秒查询数)、线程池、系统负载等。
  • 控制的效果,例如快速失败、冷启动、排队等。

流控效果介绍如下:

  • 快速失败:该方式是默认的流量控制的方式,比如 QPS 超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出 FlowException。这种方式适用于对系统处理能力已知的情况下,比如通过压测确定了系统的准确水位时。
  • 排队等待(也叫匀速通过):排队等待会严格控制请求通过的间隔时间,让请求稳定且匀速的通过,可以用来间隔性突发的高流量。例如抢票软件,再某一秒或者一分钟内有大量的请求到来,而接下来的一段时间里出于空闲状态,我们希望系统能够在接下来的空余时间里也能处理这些请求,而不是直接拒绝。在设置排队等待时,需要填写超时时间。
  • Warm Up:此项叫做预热或者冷启动方式,此模式主要是防止流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮,通过 “冷启动”,让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。当使用 Warm Up 模式时,我们还需要指定启动时开放的 QPS 比例(DEFAULT_COLD_FACTOR,默认值为3,代表30%)以及系统预热所需时长(warmUpPeriodSec,默认值是10s)。

1.5 什么是熔断 

熔断是一种在分布式系统中处理故障和异常的策略。当某个服务或者接口发生故障或异常时,熔断机制会迅速将请求拒绝或者返回错误信息,而不是让请求一直等待或者重试,以保护系统免受故障的扩散影响。

熔断的原理是通过对服务的监控和评估,根据一定的规则来判断服务的健康状况。当服务的错误率或者响应时间超过设定的阈值时,熔断器会触发,并将后续的请求迅速拦截或者返回错误信息,而不是继续调用该服务,从而避免由于故障服务的长时间不可用或者响应过慢而导致整个系统的而延迟或者崩溃。

熔断机制的好处是能够快速失败并返回错误信息,避免资源的浪费和系统的连锁故障。当服务恢复正常时,熔断器会逐渐放行请求,验证服务的可用性,确保系统逐渐恢复正常运行。 

Sentinel 熔断配置如下:

  1.  满调用比例:在统计时长内所有请求,如果请求时间超过最大 RT(Response Time)则为慢请求,请求数大于等于最小请求数,且满请求的比列大于规定阈值,则会触发熔断,也就是一段时间内(熔断时长参数设置)的请求会快速失败。
  2. 异常比例:在统计时长内的所有请求,如果异常比例大于阈值,且请求数大于最小请求数,将触发熔断,也就是一段时间内(熔断时长参数设置)的请求会快速失败。
  3. 异常数:在统计时间内的所有请求,如果异常数大于阈值,且请求数大于最小请求数,将触发熔断,也就是一段时间内(熔断时长参数设置)的请求会快速失败。

1.6 Sentinel 组成

1. 资源:Sentinel 中被保护的对象,可以是方法、接口、URL等

2. 规则:对资源的访问策略,包括限流、熔断、热点等。规则包括以下这些

  • 限流规则:基于不同的模式对流量进行控制,可以直接拒绝、等待等
  • 熔断规则:异常情况下进行熔断降级。
  • 热点规则:对热点数据进行针对性的流量控制
  • 授权规则:对调用方(入口服务)进行黑、白名单限制。
  • 系统保护规则:基于CPU、负载、整体QPS、线程数多个指标进行自适应的流量控制。

二、Sentinel 基本使用

Sentinel 基本使用主要有以下4步:

  1. 添加 Sentinel依赖
  2. 定义资源
  3. 定义规则
  4. 验证效果

2.1 实现限流功能

2.1.1 添加 Sentinel 框架依赖

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

2.1.2 定义资源

1.通过代码定义资源

通过代码的方式 SphU.entry("resourceName")来定义资源,具体实现代码如下:

  1. @RequestMapping("getname")
  2. public String getName(){
  3. try(Entry enty= SphU.entry("getname")){
  4. return "Name:"+new Random().nextInt(1000);
  5. } catch (BlockException e) {
  6. return "被限流了";
  7. }
  8. }

SphU 是 Sentinel Protection Hotspot Util 的缩写,Sentinel 热点保护工具类。

2. 通过注解方式定义资源

通过注解 @SentinelResource 也可以实现资源的定义,如下代码所示:

  1. @RequestMapping("/getnamebyid")
  2. @SentinelResource(value = "getnamebyid",blockHandler = "myblockHandler",fallback = "otherhandler")
  3. public String getNameById(Integer id){
  4. int num=new Random().nextInt(100);
  5. System.out.println(num);
  6. int i = num / 0;
  7. // throw new RuntimeException();
  8. return "ID: "+new Random().nextInt(1000);
  9. }
  10. public String myblockHandler(Integer id,BlockException blockException){
  11. return "被限流了";
  12. }
  13. public String otherhandler(Integer id,Throwable e){
  14. return "其他异常";
  15. }

注意事项

  1. 定义的限流方法 myBlockHandler 必须和原方法的返回值、参数保持一致;
  2. 限流方法必须添加 BlockException 参数,不然会因为找不到合适的限流后执行方法,提示以下错误:
     

@SentinelResource 注解属性说明:

  • value:资源名称,必填项
  • entryType:资源调用的流量类型:入口流量(EntryType.IN)和出口流量(EntryType.OUT),注意系统规则只对 IN 生效。
  • blockHandler/blockHandlerClass:限流和熔断时执行 BlockException 所对应的方法名。
  • fallback/fallbackClass:非 BlockException 时,其他非限流、非熔断时异常对应的方法。
  • exceptionsToIgnore:用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是原样抛出。

注:1.6.0 之前的版本 fallback 函数只针对熔断降级异常(DegradeException)进行处理,不能针对业务异常进行处理。 

2.1.3 定义规则

  1. @SpringBootApplication
  2. public class SentinelDemoApplication {
  3. public static void main(String[] args) {
  4. SpringApplication.run(SentinelDemoApplication.class, args);
  5. initFlowRules();
  6. }
  7. public static void initFlowRules(){
  8. List<FlowRule> rules=new ArrayList<>();
  9. FlowRule rule=new FlowRule();
  10. rule.setResource("getnamebyid");
  11. rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
  12. rule.setCount(1);
  13. rule.setStrategy(RuleConstant.STRATEGY_DIRECT);
  14. rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
  15. rule.setClusterMode(false);
  16. rules.add(rule);
  17. FlowRuleManager.loadRules(rules);
  18. }
  19. }
  20. //热点参数流控规则(需要配合@SentinelResource 使用)
  21. public static void initFlowRules(){
  22. List<ParamFlowRule> rules = new ArrayList<>();
  23. List<ParamFlowItem> paramFlowItemList=new ArrayList<>();
  24. ParamFlowItem paramFlowItem1 = new ParamFlowItem();
  25. paramFlowItem1.setClassType(Integer.class.getName()); // 参数类型为 String
  26. paramFlowItem1.setCount(2);
  27. paramFlowItem1.setObject("id"); // 参数名为 id
  28. paramFlowItemList.add(paramFlowItem1);
  29. // 设置热点参数流控规则
  30. ParamFlowRule paramFlowRule = new ParamFlowRule("/user/getnamebyid") // 对应的资源名
  31. .setParamIdx(0) // 参数的索引,从0开始,如果方法参数中的第一个参数是id,则索引为0
  32. .setGrade(RuleConstant.FLOW_GRADE_QPS) // 参数限流的阈值类型,比如QPS
  33. .setCount(2) // 参数的阈值
  34. .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)
  35. .setParamFlowItemList(paramFlowItemList);
  36. rules.add(paramFlowRule);
  37. ParamFlowRuleManager.loadRules(rules);
  38. }
  39. @RequestMapping("/getnamebyid")
  40. @SentinelResource(value = "/user/getnamebyid")
  41. public String getNameById(Integer id) {
  42. // Thread.sleep(300);
  43. return "ID: "+new Random().nextInt(1000);
  44. }
  45. // 授权规则
  46. public static void initFlowRules(){
  47. List<AuthorityRule> rules=new ArrayList<>();
  48. AuthorityRule rule=new AuthorityRule();
  49. rule.setResource("/user/getnamebyid");
  50. rule.setStrategy(RuleConstant.AUTHORITY_WHITE);
  51. rule.setLimitApp("qingkai,akai"); //设置白名单,只有"qingkai" 和 "akai" 可以访问
  52. rules.add(rule);
  53. AuthorityRuleManager.loadRules(rules);
  54. }

其中:

1. setStrategy:设置调用关系限流策略,包含的值有:

  • 直接(RuleConstant.STRATEGY_DIRECT)
  • 链路(RuleConstant.STRATEGY_RELATE)
  • 关联(RuleConstant.STRATEGY_CHAIN)

2. setControlBehavior:设置流控效果,包含的值有:

  • 直接拒绝(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)
  • 冷启动(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)
  • 匀速启动(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)
  • 冷启动+匀速启动(RuleConstant.CONTROL_BEHAVIOR_WARM_UP_RATE_LIMITER))

2.2 实现熔断(降级)功能

 熔断降级功能的实现和限流功能类似,唯一的不同是定义规则上的不同。

熔断降级定义规则代码如下:

  1. //熔断规则
  2. public static void initDegradeRules(){
  3. List<DegradeRule> rules=new ArrayList<>();
  4. DegradeRule rule=new DegradeRule();
  5. rule.setResource("getnamebyid");
  6. //熔断降级策略,支持慢调用比例/异常比例/异常数策略
  7. rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
  8. //慢调用比例模式下为慢调用临界 RT,单位:ms(超出该值为慢调用);异常比例/异常数模式下为对应的阈值
  9. rule.setCount(10);
  10. //熔断时长,单位:s
  11. rule.setTimeWindow(5);
  12. //熔断触发的最小请求数,请求数小于该值时及时异常比率超出阈值也不会熔断
  13. rule.setMinRequestAmount(1);
  14. //统计时长,单位:ms
  15. rule.setStatIntervalMs(1000);
  16. //慢调用比例阈值,仅慢调用比例模式有效
  17. rule.setSlowRatioThreshold(0.5);
  18. rules.add(rule);
  19. DegradeRuleManager.loadRules(rules);
  20. }

2.3 判断时熔断还是限流

  1. public String myblockHandler(Integer id,BlockException blockException){
  2. if(blockException instanceof FlowException){
  3. return "被限流了";
  4. }if(blockException instanceof DegradeException){
  5. return "被熔断了";
  6. }
  7. return "请求被限制了";
  8. }

三、sentinel 控制台

3.1 启动 Sentinel 控制台

配置项默认值 描述
server.port8080指定端口号
csp.sentinel.dashboard.serverlocalhost:8080指定地址
sentinel.dashboard.auth.usernamesentinelDashboard 登录账号
sentinel.dashboard.auth.passwordsentinelDashboard 登录密码
server.servlet.session.timeout30分钟

登录Session 过期时间

配置为7200 表示 7200秒

配置为60m 表示 60 分钟

project.name-指定程序的名称

3.2 在程序中加入并配置 Sentinel

在项目中加入Sentinel依赖:

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

在项目中配置 Sentinel Dashboard 地址:

  1. spring:
  2. application:
  3. name: sentinel-service
  4. cloud:
  5. sentinel:
  6. transport:
  7. dashboard: localhost:1234
  8. client-ip: 127.0.0.1
  9. port: 8720
  10. heartbeat-interval-ms: 1000
  • 其中只用 dashboard 是必选项,其他的都可以省略 
  • dashboard:sentinel 控制台地址
  • client-ip:当前客户端 Ip,不设置自动选择一个 IP注册
  • port:与sentinel 通讯的端口,如不设置,会从 8719 开始扫描,依次 +1,直到找到未被占用的接口。
  • heartbeat-interval-ms:心跳发送周期,默认是10s

3.3 设置规则

3.3.1 限流规则

流控模式: 

  • 直接:接口达到限流条件时,直接限流。
  • 关联:当关联的资源达到阈值时,就限流自己
  • 链路:指定资源从入口资源进来流量,如果达到阈值,就进行限流。

Token Server 时 Sentinel 用于集群流量控制的关键组件,它负责分发令牌并进行流量控制。当 Sentinel 的应用程序配置为集权限流模式时,它会向 Token Server 请求令牌,然后根据令牌情况来进行流量控制。如果 Token 不可用,可能是由于网络故障、Token Server 实例崩溃等原因,这时候无法从 Token Server 获取令牌。

  • 当配置选项为“是”时:表示Token Server 不可用时,Sentinel 会自动切换为单机限流模式。在单机限流模式中,Sentinel 会从本地的规则进行流量控制,不再依赖 Token Server。这样可以保证即使 Token Server 不可用,也能够继续对流量进行限制。
  • 当配置选项为“否”时:表示当 Token Server 不可用时,Sentinel 不会自动切换为单机限流模式,流量控制会被暂停,即无法进行限流,可能会导致服务负载过高。

3.3.2 新增热点规则 

热点规则使用注意事项:

  1. 热点规则只在控制台配置时不生效的,需要在代码中配合 @SentinelResource 一起使用才行
  2. 热点规则配置的参数必须存在,如果不存在配置了也是无效的。且前端传递的参数名和后端参数名要一致才有效
  3. 高级选项可以配置特定的参数的限流阈值

3.3.3 新增授权规则

针对某个接口的调用服务做黑、白名单限制

 

  1. @Component
  2. public class CustomerRequestOriginParser implements RequestOriginParser {
  3. @Override
  4. public String parseOrigin(HttpServletRequest request) {
  5. String origin=request.getHeader("origin");
  6. if(!StringUtils.hasLength(origin)){
  7. origin="blank";
  8. }
  9. return origin;
  10. }
  11. }

此时只有请求头中含有 "origin":"qingkai" 的请求才可以访问。

3.2.4 新增系统保护规则

对整个项目做限流保护,设置如下:

  • Load 自适应(仅对 Linux/Unix-like 机器生效):系统的负载 load1 作为启发指标,进行自适应系统保护,load1 时每分钟平均负载指标,当系统 load1 超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护。系统容量由系统的 maxQps * min Rt 估算得出。设定参考值一般是 CPU cores * 2.5.
  • RT:Response Time,系统响应时间,当单台机器上所有入口流量的平均 RT 达到阈值,即触发系统保护,单位时毫秒。
  • 线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
  • 入口 QPS:当单台机器上所有入口流量的QPS 达到阈值即触发系统保护。
  • CPU 使用率:当系统CPU 使用率超过阈值即触发系统保护 

3.4 自定义异常

3.4.1 局部自定义异常

  1. @RequestMapping("/getnamebyid")
  2. @SentinelResource(value = "getnamebyid",blockHandler = "myblockHandler")
  3. public String getNameById(Integer id) throws InterruptedException {
  4. // Thread.sleep(300);
  5. return "ID: "+new Random().nextInt(1000);
  6. }
  7. public String myblockHandler(Integer id,BlockException blockException){
  8. if(blockException instanceof FlowException){
  9. return "被限流了";
  10. }if(blockException instanceof DegradeException){
  11. return "被熔断了";
  12. }
  13. return "请求被限制了";
  14. }

3.4.2 全局自定义异常

  1. @Component
  2. public class globalException implements BlockExceptionHandler {
  3. @Override
  4. public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {
  5. String msg="未知异常";
  6. int code= HttpStatus.TOO_MANY_REQUESTS.value();
  7. if(e instanceof FlowException){
  8. msg="您被限流了";
  9. }else if (e instanceof DegradeException){
  10. msg="您被熔断了";
  11. }else if(e instanceof AuthorityException){
  12. msg="没有访问权限";
  13. }else if(e instanceof ParamFlowException){
  14. msg="请求热点参数被限流";
  15. }
  16. httpServletResponse.setContentType("application/json;charset=utf8");
  17. httpServletResponse.setStatus(code);
  18. httpServletResponse.getWriter().println("{\"msg\":"+msg+",\"code\":"+code+",\"data\":[]");
  19. }
  20. }

3.4.3 系统自定义异常

  1. @RestControllerAdvice
  2. public class SystemException{
  3. @ExceptionHandler(BlockException.class)
  4. public String handlerException(Exception e){
  5. if(e instanceof ParamFlowException){
  6. return "请求出发了热点限流了!!!";
  7. }
  8. return "限流";
  9. }
  10. }

四、使用 Nacos 持久化规则

Sentinel 使用 Dashboard 可以动态修改流控规则,但因为默认时存储在内存中的,所以重启之后数据就丢失了,因此我们可以配合Nacos、ZooKeeeper、Redis 等存储数据源。

4.1 添加依赖

  1. <dependency>
  2. <groupId>com.alibaba.cloud</groupId>
  3. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>com.alibaba.csp</groupId>
  7. <artifactId>sentinel-datasource-nacos</artifactId>
  8. </dependency>

4.2 配置数据源

  1. spring:
  2. application:
  3. name: sentinel-service
  4. cloud:
  5. sentinel:
  6. transport:
  7. dashboard: localhost:18080
  8. datasource:
  9. ds:
  10. nacos:
  11. server-addr: localhost:8848
  12. username: nacos
  13. password: nacos
  14. data-id: ${spring.application.name}-flow-rules
  15. group-id: DEFAULT_GROUP
  16. data-type: json
  17. rule-type: flow #限流
  18. ds2:
  19. nacos:
  20. server-addr: localhost:8848
  21. username: nacos
  22. password: nacos
  23. data-id: ${spring.application.name}-degrade-rules
  24. group-id: DEFAULT_GROUP
  25. data-type: json
  26. rule-type: degrade #熔断
  27. ds3:
  28. nacos:
  29. server-addr: localhost:8848
  30. username: nacos
  31. password: nacos
  32. data-id: ${spring.application.name}-paramflow-rules
  33. group-id: DEFAULT_GROUP
  34. data-type: json
  35. rule-type: param_flow #热点限流
  36. ds4:
  37. nacos:
  38. server-addr: localhost:8848
  39. username: nacos
  40. password: nacos
  41. data-id: ${spring.application.name}-paramflow-rules
  42. group-id: DEFAULT_GROUP
  43. data-type: json
  44. rule-type: authority #黑白名单
  • ds:数据源名字,可以随便起
  • nacos:表示 Nacos 数据源
  • server-addr:Nacos 服务器地址
  • password:Nacos 密码
  • data-id:Nacos 新建配置的 Data ID
  • group-id:分组 ID
  • data-type:数据格式
  • rule-type:规则类型

4.2.1 Nacos 限流配置

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

 属性说明:

字段说明默认值
resource资源名,资源名是限流规则的作用对象
count限流阈值
grade限流阈值类型,QPS(1)或线程数(0)模式,RuleConstant类中查看值所代表的含义。QPS模式
limitApp流控针对的调用来源default,代表不区分调用来源
Strategy调用关系限流策略:直接(0)、关联(1)、链路(2)直接
controlBehavior流控效果:直接拒绝(0)、排队等待(2)、慢启动(1)、慢启动+排队(3)直接拒绝
clusterMode是否设置为集群模式

4.2.2 Nacos 熔断配置 

  1. [
  2. {
  3. "resource":"/user/getname",
  4. "grade":0,
  5. "count":10,
  6. "timeWindow":3,
  7. "minRequestAmount":1,
  8. "statIntervalMs":1000,
  9. "slowRatioThreshold":0.5
  10. }
  11. ]
Field说明
grade熔断策略,支持慢调用比例(0)、异常比例(1)、异常数策略(2)
count满调用比例模式下调用临界RT(超出改时间为满调用);异常比例/异常数模式下为对应的阈值
timeWindow熔断时长,单位为秒
minRequestAmount熔断触发的最小请求数,请求数小于该值时即使异常比率超过阈值也不会熔断
statIntervalMs统计时长,单位为ms
slowRatioThreshold满调用比例阈值,仅满调用比例模式有效

 4.2.3 热点参数配置

  1. [
  2. {
  3. "resource":"/user/getnamebyid",
  4. "grade":1,
  5. "count":2,
  6. "paramIdx":0,
  7. "controlBehavior":0,
  8. "paramFlowItemList":[
  9. {
  10. "classType":"Integer", #参数值类型
  11. "count":1,
  12. "object":"id" #参数名称
  13. }
  14. ]
  15. }
  16. ]
  1. @RequestMapping("/getnamebyid")
  2. @SentinelResource(value = "/user/getnamebyid")
  3. public String getNameById(Integer id) {
  4. // Thread.sleep(300);
  5. return "ID: "+new Random().nextInt(1000);
  6. }

4.2.4 授权规则配置

  1. [
  2. {
  3. "resource":"/user/getnamebyid",
  4. "strategy":0, #0为设置白名单,1为设置黑名单
  5. "limitApp":"qingkai,akai" #设置白名单,只有"qingkai" 和 "akai" 可以访问
  6. }
  7. ]

五、Gateway 整合 Sentinel

 5.1 添加框架依赖

  1. <dependency>
  2. <groupId>com.alibaba.cloud</groupId>
  3. <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>com.alibaba.cloud</groupId>
  7. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  8. </dependency>
  9. <dependency>
  10. <groupId>org.springframework.cloud</groupId>
  11. <artifactId>spring-cloud-starter-gateway</artifactId>
  12. </dependency>

5.2 设置配置文件

在 application 中设置 sentinel 控制台的地址,以及限流之后的影响信息:

  1. spring:
  2. sentinel:
  3. transport:
  4. dashboard: localhost:18080
  5. scg: #配置限流之后响应内容
  6. fallback:
  7. #两种方式,一种时 response 返回文字提示信息,
  8. #另一种时 redirect 重定向,配置 redirect 要配置对应调转的uri
  9. mode: response
  10. response-status: 200
  11. response-body: '{"code"429,"message":"被限流了“}'

重定向配置:

  1. spring:
  2. cloud:
  3. sentinel:
  4. transport:
  5. dashboard: localhost:18080
  6. scg: #配置限流之后响应内容
  7. fallback:
  8. #两种方式,一种时 response 返回文字提示信息,
  9. #另一种时 redirect 重定向,配置 redirect 要配置对应调转的uri
  10. mode: redirect
  11. redirect: https://www.baidu.com

5.3 设置限流和熔断规则

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/889140
推荐阅读
相关标签
  

闽ICP备14008679号