手把手教你搭建SpringCloudAlibaba之Sentinel热点key限流

SpringCloud Alibaba全集文章目录:

零、手把手教你搭建SpringCloudAlibaba项目

一、手把手教你搭建SpringCloud Alibaba之生产者与消费者

二、手把手教你搭建SpringCloudAlibaba之Nacos服务注册中心

三、手把手教你搭建SpringCloudAlibaba之Nacos服务配置中心

四、手把手教你搭建SpringCloudAlibaba之Nacos服务集群配置

五、手把手教你搭建SpringCloudAlibaba之Nacos服务持久化配置

六、手把手教你搭建SpringCloudAlibaba之Sentinel实现流量实时监控

七、手把手教你搭建SpringCloudAlibaba之Sentinel实现流量控制

八、手把手教你搭建SpringCloudAlibaba之Sentinel服务熔断降级

九、手把手教你搭建SpringCloudAlibaba之Sentinel热点key限流

十、手把手教你搭建SpringCloudAlibaba之Sentinel系统自适应保护

十一、手把手教你搭建SpringCloudAlibaba之Sentinel注解SentinelResource

十二、手把手教你搭建SpringCloudAlibaba之Sentinel规则持久化

十三、手把手教你搭建SpringCloudAlibaba之Seata分布式事务

点击跳转学习 -------------->手把手教你搭建SpringCloud项目

1、何为热点?

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

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

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

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

令牌桶算法:令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。

2、如何配置?

2.1、代码演示:

//测试热点限流的方法    传递参数p1与参数p2
    @GetMapping("/testHotKey")
    //注意不要加/
    @SentinelResource(value = "testHotKey") 
    public String testHotKey(@RequestParam(value="p1",required =false)String p1,
                            @RequestParam(value = "p2",required = false) String p2){
     return "------testHotKey,o(╥﹏╥)o";
    }

2.2、配置演示:

资源名:对应我们的@SentinelResource注解中value = "testHotKey"的值,所以设置为testHotKey

限流模式:只支持QPS模式

索引参数:就是我们url中的参数的索引,我们的url是http://localhost:8401/testHotKey?p1=a&p2=2,那么p1的索引就是0,p2的索引就是1,我们设置0,说明就是对p1参数进行限流。

统计窗口时长:就是我们规定在多少秒没进行阈值的控制,比如我允许1秒可以访问1次,那么统计窗口时长就设置为1,单机阈值就设置为1。超过一次,我就进行热点的限流。

 配置成功如下:

 2.3、测试演示:

我们进行访问,每秒点击1次,是可以成功访问到的。如下图:

当我们传递的参数只有p2的时候,是不进行限流的,由此可以得出,只有携带了p1参数才会进行限流。

 如果我们在1秒内点击多次就会直接出现错误提示。这里是因为使用了SentinelResource注解的原因,就需要自己写一个降级的方法。如下图:

2.4:自定义降级方法

 在上篇文章中我们可以看到当服务降级的时候会出现sentinel系统默认的提示:Blocked by Sentinel (flow limiting),但是当我们使用了SentinelResource的注解,就不会走sentinel系统默认的提示。

所以我们在限热点限流的时候就不会走系统默认的错误提示,但是直接将错误返回给前台,会对用户很不友好,那我们能不能自定义?类似像Hystrix,某个方法出问题了,就找对应的兜底降级方法?

在Hystrix中我们使用的是HystrixCommmand的注解进行配置。可以点击查看这篇文章

手把手教你搭建SpringCloud项目(十)集成Hystrix之服务降级有具体的代码演示。

当然是有的,在Sentinel中也同样使用注解的方式进行配置,使用的是SentinelResource的注解进行配置

2.4.1:SentinelResource注解了解学习

@SentinelResource的参数如下

value:资源名称
entryType:entry 类型,可选项(默认为 EntryType.OUT),可选EntryType.OUT和EntryType.IN
blockHandler/ blockHandlerClass:定位对应处理 BlockException 的函数名称blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。
fallback / fallbackClass:fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。
defaultFallback(since 1.6.0):默认的 fallback 函数名称,可选项
exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。

官方案例:

// 原函数
@SentinelResource(value = "hello", blockHandler = "exceptionHandler", fallback = "helloFallback")
public String hello(long s) {
    return String.format("Hello at %d", s);
}

// Fallback 函数,函数签名与原函数一致或加一个 Throwable 类型的参数.
public String helloFallback(long s) {
    return String.format("Halooooo %d", s);
}
// Block 异常处理函数,参数最后多一个 BlockException,其余与原函数一致.
public String exceptionHandler(long s, BlockException ex) {
    // Do some log here.
    ex.printStackTrace();
    return "Oops, error occurred at " + s;
}

 2.4.2:SentinelResource注解代码演示

BlockException 的函数名称blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。

在SentinelResource注解里加上blockHandler参数,并指定到增加兜底的方法,也就是deal_testHotKey方法和testHotKey方法的参数与返回值要一样,deal_testHotKey方法最后加一个额外的参数,类型为 BlockException。

 //测试热点限流的方法    传递参数p1与参数p2
    @GetMapping("/testHotKey")
    //注意不要加/
    @SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey" ) //指定兜底的方法 就是用blockHandler指的方法 所以就是deal_testHotKey
    public String testHotKey(@RequestParam(value="p1",required =false)String p1,
                            @RequestParam(value = "p2",required = false) String p2){
     return "------testHotKey,o(╥﹏╥)o";
    }

    public String deal_testHotKey(String p1, String p2, BlockException e){
        return "------deal_testHotKey,(* ̄︶ ̄)";
    }

 2.4.3:项目重启,进行自定义降级方法

我们在1秒内点击多次就会出现我们刚刚自定义的降级方法中的错误提示。如下图:

2.5:参数例外项

参数类型:就要对应我们的进行限流参数的类型,我们p1是string类型,这里就选择string。

参数值:就是我们不希望当p1参数是多少的时候不进行限流,我们这里配置为2,也就是当p1为2的时候不进行限流。

限流阈值:就是我们在1秒内且p1的参数为2的时候的一个阈值,我们设置为200,也就是说当p1为2的时候,且每秒的请求超过200次才会限流,不超过200次是不会限流的。

如下图:

 

特别注意:

我们访问http://localhost:8401/testHotKey?p1=2&p2=1

后我们可以在sentinel的 簇点链路的资源名分别有testHotKey和/testHotKey

但是我们在两个都添加热点限流规则,发现只有testHotKey资源名起到了限流的作用,/testHotKey配置的热点限流没有起到作用。

至此sentinel热点限流就学完了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值