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 达到限流条件时,直接限流
  1. 为 /testA 请求设置流控规则

  2. 查看流控规则

  3. 发出请求,体验限流

  • 先是一秒点一次,可以正常访问

  • 连续点几次,出现提示语句

2.2 关联

  • 当关联的资源达到阈值时,就限流自己
  • 实际场景 :对于同级别的服务,比如 下单、支付 两个服务,当 支付 流量过高,撑不住了,就限制一下 下单 服务,把资源留给 支付 服务,先撑过去。
  1. 修改上面建立的流控规则

  2. 使用 PostMan 发出请求,体验限流

  3. 访问 /testA

2.3 链路

  • 只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【api级别的针对来源】
  1. 修改上面建立的流控规则

  2. 使用 Postman 对 /testB 进行连续访问

  3. 访问 /testA

    因为从 资源入口 进入的请求过多,所以 testA 被限流

3 . 流控效果演示

3.1 快速失败(默认的)

  • 就是上面一直出现的提示界面

3.2 Warm Up(预热)

  1. 修改 流控效果

  2. 一直发出 /testA 请求

    发现刚开始提示 Blocked by Sentinel(flow limiting) 的频率比较高

    越往后频率越低

    最后几乎不会出现

    这就是阈值再慢慢预热的过程

3.3 排队等待

  • 让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效
  • 每个请求,愿意等就等,不愿意等就超时重试
  1. 修改 流控效果

  2. 在 Controller 中添加一行输出语句,打印时间

  3. 使用 Postman 模拟大量请求

  4. 观察控制台

4 . 热点 key 限流

4.1 简介

  • 热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。
  • 比如:
  • 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
  • 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制

4.2 备选方案

  • 在 Hystrix 中某个方法被降级了、熔断了,都有一个备选方案兜底,这里也类似
  • 每次服务出现问题页面都会提示 Blocked by Sentinel(flow limiting) ,能不能把它替换成我们自己的方案
  • 可以,需要用到注解 —— @SentinelResource
  1. 修改 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ㄒ) =====";
        
    
    
  2. 测试

    访问 :http://localhost:8401/testHotKey

4.3 热 Key 配置

  1. 配置热点规则

  2. 发出请求并带上 p1 参数

    访问 :http://localhost:8401/testHotKey?p1=aaa

    如果 1 秒点一下,可以正常访问,但是 1 秒内,连续请求,就会走备选方案

4.4 参数例外项

  • 上述情况,不论被监控的参数传入的是何值,都会进行判断,并限流
  • 但是有些时候有些特殊值,希望它的阈值和其他不一样,就要使用该配置
  • 比如说:p1 传入 aaa 时的阈值可以允许达到 100,但是其他值只能达到 10
  1. 修改 热 Key 配置 添加 参数例外项

  2. 先传入普通值测试 :http://localhost:8401/testHotKey?p1=abcd

  3. 设置 JMeter

  4. 启动 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 达到阈值即触发系统保护。

以上是关于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)

SpringCloud-2.0-周阳(16. 请求链路追踪 - SpringCloud Sleuth)

SpringCloud-2.0-周阳(13. 分布式配置中心 - SpringCloud Config)