Spring Alibaba Sentinelクラスタ限流詳細


概要
公用語を借りる
なぜクラスタフロー制御を使用するのですか?あるユーザにAPIの呼び出しを制限する総QPSを50とするが、マシン数が多い(例えば100台ある)場合がある.この場合、総呼び出し量を統計するためにserverを探し、他のインスタンスがこのserverと通信して呼び出すことができるかどうかを判断することが自然に考えられる.これが最も基礎的なクラスタフロー制御の方法である
クラスタモジュール
  • sentinel-cluster-common-default:共通インタフェースとエンティティ
  • を含む共通モジュール
  • sentinel-cluster-client-default:デフォルトクラスタフロー制御clientモジュール、Nettyを使用して通信し、インタフェースを提供してシーケンス化プロトコルの拡張
  • を容易にする
  • sentinel-cluster-server-default:デフォルトのクラスタフロー制御serverモジュールは、Nettyを使用して通信を行い、インタフェースのシーケンス化プロトコルの拡張を容易にする.拡張インタフェースドッキング規則判定の具体的な実装(TokenService)を同時に提供し、デフォルト実装は多重sentinel-coreの関連論理
  • である.
    概要
    Sentineはクラスタ方式でストリーム制限を行うことをサポートし、Server制御規則とClient検索規則の方式でクラスタフロー制御を行う.Serverは二つの存在方式がある.
  • 独立モード:独立してClientを出て流量計算に参加しないで、隔離性が強くて、グローバルフロー制御に適して、サーバーがオフラインになる時Clientは本利限流
  • を行う
  • 内蔵モード:サーバーとしてもClientとしても、トラフィック計算に参加することができ、隔離性が悪く、あるサービスクラスタ内で使用するのに適しており、サーバーがオフラインになった場合、自主的にあるClientをサーバーとして推薦する
  • 独立モードの詳細
    独立モードには、トラフィック計算に関与しないサービス側と、クラスタ化されないクライアントが複数必要です.
    この例ではNacosを動的規則として採用する
    サービス・エンドの例
    Maven依存
    
    <dependency>
        <groupId>com.alibaba.cspgroupId>
        <artifactId>sentinel-coreartifactId>
    dependency>
    
    <dependency>
        <groupId>com.alibaba.cspgroupId>
        <artifactId>sentinel-datasource-nacosartifactId>
    dependency>
    
    <dependency>
        <groupId>com.alibaba.cspgroupId>
        <artifactId>sentinel-annotation-aspectjartifactId>
    dependency>
    
    <dependency>
        <groupId>com.alibaba.cspgroupId>
        <artifactId>sentinel-cluster-server-defaultartifactId>
    dependency>
    
    <dependency>
        <groupId>com.alibaba.cspgroupId>
        <artifactId>sentinel-transport-simple-httpartifactId>
    dependency>
    

    コードの例
    Set<String> applyNamespaces = new HashSet<>(Arrays.asList("test"));
    //                    ,                  
    ClusterTokenServer server = new SentinelDefaultTokenServer();
    ClusterServerConfigManager.loadGlobalTransportConfig(new ServerTransportConfig().setPort(13002));
    //      ,               (project.name) 
    SentinelProperty<Set<String>> namespaceProperty = new NacosDataSource<>(
        "localhost",        //   Nacos ip
        "DEFUALT",          //   Nacos data   
        "dubb-sentinel-cluster-server-namespaces-config.json",  // data id
        namespacesConverter()).getProperty(); //   property  
    //      ,         ,
    ClusterFlowRuleManager.setPropertySupplier(namespace -> {
        NacosDataSource<List<FlowRule>> dataSource = new NacosDataSource<>(
            "localhost",        //   Nacos ip
            "DEFUALT",          //   Nacos data   
            "dubb-sentinel-cluster-server-config.json",     // data id
            flowRulesConverter()); 
        return dataSource.getProperty();
    });
    //                            
    ClusterServerConfigManager.loadServerNamespaceSet(applyNamespaces);
    ClusterServerConfigManager.registerNamespaceSetProperty(namespaceProperty);
    
    //        
    server.start();
    // server.stop(); //     
    

    以上はどのようにして基本的な独立モードのクラスタ限流サービス端を構築し、sentinelコンソールに参加したのか.
    注意事項
    独立モード・サービス側の注意点は、次のとおりです.
  • サービス・エンド・フロール・ルール(FlowRule)のclusterModeフィールドは、trueである必要があり、clusterConfigフィールドの属性を設定し、クラスタ関連構成を構成する必要があります.ここで最も重要なのは、flowIdフィールドであり、このフィールドは、一意のクラスタ・ルール構成表現
  • を表すために使用されます.
    [
        {
            "clusterConfig": {
                "fallbackToLocalWhenFail": true,    //     dump     
                "thresholdType": 0,         //     
                "windowIntervalMs": 1000,   //     
                "flowId": 11112             //     id,       
            },
            "clusterMode": true,        //       
            "controlBehavior": 0,
            "count": 2,                 //     
            "grade": 1,                 //     
            "limitApp": "default",      //           
            "resource": "/test1/demo4", //       
        }
    ]
    

    クライアントの例
    Maven
    
    <dependency>
        <groupId>com.alibaba.cspgroupId>
        <artifactId>sentinel-coreartifactId>
    dependency>
    
    <dependency>
        <groupId>com.alibaba.cspgroupId>
        <artifactId>sentinel-annotation-aspectjartifactId>
    dependency>
    
    <dependency>
        <groupId>com.alibaba.cspgroupId>
        <artifactId>sentinel-web-servletartifactId>
    dependency>
    
    <dependency>
        <groupId>com.alibaba.cspgroupId>
        <artifactId>sentinel-cluster-client-defaultartifactId>
    dependency>
    
    <dependency>
        <groupId>com.alibaba.cspgroupId>
        <artifactId>sentinel-transport-simple-httpartifactId>
    dependency>
    
    <dependency>
        <groupId>com.alibaba.cspgroupId>
        <artifactId>sentinel-datasource-nacosartifactId>
    dependency>
    

    コードの例
    //     Nacos       ,         IP、  
    NacosDataSource<ClusterClientAssignConfig> assignConfigNacosDataSource = 
        new NacosDataSource<>("localhost", 
            "DEFUALT", "dubb-sentinel-cluster-client-config.json", 
            serverAssignDatasourceConverter());
    //     Nacos       ,                  
    NacosDataSource<List<FlowRule>> dataSource = new NacosDataSource<>(
        "localhost", 
        "DEFUALT", 
        "dubb-sentinel-config.json", 
        converter());
    //               token    
    ClusterClientConfigManager.registerServerAssignProperty(assignConfigNacosDataSource.getProperty());
    ClusterClientConfigManager.applyNewConfig(new ClusterClientConfig().setRequestTimeout(1000));
    ClusterStateManager.applyState(ClusterStateManager.CLUSTER_CLIENT);
    //      Nacos       
    FlowRuleManager.register2Property(dataSource.getProperty());
    

    以上、クラスタのクライアントを構築する方法を示します.
    注意事項
  • クラスタのクライアントproject.nameの属性は必ずしも一致する必要はないが、サービス制限ストリームアプリケーションがどのアプリケーションに適用されるかに注意しなければならない.
  • クラスタのクライアントのルールは、clusterModeフィールドをtrueに設定、clusterConfigフィールド
  • を設定しなければならない.
    [
        {
            "clusterConfig": {
                "fallbackToLocalWhenFail": true,    //     dump     
                "thresholdType": 0,         //     
                "windowIntervalMs": 1000,   //     
                "flowId": 11112             //     id,       
            },
            "clusterMode": true,        //       ,  
            "controlBehavior": 0,
            "count": 4,                 //     
            "grade": 1,                 //     
            "limitApp": "default",      //           
            "resource": "/test1/demo4", //       
        }
    ]
    

    ここではclusterConfigフィールドがサービス側構成とほぼ一致していることを示します.これは必須です(少なくともIDは必要です).残りの構成は効果的ではありません.このクライアントがクラスタモードからローカルモードに劣化した場合にのみ、ローカルルールのストリーム制限が開始されます.
    埋め込みモードの詳細
    できるだけ早く更新...