SpringCloud学习笔记 - 热点参数限流 - Sentinel

1. 何为热点?

何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top N 数据,并对其访问进行限制。比如:

  • 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
  • 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制

热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
在这里插入图片描述

Sentinel 利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。热点参数限流支持集群模式。

2. sentinel热点限流配置

2.1. 热点限流配置界面展示:目前仅支持QPS模式

在这里插入图片描述

2.2. 热点限制接口测试

1. 创建处理热点限制的请求方法:标注核心注解@SentinelResource,value = "testHotKey"指定该请求的资源ID ,用于Sentinel的识别,blockHandler = "deal_testHotKey"指定异常出现时调用的处理方法

    @GetMapping("/testHotKey")
    @SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey")
    public String testHotKey(@RequestParam(value = "p1", required = false) String p1,
                             @RequestParam(value = "p2", required = false) String p2)
    {
        return "------testHotKey";
    }

2. @SentinelResource注解说明
sentinel流控配置的资源名支持“资源访问映射路径“和使用@SentinelResource指定资源名称,因为我们需要使用blockHandler指定异常处理方法,所以这里使用@SentinelResource注解

3. 自定义异常处理方法

    public String deal_testHotKey(String p1, String p2, BlockException exception)
    {
        return "------testHotKey,/(ㄒoㄒ)/~~";
    }

4. sentinel热点规则基础配置说明
在这里插入图片描述

以上配置规则表示:对名叫“testHotKey”的资源进行API级别的限流(所以这里的资源名必须唯一),限流该接口的第一个参数“p1”,当在1秒的统计窗口期中,对p1的访问量超过1时,触发熔断机制,并调用指定的降级方法”deal_testHotKey“。对其他访问参数进行放行。

5. 测试热点控制效果
快速多次访问对应的限流参数:http://localhost:8401/testHotKey?p1=1、http://localhost:8401/testHotKey?p1=1&p2=1
在这里插入图片描述

访问未被限流参数:http://localhost:8401/testHotKey?p2=1,则不会触发异常情况。
在这里插入图片描述

3. sentinel热点限流高级配置

3.1. 热点限流高级选项配置界面展示:可以指定需要特殊处理的参数值

在这里插入图片描述

1. 指定限流参数的例外项:选择参数类型,并指定要特殊处理的值和新的阈值
在这里插入图片描述

以上配置规则表示:对“testHotKey”的第一个参数进行热点限流,当1秒内的访问次数超过5次,触发熔断规则。但对参数值为“3”时的热点规则进行特殊处理,即就是当参数值为3时,当一秒内访问次数超过1次,触发熔断规则。

2. 测试
快速多次访问对应的限流参数,并指定参数值为3,1秒内超过2次,触发熔断规则:
在这里插入图片描述

快速多次访问对应的限流参数,并指定参数值不为3,1秒内访问次数可以大于1但不能超过5.
在这里插入图片描述

4. @SentinelResource主管配置出错,运行出错该走异常走异常

也就是说Sentinel只会处理自己能处理的异常,也就是当程序触发了sentinel热点规则拦截机制时,sentinel才会调用异常处理方法,否则还是会抛出异常。

测试:在方法体抛除0异常

@RestController
@Slf4j
public class FlowLimitController
{
    ...
    @GetMapping("/testHotKey")
    @SentinelResource(value = "testHotKey",blockHandler/*兜底方法*/ = "deal_testHotKey")
    public String testHotKey(@RequestParam(value = "p1",required = false) String p1,
                             @RequestParam(value = "p2",required = false) String p2) {
        int age = 10/0;//<----------------------------会抛异常的地方
        return "------testHotKey";
    }
    
    /*兜底方法*/
    public String deal_testHotKey (String p1, String p2, BlockException exception) {
        return "------deal_testHotKey,o(╥﹏╥)o";  //sentinel系统默认的提示:Blocked by Sentinel (flow limiting)
    }

}

将会抛出Spring Boot 2的默认异常页面,而不是兜底方法。

  • @SentinelResource - 处理的是sentinel控制台配置的违规情况,有blockHandler方法配置的兜底处理;
  • RuntimeException int age = 10/0,这个是java运行时报出的运行时异常RunTimeException,@SentinelResource不管
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值