sentinel流控及降级持久化

简介:

为什么要对sentinel进行流控及降级持久化呢?因为当我们启动java应用程序后,被http调用的接口可以在sentinel中设置限流以及降级规则,但当你重启java应用程序的时候 会发现,之前设置过的限流规则以及降级的规则消失了,试想一下,接口少的时候还可以花一点点时间重新设置限流规则,但是接口多了怎么办,如果重启一次java应用就要重新设置规则的话, 那岂不是太浪费时间了。所以针对这种情况,我们可以将流控规则以及降级的规则持久化到nacos配置中

还不会限流以及降级的建议先看这篇文章:搭建SpringCloud-Alibaba框架

Pom

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

流控持久化

1、准备好要进行限流的接口

@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/testF")
    @SentinelResource(value = "testF", blockHandlerClass = SentinelCommonException.class,blockHandler = "flowException")
    public JsonResult testF() {
        return new JsonResult(200,"请求成功");
    }

}

注:@SentinelResource 自定义流控以及降级的异常的注解

①在nacos自定义的命名空间中创建配置

我的限流规则是:每秒钟Qps点击数为1,流控模式为直接模式,流控效果是直接

 

注:

Data ID:不要带 .properties或yaml 的后缀

配置格式:选择 json 选项

配置内容:

resource: 资源名称

limitApp: 来源应用

grade: 阈值类型,0表示线程,1表示QPS

count: 单机阈值

strategy: 流控模式,0表示直接,1表示关联,2表示链路

controlBehavior: 流控效果,0表示快速失败,1表示Warm Up,2表示排队等待

clusterMode: 是否集群

②application.properties

spring.cloud.sentinel.datasource.ds1.nacos.namespace=dddf9ef6-638a-42fa-9b82-9c61a944f6cc
spring.cloud.sentinel.datasource.ds1.nacos.server-addr=localhost:8848
spring.cloud.sentinel.datasource.ds1.nacos.data-id=sentinel-datasource
spring.cloud.sentinel.datasource.ds1.nacos.group-id=DEFAULT_GROUP
spring.cloud.sentinel.datasource.ds1.nacos.data-type=json
spring.cloud.sentinel.datasource.ds1.nacos.rule-type=flow

data-typ == nacos中的 【配置格式】

rule-type:FLOW-流控、DEGRADE-降级。因为上面的配置是用于限流的,所以我们rule-type就选择 flow

测试:启动nacos、启动sentinel、启动java应用程序、请求接口

根据我设置的限流规则来看,我每秒钟点击数为2时,则会被限流

降级持久化

1、准备好要进行降级的接口

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {


    @GetMapping("/testG")
    @SentinelResource(value = "testG", blockHandlerClass = SentinelCommonException.class,blockHandler = "degradeException")
    public JsonResult testG() throws InterruptedException {
        SimpleDateFormat dateFormat = new SimpleDateFormat("mm:ss");
        String format = dateFormat.format(new Date());
        log.info("当前为开始时间:"+format);
        //睡1秒钟
        TimeUnit.SECONDS.sleep(1);
        String format1 = dateFormat.format(new Date());
        log.info("当前为结束时间:"+format1);
        return new JsonResult(200,"请求成功");
    }

}

2、降级规则持久化到 nacos 中​​​​​​​

流程跟上面的流控是一样的,我就不重复写了

规则含义

resource 资源名,即规则的作用对象

grade 熔断策略,支持慢调用比例/异常比例/异常数策略 慢调用比例

count 慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值

timeWindow 熔断时长,单位为 s

minRequestAmount 熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入) 5

statIntervalMs 统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入) 1000 ms

slowRatioThreshold 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)

对应关系

测试:启动nacos、启动sentinel、启动java应用程序、请求接口

 


版权声明:本文为qq_42227281原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。