マイクロサービスはシンプルな分散ログ追跡を実装します

マイクロサービスはシンプルな分散ログ追跡を実装します

最近、プロジェクトに簡単な分散リクエスト追跡機能を追加したいと考えています。フロントエンドからゲートウェイへのリクエストを開始し、ゲートウェイから Spring Cloud マイクロサービスを呼び出します。これらのプロセス中に、ログから分散 ID リンクが表示されることを期待します。問題のトラブルシューティングを容易にするために、リクエスト ID を通じてリンク全体を追跡できます。

[[378163]]

既存のソリューションとしては、当然ながら SkyWalking、Spring Cloud Sleuth、Zipkin などのコンポーネントを使用することになります。ただし、ログクエリを容易にするために、さまざまなサービスで常に実行できる ID を記録することが主な目的であるため、複雑なコンポーネントをあまり導入したくありません。最終的に、MDC を介してログに追跡 ID を出力し、Feign と RestTemplate のマイクロサービスにリクエスト ID を渡すことにしました。

主にいくつかのステップが含まれます:

  • フロントエンドからリクエストIDを生成し、それをリクエストヘッダーに追加してゲートウェイに持ち込む
  • ゲートウェイは WebFilter を通じてメッセージを傍受し、MDC に参加してログに出力します。
  • FeignとRequestTemplateでは、リクエストIDをHTTPヘッダー内のマイクロサービスに渡します。
  • 各マイクロサービスもWebFilterによってインターセプトされ、MDCに追加され、ログに出力されます。

MDCC

MDC (Mapped Diagnostic Context) は、マルチスレッド条件下でのログ記録を容易にするために Log4j と Logback によって提供される機能です。 MDC は、キーと値のペアを追加できる、現在のスレッドにバインドされたハッシュ テーブルとして考えることができます。

MDCの主な業務:

  • 値を MDC に設定します: MDC.put(key, value);
  • MDC から値を取得します: MDC.get(key);
  • MDC の内容をログに出力します: %X{key}

TraceIdツールクラスを追加しました

まず、TRACE_ID の定数値と TRACE_ID の設定および生成方法を定義する TraceIdUtils ツール クラスを追加します。以降のコードはこの推定クラスを通じて操作されます。

  1. org.apache.commons.lang.RandomStringUtils をインポートします。
  2. org.apache.commons.lang.StringUtils をインポートします。
  3. org.slf4j.MDC をインポートします。
  4.  
  5. パブリッククラスTraceIdUtils {
  6. 公共 静的最終文字列 TRACE_ID = "traceId" ;
  7. プライベート静的最終int MAX_ID_LENGTH = 10;
  8.  
  9. /**
  10. * トレースIDを生成する
  11. */
  12. プライベート静的文字列genTraceId() {
  13. RandomStringUtils.randomAlphanumeric(MAX_ID_LENGTH)を返します
  14. }
  15.  
  16. /**
  17. * トレースIDを設定する
  18. */
  19. 公共 静的void setTraceId(文字列traceId) {
  20. // パラメータが空の場合は新しいIDを生成する
  21. トレース ID = StringUtils.isBlank(traceId) ? genTraceId(): トレースID;
  22. //MDCにtraceIdを入れる
  23. MDC.put(TRACE_ID、 StringUtils.substring (traceId、-MAX_ID_LENGTH));
  24. }
  25.  
  26. /**
  27. * トレースIDを取得
  28. */
  29. 公共 静的文字列 getTraceId() {
  30. // 得る
  31. 文字列traceId = MDC.get(TRACE_ID);
  32. // traceIdが空の場合は新しいIDを生成する
  33. StringUtils.isBlank(traceId)を返しますか? genTraceId(): トレースID;
  34. }
  35. }

WebFilter経由でTraceIdフィルターを追加する

リクエスト ヘッダーから TraceIdUtils.TRACE_ID に対応する値を取得するために、GenericFilterBean を追加します。この値は、フロントエンドがリクエストを開始するとき、またはマイクロサービス間で渡されるときに伝達されます。値がない場合、TraceIdUtils.setTraceId によって値が生成されます。

  1. org.springframework.core.annotation.Orderをインポートします
  2. org.springframework.web.filter.GenericFilterBean をインポートします。
  3.  
  4. @WebFilter(urlPatterns = "/*" , filterName = "traceIdFilter" )
  5. @注文(1)
  6. パブリッククラスTraceIdFilterはGenericFilterBeanを拡張します{
  7. @オーバーライド
  8. public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) は IOException、ServletException をスローします {
  9. //traceIdの初期化
  10. HttpServletRequest 要求 = (HttpServletRequest) リクエスト;
  11. 文字列 traceId = req.getHeader(TraceIdUtils.TRACE_ID);
  12. TraceIdUtils.setTraceId(traceId);
  13. // 後続のフィルターを実行する
  14. フィルターチェーン.doFilter(リクエスト、レスポンス);
  15. }
  16. }

SpringBoot スタートアップ クラスに @ServletComponentScan アノテーションを追加することを忘れないでください。そうしないと、カスタム フィルターは有効になりません。 「com.yourtion.trace.filter」は、TraceIdFilter が配置されているパッケージ名です。

  1. @ServletComponentScan(basePackages = "com.yourtion.trace.filter" )
  2. @SpringBootアプリケーション
  3. パブリッククラスMyApplication {
  4.  
  5. 公共 静的void main(String[] args) {
  6. SpringApplication.run(MyApplication.class、引数);
  7. }
  8. }

FeignにTraceIdを追加する

@FeignClient プロキシ クラスは実行時に Spring コンテキストの RequestInterceptor を使用するため、独自のインターセプターをカスタマイズして Spring コンテキストに挿入し、リクエスト コンテキストにカスタム リクエスト ヘッダーを追加できるようにします。

  1. feign.RequestInterceptor をインポートします。
  2. feign.RequestTemplate をインポートします。
  3. org.springframework.stereotype.Service をインポートします。
  4.  
  5. @サービス
  6. パブリッククラスFeignInterceptorはRequestInterceptorを実装します{
  7. @オーバーライド
  8. パブリックvoid 適用(リクエストテンプレート テンプレート) {
  9. template.header(TraceIdUtils.TRACE_ID, TraceIdUtils.getTraceId());
  10. }
  11. }

RestTemplate に TraceId を追加する

一部のリクエストは RestTemplate を通じて開始されます。以前は、RestTemplateConfig 構成クラスを独自に実装していました。今回は、関連する構成に以下を追加しました。

  1. RestTemplate restTemplate = builder.additionalInterceptors((リクエスト、本文、実行) -> {
  2. リクエスト.getHeaders()。 add (TraceIdUtils.TRACE_ID, TraceIdUtils.getTraceId());
  3. 実行を返します。execute (リクエスト、本文) ;
  4. })。建てる();

この時点で、リンクへの TraceId の追加は完了しており、残っているのはそれをログに印刷することだけです。

Log4j2のレイアウト形式を変更する

MDC に traceId を出力するために、ログのレイアウト形式を変更します。

  1. <! -- 元の形式 -->  
  2. <PatternLayout パターン = "%5p %c:%L - %m %throwable{セパレーター( --> )}%n" />
  3.  
  4. <! -- traceId フォーマットを追加 -->  
  5. <PatternLayout パターン = "%5p traceId:%X{traceId} %c:%L - %m %throwable{separator( --> )}%n" />

この時点で変更は完了です。

<<:  2021 年に組織が完璧なクラウド コンピューティング戦略を作成するための 3 つの柱

>>:  IBMはまたもや戦いに敗れた。クラウド コンピューティングは Big Blue に悪影響を及ぼしていますか?

推薦する

マイクロマーケティングの実践スキル

私は個人的にWeChatにあまり興味がありませんが、WeChatが本当に強力であることは事実です。W...

ウェブマスターネットワークニュース:JD.comが再びSina Weiboを放棄、Pacific Direct Purchaseが崩壊

1. 菜鳥の最新動向:アリババの物流事業を統合昨日(9月3日)、Cainiao Networkは最初...

クラウド コンピューティングを活用して IT 業界で環境の持続可能性を実現するにはどうすればよいでしょうか?

クラウド コンピューティング サービスは、主にエネルギー効率の向上と持続可能な慣行の促進を通じて、I...

ウェブサイトのオリジナルコンテンツは本当にユーザーエクスペリエンスを満たしていますか?

Baidu 検索の最近のアップグレードにより、ますます多くのウェブマスターが自分のウェブサイトのオリ...

調査によると、データセンター分野ではオープンコンピューティングプロジェクトが成長している

調査によると、データセンターのハードウェアを Open Compute Project (OCP) ...

ユーザーエクスペリエンスを向上させ、SEOに役立つ5つの必須WordPressプラグイン

SEO 担当者にとって、個人ブログは不可欠です。なぜなら、ブログは SEO 作業を支援し、SEO の...

ウェブサイトの最適化の各部分に何ポイント与えますか?

今年、Green Radish と Pomegranate アルゴリズムが導入され、SEO 業界は大...

峻雷企業研究報告:峻雷モデルのリスクと成長分析の再検討

1. 今回の上場によるXunleiの評価額は10億米ドル以上です。 2. Xunlei の主な収益は...

ウェブサイトの最適化では、独創性が降格の原因にならないように注意する必要があります。

コンテンツが王様の時代が到来しました。ウェブサイトの最適化を専門とする人たちも同じ気持ちでしょう。ウ...

Vaicdn: 申請不要の CDN、あらゆる業界、海外プロバイダーにアクセス可能、「香港」を含む 200 以上のノードをカバー

Vaicdn は、ワンストップ統合 CDN、AI ロードバランシング、DDoS 防御、Web アプリ...

数秒で新しいウェブサイトをBaiduに掲載するための代替方法

最近、中国のウェブマスターフォーラムを閲覧していたところ、多くの初心者ウェブマスターが解決が難しい問...

Yitan Cloud: クラウドサーバーフラッシュセール、米国\香港\本土、最低218元/年、QQ Music Green Diamond Deluxe Editionを1年間無料で提供

Yitan Cloud製品期間限定フラッシュセール&QQ Musicコレクションイベント開催中! Y...

中国を少し知る視点からウェブサイトマーケティングとタオバオプロモーションについて語る

今最も視聴率が高い番組は何かと聞かれたら、多くの人は人気があり物議を醸しているテレビシリーズ「マイン...

#セール# dedipath: 月額 50 ドル、デュアルチャネル E5-2620v2 + 1Gbps 無制限トラフィック

dedipath では、1 Gbps の帯域幅、無制限のトラフィック、デュアルコア E5、ニューヨー...

タオバオブランドQigege:25歳で確立したファストファッション

Qigegeのビジョンでは、将来的には、チャネルの面では、オフライン店舗を開設し、独自のプラットフォ...