SpringCloud-2.0-周阳(22. 流量监控 - Sentinel)
Posted ABin-阿斌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud-2.0-周阳(22. 流量监控 - Sentinel)相关的知识,希望对你有一定的参考价值。
上一篇 :21. Sentinel 环境搭建
下一篇 :23. 熔断降级 - Sentinel
- 声明:原文作者:csdn:yuan_404
文章目录
1 . 流控规则介绍
- 资源名:
唯一名称,默认请求路径
- 针对来源:
Sentinel可以针对调用者进行限流,填写微服务名,默认default (不区分来源)
- 阈值类型/单机阈值 :
- QPS :表示每秒钟的请求数量,当调用该 api 的 QPS 达到阈值的时候,进行限流。
- 线程数 : 当调用该 api 的线程数达到阈值的时候,进行限流
- 流控模式
- 直接 : api 达到限流条件时,直接限流
心- 关联 : 当关联的资源达到阈值时,就限流自己
- 链路 : 只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【api级别的针对来源】
- 流控效果:
- 快速失败 : 直接失败,抛异常
- Warm Up : 根据codeFactor(冷加载因子,默认3)的值,从阈值codeFactor,经过预热时长,才达到设置的QPS阈值
- 排队等待 : 匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效
2 . 流控模式演示
2.1 直接(默认的)
- api 达到限流条件时,直接限流
-
为 /testA 请求设置流控规则
-
查看流控规则
-
发出请求,体验限流
-
先是一秒点一次,可以正常访问
-
连续点几次,出现提示语句
2.2 关联
- 当关联的资源达到阈值时,就限流自己
- 实际场景 :对于同级别的服务,比如 下单、支付 两个服务,当 支付 流量过高,撑不住了,就限制一下 下单 服务,把资源留给 支付 服务,先撑过去。
-
修改上面建立的流控规则
-
使用 PostMan 发出请求,体验限流
-
访问 /testA
2.3 链路
- 只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【api级别的针对来源】
-
修改上面建立的流控规则
-
使用 Postman 对 /testB 进行连续访问
-
访问 /testA
因为从 资源入口 进入的请求过多,所以 testA 被限流
3 . 流控效果演示
3.1 快速失败(默认的)
- 就是上面一直出现的提示界面
3.2 Warm Up(预热)
-
官方说明 :https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6
-
冷加载因子 :默认 coldFactor 为 3,即请求 QPS 从 threshold/3 开始,经预热时长逐渐升至设定的QPS阈值。
-
限流 冷启动 :https://github.com/alibaba/Sentinel/wiki/%E9%99%90%E6%B5%81—%E5%86%B7%E5%90%AF%E5%8A%A8
-
修改 流控效果
-
一直发出 /testA 请求
发现刚开始提示 Blocked by Sentinel(flow limiting) 的频率比较高
越往后频率越低
最后几乎不会出现
这就是阈值再慢慢预热的过程
3.3 排队等待
- 让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效
- 每个请求,愿意等就等,不愿意等就超时重试
-
修改 流控效果
-
在 Controller 中添加一行输出语句,打印时间
-
使用 Postman 模拟大量请求
-
观察控制台
4 . 热点 key 限流
4.1 简介
- 热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。
- 比如:
- 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
- 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
4.2 备选方案
- 在 Hystrix 中某个方法被降级了、熔断了,都有一个备选方案兜底,这里也类似
- 每次服务出现问题页面都会提示 Blocked by Sentinel(flow limiting) ,能不能把它替换成我们自己的方案
- 可以,需要用到注解 —— @SentinelResource
-
修改 Controller ,加入备选方案
@GetMapping("/testHotKey") @SentinelResource(value = "testHotKey", blockHandler = "deal_testHotKey") public String hotKeyTest(@RequestParam(value = "p1", required = false)String p1, @RequestParam(value = "p2", required = false)String p2) return "===== (*^_^*) 成功了 (*^_^*) ====="; public String deal_testHotKey(String p1, String p2, BlockException exception) return "===== (ㄒoㄒ) 失败了 (ㄒoㄒ) =====";
-
测试
4.3 热 Key 配置
-
配置热点规则
-
发出请求并带上 p1 参数
访问 :http://localhost:8401/testHotKey?p1=aaa
如果 1 秒点一下,可以正常访问,但是 1 秒内,连续请求,就会走备选方案
4.4 参数例外项
- 上述情况,不论被监控的参数传入的是何值,都会进行判断,并限流
- 但是有些时候有些特殊值,希望它的阈值和其他不一样,就要使用该配置
- 比如说:p1 传入 aaa 时的阈值可以允许达到 100,但是其他值只能达到 10
-
修改 热 Key 配置 添加 参数例外项
-
先传入普通值测试 :http://localhost:8401/testHotKey?p1=abcd
-
设置 JMeter
-
启动 JMeter ,再传入特殊值测试 :http://localhost:8401/testHotKey?p1=aaa
5 . 系统规则
-
说明
-
系统规则的配置说明
- Load 自适应(仅对 Linux/Unix-like 机器生效):系统的 load1 作为启发指标,进行自适应系统保护。当系统 load1 超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR 阶段)。系统容量由系统的 maxQps * minRt 估算得出。设定参考值一般是 CPU cores * 2.5。
- CPU usage(1.5.0+ 版本):当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0),比较灵敏。
- 平均 RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
- 并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
- 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。
-
设置
入口 QPS
演示
测试,访问 :http://localhost:8401/testA
测试其他请求也都一样
以上是关于SpringCloud-2.0-周阳(22. 流量监控 - Sentinel)的主要内容,如果未能解决你的问题,请参考以下文章
SpringCloud-2.0-周阳(23. 熔断降级 - Sentinel)
SpringCloud-2.0-周阳(17. SpringCloud Alibaba入门简介)
SpringCloud-2.0-周阳(14. 消息总线 - SpringCloud Bus)
SpringCloud-2.0-周阳(15. 消息驱动 - SpringCloud Stream)