ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

sentinel热点规则

2022-05-21 10:00:43  阅读:233  来源: 互联网

标签:String hot1 testHotKey 限流 参数 规则 sentinel 热点


1.概念

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

​ 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制

​ 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制

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

官网:https://sentinelguard.io/zh-cn/docs/parameter-flow-control.html

image

2.配置热点规则

@SentinelResource注解的使用:

这个热点限流其实就是更加细粒度的流控规则,如果想使用它就必须要配合对应SentinelResource注解。

Sentinel 提供了 @SentinelResource 注解用于定义资源,它有很多的参数,我们这里主要关注两个参数:

​ 1. value:代表资源名称,必需项,因为需要通过resource name找到对应的规则,这个是必须配置的

​ 2. blockHandler:blockHandler 对应处理 BlockException 的方法名称,可选项,访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。

案例图解:

image

代码:

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.zt.studydemo.sentinelservice8401.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.TimeUnit;

@RestController
public class FlowLimitController {
 @GetMapping("/testHotKey")
 @SentinelResource("testHotKey")
 public String testHotKey(@RequestParam(value = "hot1",required = false) String hot1,
                          @RequestParam(value = "hot2",required = false)String hot2,
                          @RequestParam(value = "hot3",required = false) String hot3){
     return "----testHotKey";
 }
}

配置热点规则:

image

说明:参数索引0实际上代表的就是我们设置的hot1参数

image

测试:频繁访问对应地址,发现带有热点参数的会被限流,不带有热点参数的正常

image

image

@SentinelResource注解增加blockHandler参数,这个参数是可以指定当出现异常时(这个异常是Sentinel控制台配置的异常,和程序本身异常无关。)的处理方法,具体操作如下:

		@GetMapping("/testHotKey")
 @SentinelResource(value = "testHotKey",blockHandler = "handler_HotKey")
 public String testHotKey(@RequestParam(value = "hot1",required = false) String hot1,
                          @RequestParam(value = "hot2",required = false)String hot2,
                          @RequestParam(value = "hot3",required = false) String hot3){
     return "----testHotKey";
 }

 //处理异常方法,方法签名要和对应的接口方法保持一致
 public String handler_HotKey(String hot1, String hot2, String hot3, BlockException exception){
     return "系统繁忙稍后重试。。";
 }

热点规则不变,我们最终的到的限流效果如下:

image

3.配置参数例外项

参数例外项就是可以达到更加细粒度的控制,比如我们当前的例子中,目前hot1参数在访问时超过阈值就会被限流,但是我们可以通过参数例外项设置hot1具体等于特殊的某个值的时候,触发不同的限流效果。假如hot1的值等于5时,它的阈值可以达到200。

注意:参数例外项中的参数类型仅支持一下7种数据类型

image

配置参数例外项:

当前我们需要让hot1的值为5的时候阈值可以达到200,首先Sentinel页面中修改对应热点规则,一定要点添加按钮

image

此时的规则为:如果当前hot1值为除5以外的其他值,都会走普通的阈值规则,但是如果一旦hot1的值为5的时候,将会走参数例外项,此时的阈值为200,我们通过浏览器测试,当hot1的值等于5是只要阈值不超过200就不会出现限流。

image

标签:String,hot1,testHotKey,限流,参数,规则,sentinel,热点
来源: https://www.cnblogs.com/ZT-666/p/16294485.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有