Sentinel 入门与实战

news2024/11/26 12:19:02

一、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()); // 参数类型为 String
        paramFlowItem1.setCount(2);
        paramFlowItem1.setObject("id"); // 参数名为 id
        paramFlowItemList.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);
        //熔断时长,单位:s
        rule.setTimeWindow(5);
        //熔断触发的最小请求数,请求数小于该值时及时异常比率超出阈值也不会熔断
        rule.setMinRequestAmount(1);
        //统计时长,单位:ms
        rule.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-service
  cloud:
    sentinel:
      transport:
        dashboard: localhost:1234
        client-ip: 127.0.0.1
        port: 8720
        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 新增授权规则

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

 

@Component
public class CustomerRequestOriginParser implements RequestOriginParser {
    @Override
    public 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 {

    @Override
    public 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-service
  cloud:
    sentinel:
      transport:
        dashboard: localhost:18080
      datasource:
        ds:
          nacos:
            server-addr: localhost:8848
            username: nacos
            password: nacos
            data-id: ${spring.application.name}-flow-rules
            group-id: DEFAULT_GROUP
            data-type: json
            rule-type: flow #限流
        ds2:
          nacos:
            server-addr: localhost:8848
            username: nacos
            password: nacos
            data-id: ${spring.application.name}-degrade-rules
            group-id: DEFAULT_GROUP
            data-type: json
            rule-type: degrade #熔断
        ds3:
          nacos:
            server-addr: localhost:8848
            username: nacos
            password: nacos
            data-id: ${spring.application.name}-paramflow-rules
            group-id: DEFAULT_GROUP
            data-type: json
            rule-type: param_flow #热点限流
        ds4:
          nacos:
            server-addr: localhost:8848
            username: nacos
            password: nacos
            data-id: ${spring.application.name}-paramflow-rules
            group-id: DEFAULT_GROUP
            data-type: json
            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 限流配置

[
    {
        "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:18080
      scg: #配置限流之后响应内容
        fallback:
          #两种方式,一种时 response 返回文字提示信息,
          #另一种时 redirect 重定向,配置 redirect 要配置对应调转的uri
          mode: response
          response-status: 200
          response-body: '{"code"429,"message":"被限流了“}'

重定向配置:

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

5.3 设置限流和熔断规则

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

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

相关文章

U盘格式化后数据能恢复吗?恢复方法盘点!

在数字化时代&#xff0c;U盘已成为我们日常生活和工作中不可或缺的数据存储设备。然而&#xff0c;在使用过程中&#xff0c;我们有时可能会因为各种原因对U盘进行格式化&#xff0c;从而不慎删除了重要数据。那么&#xff0c;U盘格式化后数据能恢复吗&#xff1f; 首先&…

CANoe在使用时碰到的一些很少见的Bug

CANoe作为一款成熟且稳定的总线仿真与测试工具&#xff0c;深受汽车工程师们的喜爱。CANoe虽然稳定&#xff0c;但作为一个软件来说&#xff0c;在使用中总会出现一些或大或小的Bug。最近全球范围内的大规模蓝屏事件&#xff0c;是由某个安全软件引起的。而很多CANoe使用者最近…

vue3+fetch请求+接收到流式的markdown数据+一边gpt打字机式输出内容,一边解析markdown语法+highlight.js实现代码高亮

这个问题终于解决了&#xff01;好开心。 先看最终效果&#xff1a; video_20240724_141543_edit 项目背景&#xff1a;vue3 场景&#xff1a;像gpt一样可以对话&#xff0c;当用户发送问题之后&#xff0c;ai回复&#xff0c;ai是一部分一部分回复&#xff0c;像打印机式输出…

如何将本地代码上传到github

将本地文件上传到GitHub仓库的过程通常包括以下几个步骤&#xff1a; 一 创建GitHub仓库&#xff1a; 如果你还没有一个GitHub仓库&#xff0c;首先需要在GitHub上创建一个新的仓库。登录到你的GitHub账户&#xff0c;然后点击“New repository”按钮&#xff0c;填写仓库的相关…

在linux运维中为什么第一道防线是云防火墙,而不是waf

在Linux运维和云计算环境中&#xff0c;第一道防线通常是云防火墙&#xff08;Cloud Firewall&#xff09;&#xff0c;而不是Web应用防火墙&#xff08;WAF&#xff09;&#xff0c;主要是因为云防火墙提供了更基础和广泛的网络层安全控制。以下是一些关键原因&#xff1a; 1…

AGI思考探究过程中的意义、价值与乐趣 Ⅱ

鉴于LLM与RL两者间在整体学习范式、学习目标、模型结构的差异化与统一的考量&#xff0c;业内不少的思路尝试将两种思想融合在一起以期待AGI的突破&#xff0c;但结合后要么看着不是很巧妙&#xff0c;要不就是看起来很僵硬&#xff0c;总感觉像是一个过渡性的方法&#xff0c;…

C语言指针·入门用法超详解

目录 1. 什么是指针 2. 指针变量的定义格式 3. 指针的作用 3.1 查询数据 3.2 存储数据&#xff08;修改数据&#xff09; 3.3 操作其他函数中的变量 3.4 函数返回多个值 3.5 函数的结果和计算状态分开 1. 什么是指针 通过内存地址&#xff0c;指向的空间&#…

装饰大师——装饰模式(Java实现)

引言 大家好&#xff0c;上期我们介绍了装饰模式在Python中的实现&#xff0c;今天&#xff0c;我们将继续探讨装饰模式&#xff0c;并展示如何在Java中实现它。 装饰模式概述 装饰模式的核心思想是将功能附加到对象上&#xff0c;而不是通过继承来实现&#xff0c;这种模式…

【JavaSE-线程安全问题-死锁详解】

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a; c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 &#x1f308;…

HTML基础1-文本级元素

HTML 简介 什么是 HTML&#xff1f; HTML (HyperText Markup Language) 是一种用于创建网页的标准标记语言。它通过使用一系列预定义的元素来描述文档的结构和外观&#xff0c; 您可以使用 HTML 来建立自己的 WEB 站点。 HTML 的作用 HTML 用于定义网页的结构&#xff0c;…

快手文生图模型-Kolors快速上手

Kolors是什么 可图(Kolors)&#xff1a;用于真实感文本到图像合成的扩散模型的有效训练 可图&#xff0c;是快手开源的一个文生图模型&#xff0c;架构上使用了chatglm&#xff0c;比普通的sd模型在中文理解上要强大很多&#xff0c;以往sd模型的提示词理解能力往往只有两种 …

《BeanShell 在 JMeter 中的应用》总结

通过案例进行讲解 一、BeanShell 介绍 官网: http://www.BeanShell.org BeanShell 是一种完全符合 Java 语法规范的脚本语言&#xff0c;具有以下特点&#xff1a; 是一种松散类型的脚本语言&#xff0c;类似 JS。是用 Java 写成的小型、免费、可下载的嵌入式 Java 源代码解…

计算机毕业设计选题推荐-零食批发商仓库管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

LocalDateTime的序列化和反序列化

背景 最近定位出一个LocalDateTime序列化相关的问题&#xff0c;简单记录一下。本文重点介绍Jackson对LocalDateTime的序列化和反序列化&#xff0c;并结合Spring应用场景进行介绍。 1.LocalDateTime与字符串转换 可以通过DateTimeFormatter实现LocalDateTime与字符串的相互…

Windows远程桌面无法拷贝文件问题

场景说明 Winwdows远程桌面&#xff0c;相比Linux方便一点就是&#xff0c;同是windows连接&#xff0c;其中复制粘贴功能&#xff0c;可以在两个windows无缝切换。 但最近笔者远程一台测试windows服务器时&#xff0c;发现无法在服务器上复制内容到本地&#xff0c;也无法从…

西门子s7第三方(S7netplus)读写操作

和西门子PLC通讯需要使用S7netplus​​这个包&#xff0c;可以在NuGet​​上搜索下载&#xff0c;下载后引入命令空间using S7.Net;​​ 创建PLC对象进行连接使用Write Read进行读写操作即可不需要在发请求帧 //创建Plc对象Plc plc; //西门子设备是s7-1200//参数1 CPu类型//参…

微信小程序+JAVA实现微信支付

时隔两年再次回归 本文主要讲的是小程序实现微信支付功能&#xff0c;后台采用JAVA。 一.准备工作 1.小程序 2.微信商户号 1.商户号申请 这里对小程序的申请不做赘述。 如果没有微信商户号的同学&#xff0c;点击该链接https://pay.weixin.qq.com/&#xff0c;按照下属步骤…

低代码与人工智能的融合:加速应用开发的未来趋势

什么是低代码&#xff0c;它是如何工作的&#xff1f; 低代码是一种软件开发概念&#xff0c;它通过最小化手工编码的方式&#xff0c;为开发和部署定制化应用提速。低代码平台具备模型驱动、沙盒多环境、可编程的可视化开发方式等&#xff0c;能用于开发包含有用户界面、业务逻…

二叉树——链式结构的实现

首先是分为三个文件进行实现&#xff1a;tree.h、tree.c、test.c tree.h 用链表来表示⼀棵⼆叉树&#xff0c;即用链来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成&#xff0c;数据域和左右指针域&#xff0c;左右指针分别用来给出该结点左孩⼦和右孩⼦所在…