美文网首页
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
  }
]

相关文章

  • 今日份打卡 195/365

    技术文章限流熔断技术Sentinel

  • spring cloud之sentinal

    Sentinel 原理-全解析 - 简书 sentinal - 简书 限流 熔断

  • Spring Cloud Alibaba:Sentinel实现熔

    Spring Cloud Alibaba:Sentinel实现熔断与限流 Spring Cloud Alibaba...

  • Sentinel限流熔断

    服务限流的作用及实现限流的主要目的是通过限制并发数访问或者限制同一个时间窗口允许处理的请求数量来保护系统。提供稳定...

  • sentinel限流熔断

    Sentinel是面向分布式服务框架的轻量级流量控制框架,主要以流量为切入点,从流量控制,熔断降级,系统负载保护等...

  • sentinel 流控

    sentinel 入口看这个合适: 转载:这个注解一次搞定限流与熔断降级:@SentinelResource - ...

  • Sentinel熔断降级限流

    网址[https://github.com/alibaba/Sentinel/wiki/%E5%A6%82%E4%...

  • spring cloud alibaba系列(二)Sentine

    限流组件Sentinel Sentinel是把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务...

  • Alibaba Sentinel LeapArray 源码分析

    最近在使用Alibaba Sentinel来做服务的限流、熔断和降级。一直有一个比较好奇的点,Sentinel是如...

  • Sentinel 的熔断与限流

    sentinel是什么? Sentinel 是阿里中间件团队研发的面向分布式服务架构的轻量级高可用流量控制组件,于...

网友评论

      本文标题:sentinel限流熔断

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