美文网首页
sentinel限流熔断

sentinel限流熔断

作者: sunpy | 来源:发表于2022-08-03 10:24 被阅读0次

    Sentinel是面向分布式服务框架的轻量级流量控制框架,主要以流量为切入点,从流量控制,熔断降级,系统负载保护等多个维度来维护系统的稳定性。

    启动nacos-server:2.0.3


    ./nacos/bin/startup.cmd

    启动sentinel:1.8.2服务器


    sentinel搞个bat命令

    java -server -Xms64m -Xmx256m  -Dserver.port=8858 -Dcsp.sentinel.dashboard.server=127.0.0.1:8858 -Dproject.name=sentinel-dashboard -jar F:/tools/springcloud-alibaba/sentinel/sentinel-dashboard-1.8.2.jar
    

    sentinel实现限流


    导包:

    <!--springcloud alibaba sentinel-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
    
    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-core</artifactId>
    </dependency>
    
    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-datasource-nacos</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    

    配置application.yml:我将sentinel交给nacos管理。

    server:
      port: 3801
    spring:
      application:
        name: teacher-service
      devtools:
        restart:
          enabled: true  #设置开启热部署
          additional-paths: src/main/java #重启目录
          exclude: WEB-INF/**
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848/
        sentinel:
          transport:
            # sentinel服务端地址
            dashboard: 127.0.0.1:8858
          # 取消延迟加载
          eager: true
          datasource:
            ds:
              nacos:
                server-addr: 127.0.0.1:8848
                data-id: ${spring.application.name}-sentinel
                group-id: DEFAULT_GROUP
                rule-type: flow
    

    一般限流组件,都会提供,fallback,达到阙值返回信息:

    @SentinelResource(value="listTeacher", fallback = "fallbackResult")
    @GetMapping("/list")
    public ResultModel<Object> listTeacher() {
        ResultModel<Object> resultModel = new ResultModel<>();
        resultModel.setMsg("查询教师列表");
        resultModel.setRes(data);
        return resultModel;
    }
    
    public ResultModel<Object> fallbackResult() {
        ResultModel<Object> resultModel = new ResultModel<>();
        resultModel.setCode(500);
        resultModel.setSuccess(false);
        resultModel.setMsg("当前系统已经达到阙值,请稍后访问!");
        resultModel.setTime(TimeUtil.getNowTime());
        log.info("flow exception:" + "当前系统已经达到阙值,请稍后访问!");
        return resultModel;
    }
    
    在sentinel平台配置限流选项:
    使用jmeter压测:

    在第三个请求,开始出现系统限流返回:

    sentinel实现限流持久化


    问题:我发现每次我重启项目之后,发现之前配置的限流,都找不到了。还需要重新配置,很麻烦。
    我将sentinel托管给nacos管理持久化:
    yml文件:

    cloud:
      nacos:
        discovery:
          server-addr: 127.0.0.1:8848/
      sentinel:
        transport:
          # sentinel服务端地址
          dashboard: 127.0.0.1:8858
        # 取消延迟加载
        eager: true
        datasource:
          ds:
            nacos:
              server-addr: 127.0.0.1:8848 #nacos服务器地址
              data-id: ${spring.application.name}-sentinel #数据唯一id
              group-id: DEFAULT_GROUP #所属组
              rule-type: flow # flow代表流程控制,degrade代表熔断规则
    

    nacos控制台配置:

    [
        {
            "resource": "listTeacher",
            "limitApp": "default",
            "grade": 1,
            "count": 3,
            "strategy": 0,
            "controlBehavior": 0,
            "clusterMode": false
        }
    ]
    

    resource:资源名,即限流规则的作用对象
    limitApp:流控针对的调用来源,若为 default 则不区分调用来源
    grade:限流阈值类型(QPS 或并发线程数);0 代表根据并发数量来限流,1 代表根据 QPS 来进行流量控制
    count:限流阈值
    strategy:调用关系限流策略
    controlBehavior:流量控制效果(直接拒绝、Warm Up、匀速排队)
    clusterMode:是否为集群模式

    注意:dataid和group应与配置对应



    查看nacos是否将配置写入到数据库中:



    sentinel平台查看:

    sentinel实现熔断


    server:
      port: 3802
    spring:
      application:
        name: student-service
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848/
        sentinel:
          transport:
            # sentinel服务端地址
            dashboard: 127.0.0.1:8858
          # 取消延迟加载
          eager: true
          datasource:
            ds:
              nacos:
                server-addr: 127.0.0.1:8848
                data-id: ${spring.application.name}-sentinel-degrade
                group-id: DEFAULT_GROUP
                rule-type: degrade
    

    一般熔断组件,都会提供,fallback,达到熔断返回信息:

    @Log
    @RequestMapping("/student")
    @RestController
    public class StudentController {
    
        @SentinelResource(value="getStudent", fallback = "fallbackResult")
        @GetMapping("/get")
        public ResultModel<String> getStudent(){
    
            ResultModel<String> resultModel = new ResultModel<String>();
            resultModel.setMsg("查询学生信息成功");
            resultModel.setRes("学生名称为李四");
            throw new CommonException("自行抛出异常");
            //return resultModel;
        }
    
        public ResultModel<Object> fallbackResult() {
            ResultModel<Object> resultModel = new ResultModel<>();
            resultModel.setCode(500);
            resultModel.setSuccess(false);
            resultModel.setMsg("当前系统已经熔断,请稍后访问!");
            resultModel.setTime(TimeUtil.getNowTime());
            log.info("flow exception:" + "当前系统已经熔断,请稍后访问!");
            return resultModel;
        }
    }
    

    在sentinel平台配置熔断选项:



    RT(平均响应时间):
    当资源的平均响应时间超过阈值之后,资源进入准降级状态。接下来如果持续进入 5 个请求,它们的 RT 都持续超过这个阈值,那么在接下的时间窗口之内,对这个方法的调用都会自动抛出 DegradeException 异常。在下一个时间窗口到来时, 会接着再放入 5 个请求, 再重复上面的判断.
    异常比例
    当资源的每秒异常总数占通过量的比值超过阈值之后,资源进入降级状态,即在接下的时间窗口之内,对这个方法的调用都会自动地抛出 DegradeException 异常。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
    异常数
    当资源近 1 分钟的异常数目超过阈值之后会进行熔断。



    持久化配置:
    [
        {
        "resource": "getStudent",
        "count": 0.5,
        "grade": 1,
        "passCount": 0,
        "timeWindow": 30
      }
    ]
    

    相关文章

      网友评论

          本文标题:sentinel限流熔断

          本文链接:https://www.haomeiwen.com/subject/jyxjwrtx.html