Sentinel是通过动态管理限流规则,根据定义的规则对请求进行限流控制。
一.实现步骤
1.定义资源:在Sentinel中,资源可以是URL、方法等,用于标识需要进行限流的请求;(在Sentinel中,需要我们去告诉Sentinel哪些资源需要被限流)
// 原本的业务方法@SentinelResource(blockHandler = "blockHandlerForGetUser")public User getUserById(String id) {return new User("admin");}// blockHandler函数,原方法调用被限流/降级/系统保护的时候调用public User blockHandlerForGetUser(String id, BlockException ex) {throw new RuntimeException("系统繁忙,请稍后再试");}
上面这个getUserById这个方法使用了@SentinelResource注解,就告诉了Sentinel,该方法需要进行限流处理,里面的Value值代表当触发了限流操作后,就会来回调这个自定义方法,这个自定义方法可以是一个自定义的提示,也可以是一直自定义的逻辑处理。
2.配置限流规格:在Sentinel的配置文件中定义资源的限流规则,规则可以包括资源名称、限流阈值、限流模式(令牌桶或漏桶)等;(当Sentinel知道了要对什么资源目标进行限流以后,我们就需要针对这个目标配置一个限流规则,明确在什么条件下触发限流)
private static void initFlowQpsRule() {List<FlowRule> rules = new ArrayList<>();FlowRule rule1 = new FlowRule(); // 创建一个流控规则rule1.setResource(resource); // 设置要限流的资源名称rule1.setcount(20); // 设置最大QPS为20rule1.setGrade(RuleConstant.FLOWGRADE QPS); // 设置限流的维度为 QPSrule1.setLimitApp("default"); // 设置限制的应用名称为"default"rules.add(rule1); // 将规则添加到规则列表中FlowRuleManager.loadRules(rules); // 加载规则列表,使限流规则生效}
首先创建一个流控的规则FlowRule,然后这是限流的资源名字、QPS、限流的维度(选择以什么方式进行统计),最后将这个规则加载到规则列表里面,这个时候就代表我们当前的这个规则里面的QPS最大为20,如果超出了20,就要被触发限流。
3.监控流量:Sentinel会监控每个资源的流量情况,包括请求的QPS(每秒请求数)、线程数、响应时间等。(当配置完限流规则后,就可以在Sentinel的Web控制页面来查看每个资源的流量请求,也就是说可以在Web端实时的查看我们标记的这些资源它的实际情况是什么样的)
4.限流的控制:当请求到达时,Sentinel会根据资源的限流规则判断是否需要进行限流控制,如果请求超过了限流阈值,则可以进行限制、拒绝或进行其他降级处理。
这就是Sentinel实现限流的几个步骤。
二.限流算法
Sentinel 使用滑动窗口限流算法来实现限流。
滑动窗口限流算法是一种基于时间窗口的限流算法,它将一段时间划分为多个时间窗口,并在每个时间窗口内统计请求的数量,通过动态地调整时间窗口的大小和滑动步长(也就是可以动态调整限制大小和统计的时间区间),可以更精确地控制请求的通过速率。