フロー制御裁判官を参照して、センチネル・コアプロセスの前に導入されたとき、それは現在のローカル制限を判断し、またはクラスタを制限し、クラスタモードならば、それは別の支店に行くだろう、このセクションでは、分析のために、クラスタモデルになります。
I.基本概念
名前空間:役割を制限するには、どのような範囲に作用する一つのルールを区別するために使用します
フローID:センチネルは、IDによって様々なルールを区別するためにクラスタサーバーを制限し、グローバルに一意のルールIDを表し、そのグローバルに一意のままにしてください。通常、統合制御端末によって割り当てられた、又は時間DBを生成するために書かれたフローID。
thresholdType:制限スレッショルドは、クラスタモードを表します。スタンドアロンと同等の単一の共有均等モードしきい値の設定は、スタンドアロンモードとして(総閾値を算出するためのクライアント対応する名前空間に基づく制限、トークン・サーバ(デフォルトアプリケーション名project.nameが定義)に耐えることができ、前記接続そこに3つのクライアントがトークンサーバに接続されている、共有単と等しく閾値は、クラスタ30)の合計量に基づいて計算し、10であり、その閾値クラスタ全体に等しいグローバルモード設定されたしきい値の値。
2つの通信フレームワーク
センチネルクラスタ距離ベースの網状は、いくつかのインターフェースのデフォルトの実装を提供し、JDK自身のSPIを使用するクライアントとサービスに分割通信フレームワークを提供します。画像次のデフォルトでは、クライアントモジュールのクラスのセンチネル・クラスタ・クライアントの実装を示しています。
InitExecutorによってINITFUNC負荷はセンチネルコアモジュールでInitExecutor、ロード。InitExecutorは、グローバルアクセスのすべてのINITFUNC実装クラスをロードし、そのinitメソッドは、初期化を完了呼び出します。DefaultClusterClientInitFuncのすべてのタイプのモジュール構成INITFUNC実装クラス、例えば、符号化及び復号化プロセスベースの通信プロトコルを初期化します。コーデックResponseDataDecodeRegistry呼び登録方法およびプラントRequestDataWriterRegistryその後の使用のために、登録してください。システムは、PING、FLOW(フロー制御)とPARAM_FLOW(ホットフロー制御パラメータ)は、3つのコーデックを提供します。
要求に応じて、図センチネルクラスタ通信プロトコル形式、及び4バイトのメッセージIDと、1バイトのメッセージタイプ、メッセージ本体が残され、応答フォーマット、バイト1を有していますステータス情報。初期化ネッティークライアントの間に、2つのフィルタを追加することに留意すべきです。
読まれたときにメッセージを送る場合には、自動的に2バイト長ヘッダーメッセージの長さが追加され、自動的に2つのバイトのメッセージ長ヘッダを省略する。
上記のメッセージ・フォーマットを解決するためには、センチネルはまたClientEntityCodeProvider、統一された処理メッセージを提供し、上述の登録方法を提供します。
上記のように、SPIを使用して静的クラスの静的初期化コードブロック内、及びRequestEntityWriter ResponseEntityDecoder実装クラスを取得し、この2つのクラスは、このモジュールで実装されているデフォルトの実装を指定:DefaultResponseEntityDecoderとDefaultRequestEntityWriterを。このプロセスは、
ClientEntityCodecProvider->ResponseEntityDecoder->ResponseDataDecodeRegisty-> EntityDecoder
ClientEntityCodecProvider->RequestEntityWriter->RequestDataWriterRegisty-> EntityWriter
システムはまた、処置を対応する応答データストリームのためTokenClientHandlerクラスを提供します
それだけで、より重要なプロパティとメソッドを挙げました。このクラスは、ChannelInboundHandlerAdapterを継承し、対応する方法は、クライアントの現在の状態をマークするためのcurrentStateの属性を実装してブレークが発生した場合、disconnectCallbackは、再接続するための責任があります。サーバーへの接続がPING要求を確立されたときchannelActive方法を達成TokenClientHandler、それが送信されます。あなたは外したときに達成channelUnregistered方法は、待ち時間に関連した失敗の数と、一定時間後に再接続し、disconnectCallback呼び出されます。channelRead方法を実現します、応答がある場合、データは、応答内容を受信し、そして処理される次のように、処理の流れは次のとおりです。
メッセージが処理され、網状型オブジェクトを解析した後にスレッドを送信メッセージから得られるようにPING応答メッセージは、直接、出力、または設定に対応するID TokenClientPromiseHolder応答メッセージの内容をログに記録した場合、応答のタイプを決定します応答。
キャッシングのための上記TokenClientPromiseHolder要求メッセージ。以下、メッセージを送信した後、我々は、対応ChannelPromiseオブジェクトを取得し、TokenClientPromiseHolderに格納されたメッセージに応じました。ChannelPromiseは、インバウンドプロセス上のプロセスに対応する、要求応答を網状に戻って待機します。その後、通常の応答メッセージIDに従ってTokenClientPromiseHolderからの要求に対応する応答結果を得ることができます。
TokenService、ClusterTokenServerとClusterTokenClientのためのコアクラスタモジュールインターフェイス。前記内側の主要なクラスClusterTokenClient NettyTransportClientは、前記二つの他のインターフェイス以下、上述してきました。TokenService、以下のモジュールでClusterTokenServer関係:
ここで次のようにインタフェースは、SPIのデフォルトの実装で与えられます。
次に、関与するインタフェースとクラスについて説明します。
TokenService:トークンサービスインターフェイス、それぞれ、requestToken requestParamToken方法を提供し、ホットパラメータトークンを取得する流れ制御トークンを得ます。DefaultTokenServiceに提供されるデフォルトの実装は、SPIは、ときTokenServiceProviderの初期化をロードするために使用されます。
ClusterTokenServer:スタートを起動し、サーバを停止し、停止するための方法を提供し、サーバ側上位層インターフェイス。
NettyTransportServer:ClusterTokenServerネッティーがクライアントに対応する同じことを達成するため、パイプラインは以下の構成を有します
前記同様のクライアント側のコーデックを用いた処理が、サーバーのプロセッサを追加します。TokenServerHandlerを。接続が確立されると、対応する処理を実行するためChannelInboundHandlerAdapter TokenServerHandlerから継承されたデータとの相互作用:
channelActiveを達成:接続がキャッシュされるように確立された場合
channelInactiveを達成:あなたは外したときにキャッシュを削除します
channelReadを達成:処理のために到着したデータがあるとき。ここでは、タイプ(タイプフィールド)の要求に応じて適切な治療クラスを選択し、RequestProcessorProviderロードRequestProcessorを実装クラスを使用します。処理システムは、今のクラスは要求を完了するためにそれを呼び出して、最終的にTokenServiceProviderを通じてオブジェクトをDefaultTokenServiceますどちらもFlowRequestProcessorとParamFlowRequestProcessorを、持っています。
SentinelDefaultTokenServer:自分自身を更新するために、サーバの設定項目を監視するための変更ServerTransportConfigObserverの増加、NettyTransportServer方法を詰め。
EmbeddedClusterTokenServer:TokenServiceとClusterTokenServerから継承されたが、埋め込まれたサーバモードの場合、デフォルトの実装はDefaultEmbeddedClusterTokenServerです。
DefaultEmbeddedClusterTokenServer:メインDefaultTokenServiceとオブジェクトSentinelDefaultTokenServerインタフェースのメソッドを達成するために組み合わせます。
上記のサーバーを達成するために組み合わせることで、クライアントの要求は、プロセスのトークンすることができ、次のとおりです。
- クライアントは、トークン取得のrequestToken DefaultClusterTokenClientメソッドを呼び出し、それがNettyTransportClientを委託内部サーバー側のコーディングに送信されます
- 要求を受信した後NettyTransportServerサーバは、本明細書にそのようなFlowRequestProcessor、対応するメッセージ処理に委託要求されたコンテンツタイプに基づいて、処理方法TokenServerHandler channelRead
- FlowRequestProcessorがTokenServiceProvider GET TokenService対応する実装クラスを呼び出します、デフォルトはDefaultTokenServiceです。そして、クラスの処理を委託しました。
III。統計ロジック
一般的なホットフロー制御フロー制御パラメータ:以上のことから、クラスタモードは、買収トークンがDefaultTokenService責任があり、二つのタイプに分けられます。ここで一貫した両方の達成は、以下の処理フローのように、すなわちrequestToken DefaultTokenService方法、一般的なフロー制御を説明するために作られました。
要求されたrequestToken方法、リクエストパラメータであって、
ruleId:ルールID
acquireCount:トークン数を取得する必要があります
優先順位:優先順位をサポートするかどうか
DefaultTokenService最初ruleIdによれば、オブジェクトに対応するClusterFlowRuleManager GET FlowRuleルールを使用します。ClusterFlowRuleManager地図でruleIdキャッシュをベースにしており、ルールまたはロードルールを更新するときだけ1 ClusterMetricを割り当てます。
対応FlowRuleオブジェクトを取得した後、トークンは、必要を取得することができるかどうかを決定するために、ClusterFlowRuleCheckerを呼び出し
ID ClusterFlowRuleCheckerは、最初の名前空間に対応するルールのルールを取得し、その後、グローバルネームスペース内の状態は、主にステップGlobalRequestLimiter、それぞれ記憶されている被験者RequestLimiterに対応するような名前空間によって提供されるフロー制御を超えているか否かを判断します。RequestLimiterはLeapArrayから継承し、QPSは、図のように、一つの第二のグリッド10のためのデフォルトの実装を実現寸法のみスライディングウィンドウを提供します。グローバルフロー制御方法は、主tryPass RequestLimiter現在の算出されたグローバルQPS QPSルールセットよりも大きい使用されます。
対応する統計的ruleId寸法を得るために、記載ClusterMetricStatisticsをruleId取得ClusterMetricに対応し、貫通グローバル流れを制御します。最初現在時刻が利用可能なトークンがしきい値設定モードを区別thresholdtypeを設定されたルールに基づいて、ここにあるか否かを判定するモードがグローバルである場合、それは均等にスタンドアロンモードを共有している場合、直接電流制限値に応じます設定既存の値の末尾を掛けた顧客の量は、設定されたしきい値に達しました。あなたが更新される統計を持っていない優先順位とはサポートされていない場合は、成功を返した場合、あなたは直接リターンの失敗を取得します。優先順位をサポートしている場合、次のグリッドは、トークン借りてみてください(注:ボローがローカルモードでグリッド後方から借ります、彼らは最大待機時間を超えない)、借り手が成功した統計の更新で、成功を返した場合、それ以外の場合は失敗します。ClusterMetric次構造は、優先要求をサポートし、スライディング統計ウィンドウは、クラスタモードの複数のモードを提供し、ClusterMetriceLeapArrayから継承します。
IV。サーバの起動モード
センチネル・サーバーの起動モードは、単独で独立したモードに分け、組み込みモードを内蔵することができます。
スタンドアロンモード(単独)、独立したトークンサーバ・プロセスが開始されると、つまり、独立した展開、良い分離が、追加の展開が必要になります。グローバルレートリミッタとして適したスタンドアローンモードでは、クラスタへのトラフィック制御サービスを提供しています。
スタンドアロンモードでは、我々は、対応するClusterTokenServerの直接のインスタンスを作成することができ、main関数内の開始方法により、トークンサーバを起動します。
組み込みモード(内蔵)、それは、組み込みのトークンサーバやサービスと同じプロセスで開始することです。このモードでは、クラスタ内の各インスタンスは、いつでも変更することができピア、トークンサーバとクライアントをしているので、全く別の展開は、柔軟性が優れていません。しかし貧しい必要の単離は、アプリケーション自体の影響を防止するために、総QPSサーバートークンを制限します。内部アプリケーションクラスタフロー制御のための組み込みモード。
システムは、組み込みモードでクラスタフローコントロールのIDを変換するためのHTTP APIを提供します。
http://<ip>:<port>/setClusterMode?mode=<xxx>
前記モードは、クライアント、1台の代表サーバ、-1代表閉じるために0です。
要求は、現在のノードの状態を設定するために、最終的なコールClusterStateManager.applyState ModifyClusterModeCommandHandlerおよび方法によって処理されます。ところで、埋め込まれた表示モードは、サーバを起動することはできませんが、上記のapplyStateモードによって設定され、この方法は、内部にサービスを開始します。もちろん、クライアントは同じ上記の方法により、開始する表示されないことが、現在のノードがクライアントモードに設定してもよいです。現在のノードがクライアントに設定されている場合、それは最初の空でない場合は、オブジェクトを停止し、サーバを起動し、現在の組み込みモードでサーバ・オブジェクトを取得する、サーバを設定するときには逆に、最初のクライアント・オブジェクトを取得します空でない場合、最初に停止して、サーバー・オブジェクトが埋め込まれているモードを開始しています。アプリケーションがアクセスダッシュボードを開始した後、各ノードの役割は、管理コンソールを介して制御することができ、または中心からコンフィギュレーションルールをロードすることによって、ルールを変更します。
五.Handler
同じシステムのためのインターフェースのセンチネル輸送共通ハンドラ定義されたセットは、それによってコマンドノードを送信するためにデータ収集システムやアプリケーションを可能にする、HTTP対話型インタフェースを提供します。
一般的ないくつかの基本的なモジュールは、次のインターフェイスを提供します。
CommandCenterの:コマンドセンターは、開始とハンドラの初期化と登録サービスを提供していますstopメソッドを定義し、サービスとして開始しました。
HeartbeatSender:コンソールダッシュボードのタイミングにハートビートを送信するためのハートビート伝送インターフェース
CommandHandler:要求処理インタフェース、リクエストオブジェクトCommandRequest、応答オブジェクトはCommandResponseあります
プロセッサ名(URLパス名)を含む、メタデータを追加するためのアノテーション、ハンドラ及び説明:CommandMapping
上記のように、上記インタフェースは、一般的なモジュールであって、デフォルトの方法SPI /カスタム実装にロードするため、対応するプロバイダクラスを提供します。
CommandCenterProvider:SPI実装、複数の実装は、オーダー、最も高い優先度に応じて注釈が選択されている場合、セットをロードします
HeartbeatSenderProvider:SPI実装、複数の実装は、オーダー、最も高い優先度に応じて注釈が選択されている場合、セットをロードします
CommandHandlerProvider:すべての実装クラスハンドラ負荷は、でスキャンして使用するMETA-INFクラスに対応する完全修飾名を提供するハンドラSPIの方法限り実装異なるモジュールを提供しました。実装クラスは、URLを指定するには、注釈をCommandMapping増加させる必要があります。
以下の共通モジュールの実装のためのハンドラ
SPIの上図のインターフェイスと共通INITFUNCは、2つのHeartbeatSenderInitFunc CommandCenterInitFuncおよび実装クラスを含め、実装は、クラスがINITFUNC二つのインターフェースを実装し、InitExecutor呼び出されたときINITFUNCが達成されるすべての初期化を行います。対応するロール:
CommandCenterInitFunc:使用CommandCenterProviderが実装beforeStart続い達成対応CommandCenterのを取得し、サービスを開始する方法を開始します。限りそれはセンチネル輸送-共通モジュールをロードし、SPIにより、実装のCommandCenterを提供しているとして、INITFUNC上のサービスを開始しますと呼ばれています。
HeartbeatSenderInitFun:HeartbeatSenderProviderは、達成対応HeartbeatSenderを取得する方法sendHeartbeatを実行するために5秒ごとにタイマーを起動します。INITFUNCが呼び出されたときに限り、それはセンチネル輸送-共通モジュールをロードし、SPIによって実装HeartbeatSenderを提供しているとして、ハートビートタイマーを開始します。
上記、及び限り対応するレジスタによって達成実現HeartbeatSenderのCommandCenterおよびSPI、および対応するサービスとして自動的に両方のためのセンチネル輸送-単純httpおよびセンチネル輸送-網状モジュールを配置始めるとインターフェイスは、デフォルトの実装を提供します。
センチネル輸送-シンプル-HTTP SimpleHttpCommandCenterとSimpleHttpHeartbeatSenderのために提供を実現します。
SimpleHttpCommandCenter:ベースのソケット、単純なHTTPサーバーを提供するために、ブロックモード、新しいオープンスレッド、開始前にCommandHandlerProviderを介してすべてのHandlerオブジェクトをキャッシュし、スレッドは、対応するハンドラ要求を呼び出すには、処理とリターンのために来て
SimpleHttpHeartbeatSender:ダッシュボードのハートビートに構築されたSimpleHttpRequest HTTPリクエストを使用して送信します
センチネル輸送-ネッティー達成はNettyHttpCommandCenterとHttpHeartbeatSenderを提供します。
NettyHttpCommandCenter:ネッティー基づき、組み込みオブジェクトHttpServerHandlerリクエストの種類に応じて、オブジェクトのリクエストが来たときにデコードされ、処理され得ると呼んで対応するハンドラを起動する前に、サーバモードでCommandHandlerProvider Handlerオブジェクトによってキャッシュのすべてを開始リターン
HttpHeartbeatSender:HTTPClientのクライアントは、HTTP要求のハートビートを送信ダッシュボードを使用したいです
要約すると、センチネル・クラスタ・サーバのデフォルトモジュールには、以下のHandelrの実装にクラスタの情報を提供し、ダッシュボードからオーバー送信されたコマンドを受信するためのダッシュボードを提供します。
前記変更メッセージの先頭にシステムを変更し、読み始めたメッセージを取得します。
VI。クラスタ管理インターフェイス
動的ローディング規則または設定のために多くの予約管理インタフェースをセンチネルし、その後いくつかの管理インターフェイスモードについて説明するクラスタに関するローカル状態を更新します。これに先立ち、最初のデモモードでセンターの構成のためのナコスアクセスを導入しました。
さらにナコスアクセスは、2つのモジュール、センチネル・データソース拡張及びセンチネル・データソース - ナコスを含みます。拡張モジュールは、コンフィギュレーションデータSentinelPropertyを返すために、データソースからデータを読み取るためReadableDataSourceインタフェースを定義します。拡張モジュールは、抽象クラスはAbstractDataSource達成loadConfig方法実装提供します。このクラスが読み込まれSentienlProperty格納されたデータフォーマットをデータソースのデータ構造を変換するためのコンバータインターフェースとDynamicSentinelPropertyクラス、インタフェースコンバータを導入し、DynameicSentinelProperty SentinelPorpertyデフォルトクラスの実装、例えばPropertyListenerリスナーの複数で、添加することができます時の初期アクションリスナーのためのconfigLoadトリガーメソッドリスナーを追加し、データが変更された場合、1つの通知リスナーずつは、更新されたリスナーを思い出させるためにconfigLoadメソッドリスナーを呼び出します。AbstractDataSourceは、readSourceメソッドを呼び出すloadConfig方法を実現データソースから元のデータを読み出し、変換データ変換を呼び出します。
ナコス実現モジュールはナコス配信センタにアクセスするために、AbstractDataSourceこのから継承し、NacosDataSourceを提供します。NacosDataSourceはナコスの初期設定セットの間に適用し、リスナーを追加し、再度プロパティの値を設定し、更新するために、物流センターからロードされ、コンフィギュレーション・セットにリスナーに通知し、loadConfig再びそれを行います。リスナーは、設定が変更されたときに、メモリ処理を変換ナコスに呼びかけ、こと、およびコンフィギュレーションセットにリスナーを知らせると同時に、コンフィギュレーション・セットを更新します。
以上のことから、それがそのようにシステムの操作に応じて、データ・アイ・モニタと、動的構成設定に変更DynamicSentinelPropertyリスナーを使用して構成することができます。実際には、センチネルは、管理インターフェイスのほとんどがマネージャーを終了している、関連する鍵管理インターフェースのクラスタとして、このように処理され構築されました。これらの構造は、1つまたは複数のソースの内部構成を維持FlowRuleManagerと同じ管理インターフェイスを有し、そしてソースの構成にリスナーを設定、ソースデータの変更を設定する場合、設定方法はupdateValueソース、データソース設定の更新を呼び出しそして、リスナーに通知します。
FlowRuleManager
説明すると、このセンチネルコアモジュールが導入されている、主にローカルストレージ制限ルールがSentinelProperty <リストを設定します
>。そこルールが変更されたときに、ルール・セットのFlowPropertyListenerリスナーがルールをロードし、再構築されます。 ParamFlowRuleManager
FlowRuleManagerでは、主にホットパラメータ制限ルール管理のため。
ClusterClientConfigManager
クラスタクライアントの構成管理、鍵管理:
SentinelPropertyを設定するように構成されたクライアントを設定するタイムアウト時間のための1)のクラスタクライアントの設定、
そしてリスナーはClientConfigPropertyListener。ルールは、クライアントの要求タイムアウトを更新するように変更されます場合には 2)サービス端末を設定IPおよびポート情報のクラスタサーバの設定情報を、SentinelPropertyを設定するように構成されました
そしてリスナーはClientAssignPropertyListener。ルール変更は、ローカル設定を更新し、サーバー・ノードがServerChangeObserverのオブザーバーは、インタフェースのためのDefaultClusterTokenClientオブザーバは、サーバーを変更した情報を送信したときに切断されます見ることができる前の内容から変更していた送信通知したときに送信されます同じリンクして、同心円状のサーバーノードの前に新しいリンクを確立します。 ClusterServerConfigManager
クラスタサーバ構成管理、鍵管理:
SentinelPropertyを設定するように構成された、および、サーバポートのアイドル時間を設定する1)送信サーバクラスタ構成
そしてリスナーServerGlobalTransportPropertyListener。ルールはローカルの構成を更新するように変更して通知される場合には、視聴者ServerTransportConfigObserverの設定が変更されました。私たちは、サーバーが自分のアプリケーションを停止するための情報を送信するときに再起動し、変更され、閲覧者のインタフェースのために以前の内容、SentinelDefaultTokenServerから見ることができます。 グローバルフロー制御を構成2)クラスタサーバ、達成するスライディングウィンドウサイズを含む、グリッド・ウィンドウの数、等をQPSによって許容される最大のグローバル設定項目を設定するための制御フロー。設定SentinelPropertyに設定
ルールが更新されたときとリスナーServerGlobalFlowPropertyListenerは、これらの構成の内容をリセットします。 3)名前空間サーバークラスタ構成のセットは、クラスタを設定するための名前空間のセットはSentinelProperty <セットを設定するように構成されています
>そしてリスナーServerNamespaceSetPropertyListenerを、構成の変更は、現在のGlobalRequestLimiterの対応する完全な制限、クラスタを制限するルール、ホットスポットを制限するクラスタルールなど、古いな名前空間の構成を発生し、新しいな名前空間の設定を再ロードするときに削除されます。 ClusterFlowRuleManager
クラスタ構成管理、鍵管理を制限するルール:
1)クラスタ構成ルール、クラスタを設定するための規則はSentinelProperty <リストを設定するように構成されています
>そしてリスナーFlowRulePropertyListenerは、構成の変更、発生した名前空間を対応するキャッシュ設定を削除し、対応するルールを再構築します。新しいフローIDの場合は、対応するノードClusterMetricStatistics統計を割り当てられています。 ClusterParamFlowRuleManager
ClusterFlowRuleManagerでクラスタ構成管理を制限するホットルール、
ClusterStateManager
クラスタグローバル状態管理、鍵管理:
1)ロール構成ユニットはSentinelPropertyを設定します
そしてリスナーClusterStatePropertyListener、ルールはマシンの役割を調整するために変更されるとき。役割が含まれます:サーバー、クライアントおよび非クラスタモード。ルールは、非トランキングモードである、または関連する顧客端末サーバーを停止する場合は、サーバモードが設定されている場合は、クライアント接続の前にクライアントが閉鎖される場合、サービスは、埋め込みモードを開始します。クライアントのために設定した場合、サービスの終了がサービス外となります前にあればモード、それは、クライアント接続を開始します。
物流センター、管理ステーションによって設定項目を変更するために、そのような流通センターナコスとして、管理インターフェイスにアクセスすることができる上記のいくつかの。
個人公開番号:ああラクダ