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设置为调用者身份的标识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值