流控
资源名
可以是requestMapping的url,也可以是@SentinelResource("资源名")注解的方法
流控方式
QPS
每秒通过的请求数 只关注请求不关注返回
流控模式
直接
请求数超过阈值直接返回错误信息
关联
如果xxx关联资源被触发 那么自身就会触发流控
链路
如果被调用者是xxx资源,就会触发
流控效果
快速失败
只要1秒内超过阈值 直接返回错误信息
Warm Up
默认coldFactor为3,即请求QPS从(阈值/3)开始,经多少预热时长才逐渐升至设定的QPS
排队等待
如果1秒内的QPS超过阈值 超过的部分会在下一秒内请求(前提是不超过超时时间)
线程数
web容器处理请求的线程数量;与hystrix线程隔离不一样:hystrix结合feign在远程服务调用时会为每一个服务维护一个线程池,限制的是这个线程池,而不是web容器处理请求的线程
降级
RT
慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
一秒内(单位统计时长)设置的最小请求数目(请求数大于等于 5)响应时间超过设定的值,那么在指定的时间窗口内触发降级策略
异常比例
异常比例 (ERROR_RATIO):当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
一秒内(单位统计时长)设置的最小请求数(请求数大于等于 5)的错误比率超过指定值,那么在指定的时间窗口内触发降级策略
异常数
异常数 (ERROR_COUNT):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
一分钟内(位统计时长内)的错误数量超过指定值(阈值),那么在指定的时间窗口内触发降级策略
热点
可以对参数进行限流
方法
对资源进行热点设置
当请求带上对应参数并且达到阈值就会出现异常
如果是集群 貌似得对每一个都要设置规则
自定义限流降级处理
bug:如果资源名使用的是@SentinelResource自定义的不会生效
BlockExceptionHandler 接口
@Component
public class MyHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
BlockException e) throws Exception {
httpServletResponse.setContentType("application/json");
httpServletResponse.setCharacterEncoding("utf-8");
//限流异常
if(e instanceof FlowException){
httpServletResponse.getWriter().write("限流异常");
}
//降级异常
else if(e instanceof DegradeException){
httpServletResponse.getWriter().write("限流异常");
}
//参数限流异常
else if(e instanceof ParamFlowException){
httpServletResponse.getWriter().write("限流异常");
}
//授权异常
else if(e instanceof AuthorityException){
httpServletResponse.getWriter().write("限流异常");
}
//系统负载异常
else if(e instanceof SystemBlockException){
httpServletResponse.getWriter().write("限流异常");
}
else{
httpServletResponse.getWriter().write("限流异常");
}
httpServletResponse.getWriter().flush();
httpServletResponse.getWriter().close();
}
}
BlockException 子类
AuthorityException 授权异常
DegradeException 降级异常
FlowException 限流异常
ParamFlowException 参数限流异常
SystemBlockException 系统负载异常
持久化规则
以上的配置都是保存在内存中,重启就会失效;整合nacos进行保存
sentinel整合nacos
nacos创建配置文件
Field | 说明 | 取值 |
---|---|---|
resource | 资源名 | @SentinelResource或url |
count | 限流阈值 | |
grade | 限流阈值类型,QPS/线程数 | 0/1 |
limitApp | 流控针对的调用来源 | default |
strategy | 流控效果:自身/关联/链路 | 0/1/2 |
controlBehavior | 流控效果(直接拒绝 /预热/ 排队等待 ) | 0/1/2 |
[
{
"resource": "xxxparam",
"controlBehavior": 0,
"count": 1,
"grade": 1,
"limitApp": "default",
"strategy": 0
}
]
如何指定是限流、降级、热点...
在配置中的rule-type
rule-type
flow:限流
degrade:降级
param-flow:参数限流
authority:授权