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 框架依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2.1.2 定义资源

1.通过代码定义资源

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

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

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

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

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

    @RequestMapping("/getnamebyid")@SentinelResource(value = "getnamebyid",blockHandler = "myblockHandler",fallback = "otherhandler")public String getNameById(Integer id){int  num=new Random().nextInt(100);System.out.println(num);int i = num / 0;
//            throw new RuntimeException();return "ID: "+new Random().nextInt(1000);}public String myblockHandler(Integer id,BlockException blockException){return "被限流了";}public String otherhandler(Integer id,Throwable e){return "其他异常";}

注意事项

  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 定义规则

@SpringBootApplication
public class SentinelDemoApplication {public static void main(String[] args) {SpringApplication.run(SentinelDemoApplication.class, args);initFlowRules();}public static void initFlowRules(){List<FlowRule> rules=new ArrayList<>();FlowRule rule=new FlowRule();rule.setResource("getnamebyid");rule.setGrade(RuleConstant.FLOW_GRADE_QPS);rule.setCount(1);rule.setStrategy(RuleConstant.STRATEGY_DIRECT);rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);rule.setClusterMode(false);rules.add(rule);FlowRuleManager.loadRules(rules);}}//热点参数流控规则(需要配合@SentinelResource 使用)public static void initFlowRules(){List<ParamFlowRule> rules = new ArrayList<>();List<ParamFlowItem> paramFlowItemList=new ArrayList<>();ParamFlowItem paramFlowItem1 = new ParamFlowItem();paramFlowItem1.setClassType(Integer.class.getName()); // 参数类型为 StringparamFlowItem1.setCount(2);paramFlowItem1.setObject("id"); // 参数名为 idparamFlowItemList.add(paramFlowItem1);// 设置热点参数流控规则ParamFlowRule paramFlowRule = new ParamFlowRule("/user/getnamebyid") // 对应的资源名.setParamIdx(0) // 参数的索引,从0开始,如果方法参数中的第一个参数是id,则索引为0.setGrade(RuleConstant.FLOW_GRADE_QPS) // 参数限流的阈值类型,比如QPS.setCount(2)  // 参数的阈值.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT).setParamFlowItemList(paramFlowItemList);rules.add(paramFlowRule);ParamFlowRuleManager.loadRules(rules);}@RequestMapping("/getnamebyid")@SentinelResource(value = "/user/getnamebyid")public String getNameById(Integer id) {
//        Thread.sleep(300);return "ID: "+new Random().nextInt(1000);}//    授权规则public static void initFlowRules(){List<AuthorityRule> rules=new ArrayList<>();AuthorityRule rule=new AuthorityRule();rule.setResource("/user/getnamebyid");rule.setStrategy(RuleConstant.AUTHORITY_WHITE);rule.setLimitApp("qingkai,akai"); //设置白名单,只有"qingkai" 和 "akai" 可以访问rules.add(rule);AuthorityRuleManager.loadRules(rules);}

其中:

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 实现熔断(降级)功能

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

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

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

2.3 判断时熔断还是限流

    public String myblockHandler(Integer id,BlockException blockException){if(blockException instanceof FlowException){return "被限流了";}if(blockException instanceof DegradeException){return "被熔断了";}return "请求被限制了";}

三、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依赖:

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

在项目中配置 Sentinel Dashboard 地址:

spring:application:name: sentinel-servicecloud:sentinel:transport:dashboard: localhost:1234client-ip: 127.0.0.1port: 8720heartbeat-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 新增授权规则

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

 

@Component
public class CustomerRequestOriginParser implements RequestOriginParser {@Overridepublic String parseOrigin(HttpServletRequest request) {String origin=request.getHeader("origin");if(!StringUtils.hasLength(origin)){origin="blank";}return origin;}
}

此时只有请求头中含有 "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 局部自定义异常

    @RequestMapping("/getnamebyid")@SentinelResource(value = "getnamebyid",blockHandler = "myblockHandler")public String getNameById(Integer id) throws InterruptedException {
//        Thread.sleep(300);return "ID: "+new Random().nextInt(1000);}public String myblockHandler(Integer id,BlockException blockException){if(blockException instanceof FlowException){return "被限流了";}if(blockException instanceof DegradeException){return "被熔断了";}return "请求被限制了";}

3.4.2 全局自定义异常

@Component
public class globalException implements BlockExceptionHandler {@Overridepublic void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {String msg="未知异常";int code= HttpStatus.TOO_MANY_REQUESTS.value();if(e instanceof FlowException){msg="您被限流了";}else if (e instanceof DegradeException){msg="您被熔断了";}else if(e instanceof AuthorityException){msg="没有访问权限";}else if(e instanceof ParamFlowException){msg="请求热点参数被限流";}httpServletResponse.setContentType("application/json;charset=utf8");httpServletResponse.setStatus(code);httpServletResponse.getWriter().println("{\"msg\":"+msg+",\"code\":"+code+",\"data\":[]");}
}

3.4.3 系统自定义异常

@RestControllerAdvice
public class SystemException{@ExceptionHandler(BlockException.class)public String handlerException(Exception e){if(e instanceof ParamFlowException){return "请求出发了热点限流了!!!"; }return "限流";}
}

四、使用 Nacos 持久化规则

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

4.1 添加依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

4.2 配置数据源

spring:application:name: sentinel-servicecloud:sentinel:transport:dashboard: localhost:18080datasource:ds:nacos:server-addr: localhost:8848username: nacospassword: nacosdata-id: ${spring.application.name}-flow-rulesgroup-id: DEFAULT_GROUPdata-type: jsonrule-type: flow #限流ds2:nacos:server-addr: localhost:8848username: nacospassword: nacosdata-id: ${spring.application.name}-degrade-rulesgroup-id: DEFAULT_GROUPdata-type: jsonrule-type: degrade #熔断ds3:nacos:server-addr: localhost:8848username: nacospassword: nacosdata-id: ${spring.application.name}-paramflow-rulesgroup-id: DEFAULT_GROUPdata-type: jsonrule-type: param_flow #热点限流ds4:nacos:server-addr: localhost:8848username: nacospassword: nacosdata-id: ${spring.application.name}-paramflow-rulesgroup-id: DEFAULT_GROUPdata-type: jsonrule-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 限流配置

[{"resource":"/user/getnamebyid","limitApp":"default","grade":1,"count":1,"strategy":0,"controlBehavior":0,"clusterMode":false}
]

 属性说明:

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

4.2.2 Nacos 熔断配置 

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

 4.2.3 热点参数配置

[{"resource":"/user/getnamebyid","grade":1,"count":2,"paramIdx":0,"controlBehavior":0,"paramFlowItemList":[{"classType":"Integer", #参数值类型"count":1,"object":"id" #参数名称}]}
]
    @RequestMapping("/getnamebyid")@SentinelResource(value = "/user/getnamebyid")public String getNameById(Integer id) {
//        Thread.sleep(300);return "ID: "+new Random().nextInt(1000);}

4.2.4 授权规则配置

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

五、Gateway 整合 Sentinel

 5.1 添加框架依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

5.2 设置配置文件

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

spring:   sentinel:transport:dashboard: localhost:18080scg: #配置限流之后响应内容fallback:#两种方式,一种时 response 返回文字提示信息,#另一种时 redirect 重定向,配置 redirect 要配置对应调转的urimode: responseresponse-status: 200response-body: '{"code"429,"message":"被限流了“}'

重定向配置:

spring:cloud:sentinel:transport:dashboard: localhost:18080scg: #配置限流之后响应内容fallback:#两种方式,一种时 response 返回文字提示信息,#另一种时 redirect 重定向,配置 redirect 要配置对应调转的urimode: redirectredirect: https://www.baidu.com

5.3 设置限流和熔断规则

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3269347.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Power App学习笔记以及基础项目管理demo

Power App学习笔记以及基础项目管理demo 最近学习了一点Power App&#xff0c;感觉挺有意思。配置式组件开发。浅浅记录一下自己实现的项目管理系统&#xff08;即Excel数据的增删改查&#xff09;关于函数的一点皮毛认识。 效果图 筛选数据 编辑 详情 数据源 PowerApp 网…

流量录制与回放:jvm-sandbox-repeater工具详解

在软件开发和测试过程中&#xff0c;流量录制与回放是一个非常重要的环节&#xff0c;它可以帮助开发者验证系统在特定条件下的行为是否符合预期。本文将详细介绍一款强大的流量录制回放工具——jvm-sandbox-repeater&#xff0c;以及如何利用它来提高软件测试的效率和质量。 …

如何在Selenium Webdriver中点击SVG元素?

我们将在URL上单击下面突出显示的SVG元素&#xff1a;https&#xff1a;//testkru.com/Elements/SVGelemnts。 有几种方法可以点击SVG元素&#xff0c;我们将在这篇文章中讨论它们&#xff0c;并讨论它们之间应该首选哪一种。 使用 WebElement Click() 通过使用Action Click() …

vue3 Router 点击index中的按钮,查看相应的详情信息,并且传递id,及其路由的定义方法。

1、路由的定义 结构如下: 2、路由定义代码&#xff1a; {path: tabs,name: TabsDemo,component: () > import(/views/demo/feat/tabs/index.vue),meta: {title: t(routes.demo.feat.tabs),hideChildrenInMenu: true,},children: [{path: detail/:id,name: TabDetail,compon…

maven介绍 搭建Nexus3(maven私服搭建)

Maven是一个强大的项目管理工具&#xff0c;它基于项目对象模型&#xff08;POM&#xff1a;Project Object Model&#xff09;的概念&#xff0c;通过XML格式的配置文件&#xff08;pom.xml&#xff09;来管理项目的构建 Maven确实可以被视为一种工程管理工具或项目自动化构…

SpringcloudAlibaba详解---超详细

简介 Spring Cloud Alibaba是阿里巴巴结合自身的微服务实践开源的微服务全家桶&#xff0c;我个人觉得其组件比Spring Cloud 中的组件更加好用和强大。并且对的Spring Cloud组件做了很好的兼容。比如在Spirng Cloud Alibaba中依然可以使用Feign作为服务调用方式&#xff0c;使…

Mac如何在某个目录下快速打开iTerm2

最近喜欢上用Mac了&#xff0c;为了让自己用的更顺手和快速&#xff0c;设置了一堆快捷键&#xff0c;这里主要记录一下如何在某个文件夹下快速打开某一个软件。 然后你要快速再某一个文件夹路径下打开iTerm2这个软件&#xff0c;就鼠标选中文件夹&#xff0c;然后直接按快捷键…

一文带你搞懂C++运算符重载

7. C运算符重载 C运算符重载 什么是运算符重载 运算符重载赋予运算能够操作自定义类型。 运算符重载前提条件&#xff1a; 必定存在一个自定义类型 运算符重载实质: 就是函数调用 友元重载 类重载 在同一自定义类型中&#xff0c;一个运算符只能被重载一次 C重载只能重载…

2024年国际高校数学建模竞赛问题B:空间迁移计划和战略 成品文章分享

2024年国际高校数学建模竞赛问题B&#xff1a;空间迁移计划和战略&#xff08;2024 International Mathematics Molding Contest for Higher Education (IMMCHE)Problem B: Space Migration Program and Strategy&#xff09; 星际迁移计划中的资源分配与风险管理策略研究 摘…

【计算机网络】数据链路层实验

一&#xff1a;实验目的 1&#xff1a;学习WireShark软件的抓包操作&#xff0c;分析捕获的以太网的MAC帧结构。 2&#xff1a;学习网络中交换机互相连接、交换机连接计算机的拓扑结构&#xff0c;理解虚拟局域网&#xff08;WLAN&#xff09;的通信机制。 3&#xff1a;学习…

什么材质的挖耳勺好用?硬核上佳产品分享!

耳道健康随着生活品质的提高&#xff0c;逐渐被大家重视。因为它会直接影响我们的听力和卫生健康&#xff0c;如果长时间不清理&#xff0c;很容易堵塞在耳膜里导致耳鸣头晕等状况。挖耳勺的材质非常多&#xff0c;有铁质、不锈钢、软硅胶等等&#xff0c;那么什么材质的挖耳勺…

2024年国际高校数学建模竞赛问题B:空间迁移计划和战略完整思路 模型 代码 结果分享(仅供学习)

2024年国际高校数学建模竞赛问题B&#xff1a;空间迁移计划和战略&#xff08;2024 International Mathematics Molding Contest for Higher Education (IMMCHE)Problem B: Space Migration Program and Strategy&#xff09; 我们的未来有两种可能性:第一&#xff0c;我们将留…

国科大作业考试资料《人工智能原理与算法》2024新编-第十三次作业整理

1、假设我们从决策树生成了一个训练集&#xff0c;然后将决策树学习应用于该训练集。当训练集的大小趋于无穷时&#xff0c;学习算法将最终返回正确的决策树吗&#xff1f;为什么是或不是&#xff1f; 本次有两个参考&#xff1a; 参考一&#xff1a; 当训练集的大小趋于无穷…

飞牛爬虫FlyBullSpider 一款简单方便强大的爬虫,限时免费 特别适合小白!用它爬下Boss的2024年7月底Java岗位,分析一下程序员就业市场行情

一、下载安装FlyBullSpider 暂时支持Window,现在只在Win11上做过测试 1 百度 点击百度网盘 下载 链接&#xff1a;https://pan.baidu.com/s/1gSLKYuezaZgd8iqrXhk8Kg 提取码&#xff1a;Fly6 2 csdn https://download.csdn.net/download/fencer911/89584687 二、体验初…

C++(入门1)

C参考文档 Reference - C Reference C 参考手册 - cppreference.com cppreference.com 第一个C程序 #include<stdio.h> int main() {printf("Hello C\n");return 0; }由上述代码可知C是兼容C语言 第一个C标准程序 #include<iostream> using names…

Python教程(一):环境搭建及PyCharm安装

目录 引言1. Python简介1.1 编译型语言 VS 解释型语言 2. Python的独特之处3. Python应用全览4. Python版本及区别5. 环境搭建5.1 安装Python&#xff1a; 6. 开发工具&#xff08;IDE&#xff09;6.1 PyCharm安装教程6.2 永久使用教程 7. 编写第一个Hello World结语 引言 在当…

NO.1 Hadoop概述

目录 1.1 Hadoop是什么​编辑 1.2 Hadoop优势​编辑​编辑 1.3 Hadoop组成​编辑 1.3.1 HDFS架构概述 ​编辑 1.3.2 YARN架构概述 ​编辑 1.3.3 MapReduce架构概述​编辑 1.3.4 HDFS、YARN、MapReduce三者关系 1.4 大数据技术生态体系 1.5 推荐系统框架图 1.1 Hadoop…

Prometheus各类监控及监控指标和告警规则

目录 linux docker监控 linux 系统进程监控 linux 系统os监控 windows 系统os监控 配置文件&告警规则 Prometheus配置文件 node_alert.rules docker_container.rules mysql_alert.rules vmware.rules Alertmanager告警规则 consoul注册服务 Dashboard JSON…

ARM32开发——PWM蜂鸣器案例

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 需求原来的驱动移植操作替换初始化 更新Play函数完整代码 需求 通过控制PB9来播放音乐&#xff0c;PB9对应的定时器通道&#xff1…

Web3 职场新手指南:从技能到素养,求职者如何脱颖而出?

随着 2024 年步入下半年&#xff0c;Web3 行业正在经历一系列技术革新。通过改进的跨链交互机制和兼容性&#xff0c;逐步消除市场碎片化的问题。技术的进步为开发者和用户都打开了新的前景。然而&#xff0c;复杂的技术和快速变化的市场环境也让许多新人望而却步。求职者如何找…