sentinel流量控制
规则影响参数
- resource:资源名,即限流规则的作用对象
- count: 限流阈值
- grade: 限流阈值类型,QPS 或并发线程数,1QPS,0并发线程数
- limitApp: 流控针对的调用来源,若为 default 则不区分调用来源
- strategy: 调用关系限流策略,选项为资源本身(0),关联资源(1),链路路口(2)
- controlBehavior: 流量控制效果选项为直接拒绝(0)、Warm Up(1)、匀速排队(2)
- refResource: strategy为链路路口时,只有通过refResource设置的资源入口才会计入统计。strategy为关联资源时,表示多个资源竞争该资源,并发量大时refResource设置的资源优先抢占访问资源。
limitApp详解
参数说明
流控规则中的 limitApp 字段用于根据调用来源进行流量控制。该字段的值有以下三种选项,分别对应不同的场景:
- default:表示不区分调用者,来自任何调用者的请求都将进行限流统计。如果这个资源名的调用总和超过了这条规则定义的阈值,则触发限流。
- {some_origin_name}:表示针对特定的调用者,只有来自这个调用者的请求才会进行流量控制。例如 NodeA 配置了一条针对调用者caller1的规则,那么当且仅当来自 caller1 对 NodeA 的请求才会触发流量控制。
- other:表示针对除 {some_origin_name} 以外的其余调用方的流量进行流量控制。例如,资源NodeA配置了一条针对调用者 caller1 的限流规则,同时又配置了一条调用者为 other 的规则,那么任意来自非 caller1 对 NodeA 的调用,都不能超过 other 这条规则定义的阈值。
同一个资源名可以配置多条规则,规则的生效顺序为:{some_origin_name} > other > default
{some_origin_name}参数如何使用
sentinel是通过ContextUtil.enter(resourceName, origin) 方法中的 origin 参数标明了调用方身份。该方法在com.alibaba.csp.sentinel.adapter.servlet.CommonFilter过滤器中被调用。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
略过。。。
String origin = this.parseOrigin(sRequest);
ContextUtil.enter(target, origin);
略过。。
chain.doFilter(request, response);
}
private String parseOrigin(HttpServletRequest request) {
RequestOriginParser originParser = WebCallbackManager.getRequestOriginParser();
String origin = "";
if (originParser != null) {
origin = originParser.parseOrigin(request);
if (StringUtil.isEmpty(origin)) {
return "";
}
}
return origin;
}
通过以上可以看出需要获取一个origin解析器,查看WebCallbackManager会发现RequestOriginParser 被设置为null,并且该接口也没有实现类。所以我们需要自己实现origin解析规则并设置到WebCallbackManager对象。此处在容器加载完成事件中设置,并通过请求地址获取origin。
@Component
public class ApplicationStartup implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
//设置limitApp origin解析规则
WebCallbackManager.setRequestOriginParser((request) -> {
String origin = request.getRemoteAddr();
return origin != null ? origin : "";
});
}
}
以上将参数origin设置为调用者身份的标识。