文章7 | 阅读 3187 | 点赞0
Sentinel的主要工作之一就是流量控制,因此对流控规则的掌握是必不可少的。
单机阈值比较好理解,就是每秒对QPS/线程数的控制。
QPS与线程数的区别在于:
流控模式分为直接、关联和链路
直接模式理解起来比较简单,就是单纯的对当前资源的流量控制,这里不再做过多的解释。
定义:当关联的资源达到阈值时,限流自己。
如下图的配置,当A的QPS的阈值到达2的时候,B就会被限流。
源码如下:
定义SentinelResource 为getOrder
import java.util.Random;
@Service
public class OrderServiceImpl implements OrderService{
@Override
@SentinelResource(value = "getOrder", blockHandler = "handleException")
public String getOrder() {
return String.valueOf(new Random().nextInt());
}
public String handleException(BlockException ex) {
System.out.println("县六中............");
return ex.getClass().getCanonicalName() + "\t服务不可用";
}
}
定义两个请求接口,调用getOrder()
@Resource
private OrderService orderService;
@GetMapping("/test1")
public String test1() {
return orderService.getOrder();
}
@GetMapping("/test2")
public String test2() {
return orderService.getOrder();
}
实际效果,应该是对配置链路的test1进行限流控制,实现更加细致化的流控,但是实际并没有什么效果。
流控效果分为直接失败、预热和排队等待。
直接失败理解起来比较简单,就是限流的时候直接提示。
根据codeFactor(冷加载因子,默认为3)的值,即请求 QPS 从 threshold / 3 开始,经预热时长逐渐升至设定的 QPS 阈值 ,因此上图的配置就是系统初始化的默认阈值为10 / 3,即为3,也就是刚开始的时候阈值只有3,当经过5s后,阈值才慢慢提高到10;这种情况主要是为了保护系统,例如在秒杀系统的开启瞬间,会有很多流量上来,很可能会把系统打挂,预热方式就是为了保护系统,可以慢慢的把流量放进来,慢慢的把阈值增长到设定值。
/test2每秒5次请求,超过的话就排队等待,等待的超时事件为10ms,目的是为了匀速处理请求,保证服务的均匀性,而不是一会处理大量的请求,一会有没有请求可处理。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/chongbaozhong/article/details/106493967
内容来源于网络,如有侵权,请联系作者删除!