阿里限流神器Sentinel夺命连环 17 问? (10)

很多人好奇JOSN中的配置到底怎么写?其实很简单,陈某在介绍各种规则的时候都明确告诉你每种规则对应源码中的实现类,比如流控规则对应的类就是com.alibaba.csp.sentinel.slots.block.flow.FlowRule,JOSN中各个属性也是来源于这个类。

下面陈某列出各个规则的JSON配置,开发中照着改即可。

1、流控规则

[ { // 资源名 "resource": "/test", // 针对来源,若为 default 则不区分调用来源 "limitApp": "default", // 限流阈值类型(1:QPS;0:并发线程数) "grade": 1, // 阈值 "count": 1, // 是否是集群模式 "clusterMode": false, // 流控效果(0:快速失败;1:Warm Up(预热模式);2:排队等待) "controlBehavior": 0, // 流控模式(0:直接;1:关联;2:链路) "strategy": 0, // 预热时间(秒,预热模式需要此参数) "warmUpPeriodSec": 10, // 超时时间(排队等待模式需要此参数) "maxQueueingTimeMs": 500, // 关联资源、入口资源(关联、链路模式) "refResource": "rrr" } ]

2、降级规则

[ { // 资源名 "resource": "/test1", "limitApp": "default", // 熔断策略(0:慢调用比例,1:异常比率,2:异常计数) "grade": 0, // 最大RT、比例阈值、异常数 "count": 200, // 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入) "slowRatioThreshold": 0.2, // 最小请求数 "minRequestAmount": 5, // 当单位统计时长(类中默认1000) "statIntervalMs": 1000, // 熔断时长 "timeWindow": 10 } ]

3、热点规则

[ { // 资源名 "resource": "/test1", // 限流模式(QPS 模式,不可更改) "grade": 1, // 参数索引 "paramIdx": 0, // 单机阈值 "count": 13, // 统计窗口时长 "durationInSec": 6, // 是否集群 默认false "clusterMode": 默认false, // "burstCount": 0, // 集群模式配置 "clusterConfig": { // "fallbackToLocalWhenFail": true, // "flowId": 2, // "sampleCount": 10, // "thresholdType": 0, // "windowIntervalMs": 1000 }, // 流控效果(支持快速失败和匀速排队模式) "controlBehavior": 0, // "limitApp": "default", // "maxQueueingTimeMs": 0, // 高级选项 "paramFlowItemList": [ { // 参数类型 "classType": "int", // 限流阈值 "count": 222, // 参数值 "object": "2" } ] } ]

4、系统规则

负值表示没有阈值检查。不需要删除参数

[ { // RT "avgRt": 1, // CPU 使用率 "highestCpuUsage": -1, // LOAD "highestSystemLoad": -1, // 线程数 "maxThread": -1, // 入口 QPS "qps": -1 } ]

5、授权规则

[ { // 资源名 "resource": "sentinel_spring_web_context", // 流控应用 "limitApp": "/test", // 授权类型(0代表白名单;1代表黑名单。) "strategy": 0 } ]

注意:对于上述JOSN中的一些可选属性不需要的时候可以删除。

官方文档:https://github.com/alibaba/Sentinel/wiki/在生产环境中使用-Sentinel

15、限流规则如何推送到Nacos进行持久化?

sentinel默认的持久化只能从nacos推送到sentinel控制台,但是实际生产中肯定是双向修改都能推送的,这个如何解决呢?

其实sentinel官方文档就有说到解决方法,不过需要自己修改sentinel控制台的源码来实现。

这个还是比较复杂的,sentinel只帮我们实现了流控规则的demo,其他的还是要自己修改,这点不太人性化....

在这之前需要自己下载对应版本的sentinel控制台的源码,地址:https://github.com/alibaba/Sentinel/tags

流控规则源码修改

在源码的test目录下有sentinel提供的demo,分别有apollo、nacos、zookeeper,如下图:

阿里限流神器Sentinel夺命连环 17 问?

这里我们是Nacos,因此只需要nacos包下面的demo。修改步骤如下:

1、去掉sentinel-datasource-nacos依赖的scop

这个sentinel-datasource-nacos依赖默认是<scope>test</scope>,因此我们需要去掉这个,如下:

<!-- for Nacos rule publisher sample --> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> </dependency>

如果你集成的zookeeper或者apollo,则把相应的依赖也要修改。

2、复制test环境下的nacos整个包到main下

将这个nacos包复制到com.alibaba.csp.sentinel.dashboard.rule这个包下,如下图:

阿里限流神器Sentinel夺命连环 17 问?

3、将FlowControllerV2中的代码复制到FlowControllerV1中

com.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2这个是sentinel提供的demo,只需要将其中的代码全部覆盖到com.alibaba.csp.sentinel.dashboard.controller.FlowControllerV1中。

4、修改FlowControllerV1中的代码

直接覆盖掉当然不行,还要做一些修改,如下:

修改RequestMapping中的请求url为/v1/flow

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzzxyf.html