整合Sentinel

应用整合Sentinel

在dependencies中添加依赖,即可整合Sentinel

 
  1. <dependency>
  2. <groupId>com.alibaba.cloud</groupId>
  3. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  4. </dependency>

搭建Sentinel控制台

可以从这个地址:Releases · alibaba/Sentinel · GitHub 下载控制台应用。因为下载速度较慢,给出一个我下载的版本(1.6.3)

百度云地址:链接: 百度网盘-链接不存在 密码: i68g

运行命令启动控制台:java -jar sentinel-dashboard-1.6.3.jar

打开浏览器,输入http://localhost:8080进入控制台页面(账号密码默认sentinel)
 

应用整合Sentinel控制台

添加配置文件:

 
  1. spring:
  2. cloud:
  3. sentinel:
  4. transport:
  5. # 指定sentinel控制台地址
  6. dashboard: localhost:8080

PS:其他的配置项

 
  1. spring:
  2. cloud:
  3. sentinel:
  4. transport:
  5. # 指定sentinel控制台地址
  6. dashboard: localhost:8080
  7. # 指定和控制台通信的IP,若不配置,会自动选择一个IP注册
  8. client-ip: 127.0.0.1
  9. # 指定和控制台通信的端口哦,默认值8719
  10. # 若不配置,会自动扫猫从8719开始扫猫,依次+1,知道值找到未被占用的端口
  11. port: 8719
  12. # 心跳发送周期,默认值null
  13. # 但在SimpleHttpHeartbeatSender会用默认值10秒
  14. heartbeat-interval-ms: 10000

这样,就为应用整合好Sentinel了,应用发生请求后,控制台如下:
 

控制台配置规则

流控规则

打开Sentinel控制台,点击簇点链路,可以看见微服务曾经被访问过的路径
 

点击流控按钮,便可以为应用设置流控规则
 

  • 资源名:唯一名称,默认请求路径
  • 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)
  • 阈值类型/单机阈值:
    • QPS(每秒钟的请求数量):当调用该api的QPS达到阈值的时候,进行限流
    • 线程数:当调用该api的线程数达到阈值的时候,进行限流
  • 是否集群:不需要集群,暂不研究
  • 流控模式:
    • 直接:api达到限流条件时,直接限流
    • 关联:当关联的资源达到阈值时,就限流自己
    • 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【api级别的针对来源】
  • 流控效果:
    • 快速失败:直接失败,抛异常
    • Warm Up:根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值
    • 排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效

降级规则(断路器模式)

点击降级按钮,便可以为应用设置降级规则
 

降级策略:

  • RT:平均响应时间(秒级统计)超出阈值且在时间窗口内的请求 >= 5时,触发降级;时间窗口结束后,关闭降级【Sentinel默认最大的RT为4900ms,可以通过-Dcsp.sentinel.statistic.max.rt=xxx修改】
  • 异常比例:QPS >= 5 且异常比例(秒级统计)超过阈值时,触发降级;时间窗口结束后,关闭降级
  • 异常数:异常数(分钟统计)超过阈值时,触发降级;时间窗口结束后,关闭降级【时间窗口 < 60秒可能会出现问题】

热点规则(热点参数限流规则)

Sentinel默认显示的端点并不支持热点规则,要显示热点规则,需要自己添加代码:

 
  1. @GetMapping("test")
  2. @SentinelResource("test")
  3. public String testHot(@RequestParam(required = false) String a,
  4. @RequestParam(required = false) String b) {
  5. return a + "-" + b;
  6. }

点击热点按钮,便可以为test设置热点规则
 

在时间窗口以内,一旦该api指定索引的参数QPS达到了域名,就会触发限流

  • 参数索引:从0开始,上面的代码中:a的参数索引为0;b的参数索引为1【参数索引对应的参数必须时基本类型或者String】

系统规则

阈值类型

  • LOAD(仅对 Linux/Unix-like 机器生效):当系统 load1 超过阈值,且系统当前的并发线程数超过系统容量时才会触发系统保护。系统容量由系统的 maxQps * minRt 计算得出。设定参考值一般是 CPU cores * 2.5
  • RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒
  • 线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护
  • 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护
  • CPU 使用率:当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0)

授权规则

点击授权按钮,便可以为应用设置授权规则
 

资源名所代表的资源只允许流控应用中添加的微服务使用(白名单)、不允许使用(黑名单)

代码配置规则

流控规则

参数

Field说明默认值
resource资源名,资源名是限流规则的作用对象
count限流阈值
grade限流阈值类型,QPS 或线程数模式QPS模式
limitApp流控针对的调用来源default,代表不区分调用来源
strategydefault,代表不区分调用来源根据资源本身
controlBehavior流控效果(直接拒绝 / 排队等待 / 慢启动模式)直接拒绝

代码

 
  1. private void initFlowQpsRule() {
  2. List<FlowRule> rules = new ArrayList<>();
  3. FlowRule rule = new FlowRule(resourceName);
  4. // 设置QPS阈值为20
  5. rule.setCount(20);
  6. rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
  7. rule.setLimitApp("default");
  8. rules.add(rule);
  9. FlowRuleManager.loadRules(rules);
  10. }

降级规则

参数

Field说明默认值
resource资源名,即限流规则的作用对象
count阈值
grade降级模式,根据 RT 降级还是根据异常比例降级RT
timeWindow降级的时间,单位为 s

代码

 
  1. private void initDegradeRule() {
  2. List<DegradeRule> rules = new ArrayList<>();
  3. DegradeRule rule = new DegradeRule();
  4. rule.setResource(KEY);
  5. // set threshold RT, 10 ms
  6. rule.setCount(10);
  7. rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
  8. rule.setTimeWindow(10);
  9. rules.add(rule);
  10. DegradeRuleManager.loadRules(rules);
  11. }

热点规则

参数

Field说明默认值
resource资源名,必填
count限流阈值,必填
grade限流模式QPS 模式
durationInSec统计窗口时间长度(单位为秒)1s
controlBehavior流控效果(支持快速失败和匀速排队模式)快速失败
maxQueueingTimeMs最大排队等待时长(仅在匀速排队模式生效)0ms
paramIdx热点参数的索引,必填,对应 SphU.entry(xxx, args) 中的参数索引位置
paramFlowItemList参数例外项,可以针对指定的参数值单独设置限流阈值,不受前面 count 阈值的限制。仅支持基本类型
clusterMode是否是集群参数流控规则false
clusterConfig集群流控相关配置

代码

 
  1. ParamFlowRule rule = new ParamFlowRule(resourceName)
  2. .setParamIdx(0)
  3. .setCount(5);
  4. // 针对 int 类型的参数 PARAM_B,单独设置限流 QPS 阈值为 10,而不是全局的阈值 5.
  5. ParamFlowItem item = new ParamFlowItem().setObject(String.valueOf(PARAM_B))
  6. .setClassType(int.class.getName())
  7. .setCount(10);
  8. rule.setParamFlowItemList(Collections.singletonList(item));
  9. ParamFlowRuleManager.loadRules(Collections.singletonList(rule));

系统规则

参数

Field说明默认值
highestSystemLoad最大的 load1-1(不生效)
avgRt所有入口流量的平均响应时间-1(不生效)
maxThread入口流量的最大并发数-1(不生效)
qpa所有入口资源的 QPS-1(不生效)

代码

 
  1. private void initSystemRule() {
  2. List<SystemRule> rules = new ArrayList<>();
  3. SystemRule rule = new SystemRule();
  4. rule.setHighestSystemLoad(10);
  5. rules.add(rule);
  6. SystemRuleManager.loadRules(rules);
  7. }

授权规则

参数

Field说明默认值
resource资源名,即限流规则的作用对象
limitApp对应的黑名单/白名单,不同 origin 用 , 分隔,如 appA,appBdefault,代表不区分调用来源
strategy限制模式,AUTHORITY_WHITE 为白名单模式,AUTHORITY_BLACK 为黑名单模式,默认为白名单模式AUTHORITY_WHITE

代码

 
  1. AuthorityRule rule = new AuthorityRule();
  2. rule.setResource("test");
  3. rule.setStrategy(RuleConstant.AUTHORITY_WHITE);
  4. rule.setLimitApp("appA,appB");
  5. AuthorityRuleManager.loadRules(Collections.singletonList(rule));

来源:Spring Cloud Alibaba学习笔记(5) - 整合Sentinel及Sentinel规则

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值