一、基本介绍
- 资源名:唯一名称,默认请求路径。
- 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)。
- 阈值类型/单机阈值:
- QPS(每秒请求数量):当调用该API的QPS达到阈值的时候,进行限流。
- 线程数:当调用该API的线程数达到阈值的时候,进行限流。
- 是否集群:不需要集群。
- 流控模式:
- 直接:API达到限流条件时,直接限流。
- 关联:当关联的资源达到阈值的时候,就限流自己。
- 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)[API级别的针对来源]。
- 流控效果:
- 快速失败:直接失败,抛异常。
- Warm Up:根据codeFactor(冷加载因子,默认为3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值。
- 排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效。
二、流控模式之直接(默认直接–>快速失败)
(1)添加流控规则
表示1秒内查询1次就是OK,如果超过1次,就直接–>快速失败,报默认错误。
(2)测试
启动provider-8101模块,多次快速访问http://localhost:8101/provider/get/1,被Sentinel阻塞(流量限制)
三、流控模式之关联
(1)关联模式是什么?
当和A关联的资源B达到阈值的时候,就限流A自己。比如:电商系统中,下订单后面的流程就是支付,一旦支付超过阈值,就需要限制下订单。
(2)修改Controller代码。
package com.buba.springcloud.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/provider/get/{id}")
public String getPayment(@PathVariable("id") Integer id) {
return "nacos registry, serverPort: " + serverPort + "\t id" + id;
}
@GetMapping(value = "/provider/test")
public String test() {
return "test";
}
}
(3)测试
添加规则,当关联资源/provider/test的QPS的阈值超过1的时候,就限流A的访问。
通过Postman并发测试http://localhost:8101/provider/test,然后通过浏览器访问http://localhost:8401/provider/get/1。
四、流控模式之链路
添加流控规则,设置入口资源。
测试,多次访问http://localhost:8101/provider/get/1,触发限流。
五、流控效果之预热
(1)概述
- Warm Up(
RuleConstant.CONTROL_BEHAVIOR_WARM_UP
)方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。详细文档可以参考 流量控制 - Warm Up 文档,具体的例子可以参见 WarmUpFlowDemo。 - 公式:阈值除以coldFactor(冷加载因子,默认为3),经过预热后才会达到阈值。
(2)配置
系统初始化的的阈值是10/3约等于3,即阈值开始为3;经过5秒后阈值才慢慢升高恢复到10。
六、流控效果之排队
(1)概述
(2)修改配置
http://localhost:8101/provider/get/1每秒一次请求,超过的话就排队等待,等待的超时时间为20000毫秒。