简单理解就是,同样请求一个接口的入参,针对该参数对应是规定值的数据请求,进行控制,比如我一个接口的一个参数为id,如果id值为1002、1003的入参进行热点控制,别的id值不控制随意请求。
采用的是sentinel进行热点数据控制
设置如下
这个热点设置,需要借助@SentinelResource进行实现,这个资源名就是该注解中的value对应的值
限流模式:采用QPS模式;
参数索引:就是对该资源下哪个参数进行热点控制,比如接口中有3个入参,你需要对第二个入参进行热点控制,那此处就是填写1(注意,是从0开始的整数,0代表接口中第一个入参);
单机阈值:①如果大部分是热点数据,那就针对热点数据进行流控,即此处填写的热点流量的阈值(比如10000);②如果大部分是普通数据,那就针对普通流量进行设置阈值(比如10)。
统计窗口时长:可以根据场景设置。假如填写1s,意思就是1秒内QPS为10次的时候进行控制
点击高级选项,下面就是针对具体的需要特殊处理的热点数据进行流量控制,参数类型就是入参类型是什么,参数值就是该参数索引对应入参的那个值对应具体的数据,限流阈值也就是该入参为参数值的时候,超过这个限流阈值的时候就会被限流,如上图所示就是,当第1个参数(类型为int),值为1的时候,限流阈值2。
以下为代码demo:
@RestController @RequestMapping("/order") public class OrderController {@GetMapping("/hotData/{id}/")@SentinelResource(value = "getById",blockHandler = "HotDataBlockHandler")public String getById(@PathVariable Integer id){System.out.println("id = " + id);return "正常访问";}public String HotDataBlockHandler(@PathVariable Integer id,BlockException e){return "热点数据异常处理";}
当1秒内请求超过2次就会被限流
当然,这里的热点配置,一个接口多个入参,而只能是一个入参设置为热点限流,也就是说,如果某个接口有四个参数,而这四个参数都需要做热点控制,那就需要设置四个(一般不会出现这样的情况),这个就很不人性化,应该是后面sentinel后面的版本会有更好的解决方法。
以上内容纯学习使用!