センチネルスロットは練習を拡張 - フロー制御ヒューズは、早期警告を達成します

序文

数日会社の増加により交通サービスへの生産環境は、フロー制御メカニズムセンチネルを引き起こした、とユーザーからのフィードバック遅いアクセス前に、位置決めがタスクにつながることが発見されたタスクの最適化をバック離した後、タスクを時限、トラフィックが正常に戻りました。

これは、学生のほとんどが経験している可能性があり、完全に通常の生産上の問題である可能事故だけでなく、再発につながる、後に問題を解決するために、それは何ものほとんどを経験し、最終的に悪いユーザーエクスペリエンスが得られ。私が思うように、すべての生産上の問題はもちろん、目的が再設定された責任にではなく、同じ過ち次回の再発を防ぐために、再設定する必要があります。我々は、単に問題を分析することをした後、当然のことながら、多数の要求を発行する不合理なタスクに監督のリード線の運用レベルであり、二つ目は、私たちだけで失礼なフロー制御フロー制御、ユーザーに影響を与えるにつながる、何より良い早期警戒措置はありません私たちが知っている(すなわち、フロー制御またはヒューズがトリガされました)。

当社のソリューションそれ?もちろん、予防の運用レベルであるが、これは本当にこの記事のポイントではありません、ここでの議論ではありません。二つ目は、我々はすぐにそのトリガーフロー制御の前に、そして早期介入治療を担当する関係者へのアラームは、トリガフロー制御ヒューズを防止することができますという警告です。もちろん、それは完全に回避することはできませんが、アラームがトリガされた後、フロー制御よりも良いか、ヒューズがはるかに優れています。

アリのセンチネルフロー制御を使用する前に、本論文のように具体的な実現がセンチネルでカスタムスロットを使用することであるため、このカスタムスロットカードスロット言葉を引き継ぐ、その後、デモコードを追加しますセンチネル公式文書、Iプロセスの使用にも多くのピット、その共有への皆のための結果に遭遇しました。

我々は非常にセンチネルの理解されていない場合は、単にgithubのこの記事を読んで理解しようとして行くことができます。githubのアドレスします。https://github.com/alibaba/Sentinel

ます。https://github.com/alibaba/Sentinel/wiki/Sentinel%E5%B7%A5%E4%BD%9C%E4%B8%BB%E6あなたはどのようにセンチネルでカスタムスロット機能の提案の表情に精通しになりたい場合は%B5%81%E7%A8%8B

同様に、カスタムスロット文言のためのデモのソースコードのようにします。https://github.com/alibaba/Sentinel/tree/master/sentinel-demo/sentinel-demo-slot-chain-spi

実現

ここでは、関連するセンチネルは、早期警戒機能の下で達成されている、あなたは、このようなフロー制御や吹きセンチネルの機能として既に使用中のシステムを使用して提供されます。

  1. カスタムCustomSlotChainBuilderはこのチェーン主に当社のカスタムスロットを追加SlotChainにここSlotChainBuilderインタフェースを実現します
輸入com.alibaba.csp.sentinel.slotchain.ProcessorSlotChain; 
輸入com.alibaba.csp.sentinel.slotchain.SlotChainBuilder。
輸入com.alibaba.csp.sentinel.slots.DefaultSlotChainBuilder。
輸入com.qiaofang.tortoise.gateway.component.ApplicationContextUtil; 
輸入com.qiaofang.tortoise.gateway.config.SentinelProperties。
輸入org.springframework.stereotype.Component; 

輸入javax.annotation.Resource; / **
 *自定义スロット
 *
 * @author chenhao
 * /
 publicクラスCustomSlotChainBuilder実装SlotChainBuilder { 
    @Override 
    公共ProcessorSlotChainビルド(){




        ProcessorSlotChainチェーン=新しいDefaultSlotChainBuilder()ビルド(); 
        SentinelProperties sentinelProperties =(SentinelProperties)ApplicationContextUtil。getContext().getBean( "sentinelProperties"); 
        chain.addLast(新しいFlowEarlyWarningSlot(sentinelProperties)); 
        chain.addLast(新しいDegradeEarlyWarningSlot(sentinelProperties)); 
        チェーンを返します。
    } 
}

2.カスタムFlowEarlyWarningSlot、DegradeEarlyWarningSlot流体警告ヒューズスロット2

輸入com.alibaba.csp.sentinel.context.Context; 
輸入com.alibaba.csp.sentinel.node.DefaultNode。
輸入com.alibaba.csp.sentinel.slotchain.AbstractLinkedProcessorSlot; 
輸入com.alibaba.csp.sentinel.slotchain.ResourceWrapper; 
輸入com.alibaba.csp.sentinel.slots.block.flow.FlowRule。
輸入com.alibaba.csp.sentinel.slots.block.flow.FlowRuleChecker; 
輸入com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; 
輸入com.alibaba.csp.sentinel.slots.block.flow.FlowRuleUtil; 
輸入com.alibaba.csp.sentinel.util.AssertUtil; 
輸入com.google.common.collect.Lists。
輸入org.slf4j.Logger; 
輸入org.slf4j.LoggerFactory。
輸入org.springframework.beans.BeanUtils。
輸入org.springframework.util.CollectionUtils。

輸入はjava.util.List; 
輸入java.util.Map; 
輸入java.util.stream.Collectors。/ **
 *流控预警スロット
 *
 * @author chenhao
 * /
 publicクラスFlowEarlyWarningSlot2が延びるAbstractLinkedProcessorSlot <DefaultNode> { / **
      *ログ
      * /
プライベートロガーロガー= LoggerFactory。getLogger(this.getClass())。
    民間最終FlowRuleCheckerチェッカー。
    パブリックFlowEarlyWarningSlot2(){ 
        この(新しいFlowRuleChecker())。
    } / **
      *パッケージプライベートテストのため。
     *
      *



    



    @param チェッカー 
            FlowRule earlyWarningRule =新しいFlowRule()。フロー・ルール・チェッカ
      * @since 1.6.1
      * /
 FlowEarlyWarningSlot2(FlowRuleCheckerチェッカー){ 
        AssertUtil。notNullを(チェッカー、「フローチェッカがヌルであってはなりません」)。
        this.checker =チェッカー。
    } 


    プライベートリスト<FlowRule> getRuleProvider(文字列リソース){ 
        //フロールールマップはnullであってはなりません。
        一覧<FlowRule>ルール= FlowRuleManager。getRules(); 
        一覧<FlowRule> earlyWarningRuleList =リスト。newArrayList(); 
        用(FlowRuleルール:ルール){ 
            々 BeanUtils。copyProperties(ルール、earlyWarningRule)。
             / **
              *これは、元のルール変更閾値80%に相当し、効果は事前の警告となり、
              構成が0.8行われることが推奨される*
              * /
 earlyWarningRule.setCount(rule.getCountを()* 0.8)。
            earlyWarningRuleList.add(earlyWarningRule); 
        } 
        地図<文字列、リスト<FlowRule >> flowRules = FlowRuleUtil。buildFlowRuleMap(earlyWarningRuleList); 
        リターンflowRules.get(リソース); 
    } / **
      *原産地規則をGET
      *
      * @param リソース
 * @return
 * /
プライベートFlowRule getOriginRule(文字列リソース){

    
        一覧<FlowRule> originRule = FlowRuleManager。 getRules。。().stream()フィルタ(flowRule - > flowRule.getResource()に等しい(リソース))を収集(コレクターToListメソッド())。
        IF(。CollectionUtils のisEmpty(originRule)){ 
            戻りヌル。
        } 
        originRule.get(0)を返します。
    } 

    @Override 
    公共ボイドエントリ(コンテキスト・コンテキスト、ResourceWrapper resourceWrapper、DefaultNodeノード、INTカウント、優先ブール、オブジェクト...引数)が
            Throwableを{スロー
        文字列リソース= context.getCurEntry()getResourceWrapper()のgetNameを()。。。
        リスト<FlowRule>ルール= getRuleProvider(リソース)
        もし(ルール!= NULL){
            {(ルールFlowRuleルール)のために
                //ここでルールを取得は、検査しきい値は、その80パーセント本物のしきい値を示す場合には80%のしきい値を、構成され、いずれかの担当に対応する人物にアラームを送信している
                場合(!Checker.canPassCheck(ルール、コンテキスト、ノード、COUNT、優先順位付き)){ 
                    FlowRule originRule = getOriginRule(リソース); 
                    文字列originRuleCount = originRule == NULL "不明":文字列?。のvalueOf(originRule.getCount()); 
                    logger.info(「FlowEarlyWarning:サービス{}現在のインデックスは、流量{}、近くのフロー制御設定されたしきい値を超えている:{}」、リソース、rule.getCount()、originRuleCountを); 
                    // TODO警報自己達成
                    ブレーク; 
                } 
            } 
    @Override 
        }
        fireEntry(コンテキスト、resourceWrapper、ノードカウント、優先順位付け、引数)。
    } 

    公共ボイド出口(コンテキスト・コンテキスト、ResourceWrapper resourceWrapper、INTカウント、オブジェクト...引数){ 
        fireExit(文脈、resourceWrapper、カウント、引数)。
    } 
}
輸入com.alibaba.csp.sentinel.context.Context; 
輸入com.alibaba.csp.sentinel.node.DefaultNode。
輸入com.alibaba.csp.sentinel.slotchain.AbstractLinkedProcessorSlot; 
輸入com.alibaba.csp.sentinel.slotchain.ResourceWrapper; 
輸入com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule。
輸入com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager; 
輸入com.alibaba.csp.sentinel.util.AssertUtil; 
輸入com.google.common.collect.Lists。
輸入com.qiaofang.tortoise.gateway.config.SentinelProperties。
輸入org.slf4j.Logger; 
輸入org.slf4j.LoggerFactory。
輸入org.springframework.beans.BeanUtils。
輸入org.springframework.util.CollectionUtils。

java.util.Listにインポートし、
インポートjava.util.stream.Collectors; / **
 *警告ブロースロット
 *
 * @author Chenhao
 * /
 publicクラスは延びAbstractLinkedProcessorSlot <DefaultNode> {DegradeEarlyWarningSlot2 / **
      *ログ
      * /
プライベートロガー=ロガーLoggerFactoryの。のgetLogger(this.getClass()); / **
      *フロー制御ルールに実質的に一致が元を取ることでは同じではありません
      * @param リソース
 * @return
 * /
プライベートリスト<DegradeRule> getRuleProvider(文字列リソース){ 
        //地図フローはnullを支配する。すべきではない
        リスト<DegradeRule> = DegradeRuleManagerルール。



    

    getRules(); 
        一覧<DegradeRule> earlyWarningRuleList =リスト。newArrayList(); 
        (DegradeRuleルール:ルール)についての{ 
            DegradeRule earlyWarningRule =新しいDegradeRule()。
            々 BeanUtils。copyProperties(ルール、earlyWarningRule)。
            earlyWarningRule.setCount(rule.getCount()* 0.8); 
            earlyWarningRuleList.add(earlyWarningRule)。
        } 
        。。earlyWarningRuleList.stream()フィルタを返す(ルール- > resource.equals(rule.getResource()))を収集(コレクターをToListメソッド())。
    } / **
      *原産地規則を取得する
      *
      * @param

    リソース
 * @return
 * /
プライベートDegradeRule getOriginRule(文字列リソース){ 
        一覧<DegradeRule> originRule = DegradeRuleManager。getRules().stream()フィルタ-収集(コレクター。。(ルール> rule.getResource()(リソース)に等しい。)。ToListメソッド())。
        IF(。CollectionUtils のisEmpty(originRule)){ 
            戻りヌル。
        } 
        originRule.get(0)を返します。
    } 

    @Override 
    公共ボイドエントリ(コンテキスト・コンテキスト、ResourceWrapper resourceWrapper、DefaultNodeノード、INTカウント、ブール優先、オブジェクト...引数) 
            のThrowableを{スロー
        文字列リソース= context.getCurEntry()getResourceWrapper()のgetName()。。。 
        一覧<DegradeRule> = getRuleProviderルール(リソース); 
        IF(= NULLルール!){ 
            (DegradeRuleルール:ルール)について{ 
                IF(rule.passCheck! (コンテキスト、ノード、COUNT)){ 
                    DegradeRule originRule = getOriginRule(リソース); 
                    文字列originRuleCount = originRule == NULL "不明" :?ストリング。のvalueOf(originRule.getCount()); 
                    logger.info(「DegradeEarlyWarning:サービス{}現在のインデックスは} {ヒューズを超え、近い定着閾値に配置している:{}」、リソース、rule.getCount()、originRuleCount)を、
                    BREAK; 
                } 
            } 
        } 
        fireEntry(文脈、resourceWrapper、ノード、COUNT、優先、引数); 
    }

    @Override 
    ます。public void終了(コンテキストコンテキスト、ResourceWrapper resourceWrapper、int型の数、オブジェクト...引数){ 
        fireExit(文脈、resourceWrapper、回数、引数); 
    }

リソース3.がMETA-INF.servicesの下に新しいフォルダをフォルダ、新しいファイルcom.alibaba.csp.sentinel.slotchain.SlotChainBuilder(ファイルの名前は重要ではありません)、次のように読み込みます

#ここにあなたのCustomSlotChainBuilderの完全なパッケージパス書くこと
com.xxx.sentinel.CustomSlotChainBuilderを

ここでは基本的に、プロセスが単純に数小節に名前を付けるために、ピットの多くを使用または遭遇します

  • コントローラがプライベートであるFlowRuleプロパティであるとき、基本的な検証ルールはとてもFlowRuleUtilによって元の構成を再生成するために直接取得するために、使用するのでFlowRule直接変更回数プロパティは、無意味です後
  • デバッグプロセスは、DefaultNodeが1S内の多くの点であるの値が有効な力の外観は無知場合、デバッグ方法A、方法Bの値が、消えてもよいです

最後に書かれました

    私はめったにハッハッハ私を噴霧タップを求めて、我々は前方に置くことができますので、何が厳しいや場所、問題ではありません、このような技術のブログを書きません

 

おすすめ

転載: www.cnblogs.com/1994july/p/12412046.html