sentinel流量制御

7161 ワード

sentinel流量制御

  • 規則影響パラメータ
  • limitApp詳細
  • パラメータ説明
  • {some_origin_name}パラメータ
  • の使用方法

    ルール影響パラメータ

  • resource:リソース名、すなわちストリーム制限規則の作用オブジェクト
  • count:ストリーム制限しきい値
  • grade:ストリーム制限しきい値タイプ、QPSまたは同時スレッド数、1 QPS、0同時スレッド数
  • limitApp:フロー制御による呼び出し元、defaultであれば呼び出し元
  • を区別しない.
  • strategy:リソース自体(0)、関連リソース(1)、リンク交差点(2)
  • の関係ストリーム制限ポリシーを呼び出す.
  • controlBehavior:トラフィック制御効果オプションは直接拒否(0)、Warm Up(1)、等速キュー(2)
  • refResource:strategyがリンク交差点の場合、refResourceで設定されたリソースエントリのみが統計に計上されます.strategyが関連リソースである場合は、複数のリソースが競合していることを示し、同時量が大きい場合はrefResourceが設定したリソースが優先的にアクセスリソースをプリエンプトします.

  • LimitAppの詳細


    パラメータの説明


    フロー制御規則のlimitAppフィールドは、呼び出し元に基づいてトラフィック制御を行うために使用されます.このフィールドの値には、次の3つのオプションがあります.
  • default:呼び出し者を区別しないことを示し、どの呼び出し者からのリクエストもストリーム制限統計を行います.このリソース名の呼び出しの合計がこのルールで定義されたしきい値を超えた場合、制限フローがトリガーされます.
  • {some_origin_name}:特定の呼び出し元に対して、この呼び出し元からの要求のみがトラフィック制御を行うことを示す.例えば、NodeAは、呼び出し元のcaller 1に対する規則を構成し、caller 1からのNodeAに対する要求のみがトラフィック制御をトリガする.
  • other:{some_origin_name}以外の呼び出し元のトラフィックに対してトラフィック制御を行うことを示す.例えば、リソースNodeAは、呼び出し元caller 1に対するストリーム制限ルールを構成するとともに、呼び出し元がotherであるルールを構成すると、非caller 1によるNodeAの呼び出しは、otherというルールで定義されたしきい値を超えてはならない.

  • 同じリソース名で複数のルールを構成できます.ルールの有効な順序は、{some_origin_name}>other>defaultです.

    {some_origin_name}パラメータの使用方法


    sentinelはContextUtilを通過する.Enter(resourceName,origin)メソッドのoriginパラメータには、呼び出し元のIDが表示されます.この方法は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を呼び出し元のIDに設定しました.