Spring Cloud はマイクロサービス アーキテクチャを構築します: 分散サービス追跡 (追跡原則)

Spring Cloud はマイクロサービス アーキテクチャを構築します: 分散サービス追跡 (追跡原則)

前回の記事「分散サービス トレース (入門)」の例を通じて、Spring Cloud Sleuth を介してマイクロサービス アプリケーションに分散トレースを実装するための基本要素を追加しました。この記事では、分散サービス トラッキングを実装する際の重要なポイントについて詳しく説明します。

分散システムにおけるサービスの追跡は、理論的には複雑ではありません。主に以下の2つのポイントが含まれます。

  • リクエスト追跡を実装するには、リクエストが分散システムのエントリ エンドポイントに送信されたときに、サービス追跡フレームワークでそのリクエストの一意の追跡識別子を作成する必要があります。同時に、分散システム内を循環する場合、フレームワークは、要求元に返されるまで、常に一意の識別子を渡し続けます。この一意の識別子は、前の記事で説明した Trace ID です。トレース ID を記録することで、すべてのリクエスト プロセス ログを関連付けることができます。
  • 各処理ユニットの遅延時間をカウントするため、リクエストが各サービス コンポーネントに到達したとき、または処理ロジックが特定の状態に到達したとき、* 識別子を使用してその開始、特定のプロセス、および終了をマークします。この識別子は、前の記事で説明した Span ID です。各スパンには、開始ノードと終了ノードの 2 つのノードが必要です。スパンの始まりと終わりのタイムスタンプを記録することで、スパンの時間遅延をカウントできます。タイムスタンプ レコードに加えて、イベント名、リクエスト情報などの他のメタデータも含めることができます。

[[222355]]

クイック スタートの例では、spring-cloud-starter-sleuth コンポーネントの実装により、ログ レベルのトレース情報に簡単にアクセスできました。 Spring Boot アプリケーションでは、プロジェクトに spring-cloud-starter-sleuth 依存関係を導入することで、現在のアプリケーションの各通信チャネルの追跡メカニズムが自動的に構築されます。

  • RabbitMQ、Kafka(またはその他の Spring Cloud Stream バインダー実装)などのメッセージング ミドルウェアを介して配信されるリクエスト
  • Zuulプロキシを通過するリクエスト
  • RestTemplate を通じて開始されたリクエスト

クイック スタートの例では、trace-1 から trace-2 へのリクエストは RestTemplate を通じて実装されるため、spring-cloud-starter-sleuth コンポーネントがリクエストを処理します。 sleuth は、トレース 2 に送信する前に、トレースに必要な重要な情報をリクエストのヘッダーに追加します。主に次の情報です (ヘッダー情報の定義の詳細については、org.springframework.cloud.sleuth.Span のソース コードを表示することで取得できます)。

  • X-B3-TraceId: リクエストリンク(トレース)の***識別子。
  • X-B3-SpanId: 作業単位(Span)の一意の識別子。
  • X-B3-ParentSpanId: 現在の作業単位が属する前の作業単位を識別します。ルート スパン (リクエスト リンクの最初の作業単位) の値が空です。
  • X-B3-Sampled: サンプル出力フラグが使用されているかどうか。1 は出力が必要であることを意味し、0 は出力が不要であることを意味します。
  • X-Span-Name: 作業単位の名前

次のように、trace-2 の実装にいくつかの変更を加えることで、これらのヘッダー情報を出力できます。

  1. @RequestMapping(値 = "/trace-2" 、メソッド = RequestMethod.GET)
  2. パブリック文字列トレース(HttpServletRequest リクエスト) {
  3. logger.info( "===<call tr​​ace-2, TraceId={}, SpanId={}>===" ,
  4. リクエスト.getHeader( "X-B3-TraceId" )、リクエスト.getHeader( "X-B3-SpanId" ));
  5. 戻る  「トレース」 ;
  6. }

上記の変換後、クイック スタート サンプル コンテンツを再度実行し、trace-1 へのインターフェイス アクセスを開始します。次のような出力が得られます。 trace-2 のコンソールには現在処理中の TraceID と SpanId の情報が出力されます。

  1. --トレース-1  
  2. INFO [trace-1,a6e9175ffd5d2c88,8524f519b8a9e399, true ] 10532 --- [nio-9101-exec-2] icationEnhancerBySpringCGLIB27aa9624 : ===<call tr​​ace-1>===  
  3.  
  4. --トレース-2  
  5. INFO [trace-2,a6e9175ffd5d2c88,ce60dcf1e2ed918f, true ] 1208 --- [nio-9102-exec-3] icationEnhancerBySpringCGLIBa7d84797 : ===<call tr​​ace-2、TraceId=a6e9175ffd5d2c88、SpanId=be4949ec115e554e>===  

追跡情報をより直感的に観察するために、application.properties に次の構成を追加することもできます。

  1. ログレベル.org.springframework.web.servlet.DispatcherServlet =DEBUG

Spring MVC リクエストディスパッチログレベルを DEBUG レベルに調整すると、より多くのトレース情報を確認できます。

  1. --トレース-1  
  2. 2016-11-27 09:26:52.663 DEBUG [trace-1,a6e9175ffd5d2c88,a6e9175ffd5d2c88, true ] 10532 --- [nio-9101-exec-2] osweb.servlet.DispatcherServlet: 「dispatcherServlet」という名前の DispatcherServlet が [/trace-1] の GET リクエストを処理しています 
  3. 2016-11-27 09:26:52.666 DEBUG [trace-1,a6e9175ffd5d2c88,a6e9175ffd5d2c88, true ] 10532 --- [nio-9101-exec-2] osweb.servlet.DispatcherServlet : [/trace-1] の Last-Modified 値は -1 です 
  4. 2016-11-27 09:26:52.685 DEBUG [trace-1,a6e9175ffd5d2c88,8524f519b8a9e399, true ] 10532 --- [nio-9101-exec-2] osweb.servlet.DispatcherServlet: Null ModelAndView が 'dispatcherServlet' という名前の DispatcherServlet に返されました: HandlerAdapter がリクエスト処理を完了したと想定しています 
  5. 2016-11-27 09:26:52.685 DEBUG [trace-1,a6e9175ffd5d2c88,a6e9175ffd5d2c88, true ] 10532 --- [nio-9101-exec-2] osweb.servlet.DispatcherServlet: リクエストが正常に完了しました 
  6.  
  7. --トレース-2  
  8. 2016-11-27 09:26:52.673 DEBUG [trace-2,a6e9175ffd5d2c88,be4949ec115e554e, true ] 1208 --- [nio-9102-exec-3] osweb.servlet.DispatcherServlet: 'dispatcherServlet' という名前の DispatcherServlet が [/trace-2] の GET リクエストを処理しています 
  9. 2016-11-27 09:26:52.679 DEBUG [trace-2,a6e9175ffd5d2c88,be4949ec115e554e, true ] 1208 --- [nio-9102-exec-3] osweb.servlet.DispatcherServlet : [/trace-2] の Last-Modified 値は -1 です 
  10. 2016-11-27 09:26:52.682 DEBUG [trace-2,a6e9175ffd5d2c88,ce60dcf1e2ed918f, true ] 1208 --- [nio-9102-exec-3] osweb.servlet.DispatcherServlet: Null ModelAndView が 'dispatcherServlet' という名前の DispatcherServlet に返されました: HandlerAdapter がリクエスト処理を完了したと想定しています 
  11. 2016-11-27 09:26:52.683 DEBUG [trace-2,a6e9175ffd5d2c88,be4949ec115e554e, true ] 1208 --- [nio-9102-exec-3] osweb.servlet.DispatcherServlet: リクエストが正常に完了しました 

この記事の完全な例:

読者は、自分の好みに応じて、次の 2 つのリポジトリで trace-1 プロジェクトと trace-2 プロジェクトを表示することを選択できます。

Github: https://github.com/dyc87112/SpringCloud-Learning/

gitee: https://gitee.com/didispace/SpringCloud-Learning/

【この記事は51CTOコラムニスト「Zhai Yongchao」によるオリジナル記事です。転載の許可を得るには、51CTO を通じて著者に連絡してください。

この著者の他の記事を読むにはここをクリックしてください

<<:  仮想化バックアップについてお話しましょう

>>:  ビットコインマイニング技術: 分散データストレージ、ピアツーピア伝送、コンセンサスメカニズム、暗号化アルゴリズム...

推薦する

よりユーザーフレンドリーなサイトを構築する方法

国内のウェブマスターの多くは、独自のサイトを構築する際、検索エンジンやユーザーフレンドリーなエクスペ...

Baidu Webmaster製品がSEOにどのような影響を与えるかについて話します

2013年1月10日、Baiduの統計によると、Baiduは収集したウェブサイトの大部分を公開しまし...

「SEO最適化」 - 間違ったSEO用語について考える

SEO は Search Engine Optimization (検索エンジン最適化) の略語です...

電子商取引で何度も敗北してきた百度は、今や電子商取引のショッピングガイドになろうとしている

百度が電子商取引に強くないというのはもはやニュースではない。検索プロモーション、アフィリエイトプロモ...

垂直産業の「アリババ」となり、ニッチ分野の弱点を掴む方法

2012 年の電子商取引を振り返ると、プラットフォーム レベルの電子商取引の状況がより明確になりまし...

Java仮想マシンオブジェクトの生存判定とガベージコレクションアルゴリズム

[[323332]]この記事では主に、オブジェクトが生きているかどうかを判断する方法を説明し、Jav...

Pinduoduoの国境を越えた「人々」

Li Tian (仮名) さんは、マウスを動かしてページを更新した後、ウェブページにいくつかの大きな...

企業は最適化サイトと入札サイトをどのように扱うべきでしょうか?

どのビジネスでも、検索エンジン マーケティングを行う際には、入札に誰もが注目していると思います。多く...

ASO を行うときは注意してください。競合他社がピンインキーワードを使用してあなたのビジネスをコピーする可能性があることに注意してください。

これまで、インターネット上の多くの友人が、ブランドワード、業界ワード、競合他社ワードなど、 ASOに...

Red Hat の Zhang Xianmin: オープンハイブリッドクラウドの構築

2012 年、Red Hat はオープンソースの Linux ソフトウェアから始まり、年間収益が 1...

クラウドコンピューティングの需要急増によってもたらされたインフラストラクチャの課題と解決策

クラウド コンピューティングの急速な成長により、デジタル情報を消費および保存する方法が急速に変化しま...

Meituan.comが全国で従業員500人を解雇したと報道、当局は報道は事実無根と主張

新浪科技は9月26日午後、美団網が現在、全国規模で大規模な人員削減を実施しているとの情報を得たと報じ...

リモートワークにおけるクラウドドキュメントストレージの 5 つのメリット

オンプレミス インフラストラクチャとクラウド プラットフォームのどちらを採用するかのメリットについて...

virtnetwork - $3.95/KVM/4 コア/2IP/1G メモリ/50G ハードディスク/2.5T トラフィック

VirtNetwork は、実は GVH のボスが立ち上げた VPS ブランドで、主に KVM 仮想...

クラウド間バックアップとは何ですか?

ほとんどの企業は、オンプレミス データに対して強力なバックアップ戦略を導入することの重要性を理解して...