DUICUO

リンクトレーシング:SleuthがZipKinを統合

「Spring Cloud Alibaba in Action」シリーズの前回の記事では、ユーザーマイクロサービス、商品マイクロサービス、注文マイクロサービス間のリモート呼び出しを実装し、これらのサービス呼び出しの負荷分散を実現しました。また、AlibabaのオープンソースSentinelをベースにしたサービスにレート制限とフォールトトレランスを実装し、Sentinelのコアテクノロジーと構成ルールについて詳細に紹介しました。

このセクションでは、サービスゲートウェイの概要とSpring Cloud Gatewayのコアアーキテクチャについて簡潔に説明します。また、Spring Cloud Gatewayをプロジェクトに統合してバックエンドのマイクロサービスへのアクセスを可能にする方法についても説明します。さらに、SentinelをSpring Cloud Gatewayに統合してレート制限機能を実装する方法についても説明します。Spring Cloud Gatewayのコアテクノロジーについては、分散トレースのセクションで詳しく説明します。分散トレースのセクションでは、まず分散トレースのテクノロジーとソリューションについて簡単に紹介し、次にSleuthをプロジェクトに統合して分散トレースを実装しました。

この章の概要

この章の概要

分散トレースにSleuthを統合する際、システムコールチェーンを把握するためにログに依存していました。これは完璧な解決策ではありません。システムに含まれるマイクロサービスが増えるにつれて、ログを介した呼び出しの分析は非常に複雑になり、実際のプロジェクトでは非現実的になります。この場合、SleuthとZipKinを統合し、ZipKinを使用してログを集約し、トレースログを視覚化し、全文検索をサポートすることができます。

ZipKin コアアーキテクチャ

ZipkinはTwitter発のオープンソースプロジェクトです。Google Dapperの論文に基づいており、マイクロサービスの動作中にリアルタイムのリンクデータを収集・表示できます。

ZipKinの概要

Zipkinは、マイクロサービスの運用中にリアルタイムのコールチェーン情報を収集し、開発者が分析できるようにWebインターフェース上に表示できる分散型コールトレーシングシステムです。開発者はZipkinからコールチェーンのパフォーマンスボトルネックを分析し、問題のあるアプリケーションを特定し、問題の箇所を特定して解決することができます。

ZipKin コアアーキテクチャ

ZipKin のコア アーキテクチャ図を以下に示します。

注: 画像ソース: zipkin.io/pages/architecture.html

ZipKin コア コンポーネントの機能は次のとおりです。

  • レポーター:主に特定のマイクロサービス アプリケーションで構成されるリンク データを報告する ZipKin 内のモジュール。
  • トランスポート: ZipKin 内のリンクデータを転送するためのモジュール。このモジュールは、Kafka、RocketMQ、RabbitMQ などに設定できます。
  • Collector: ZipKin 内のトレースデータを収集・利用するモジュールです。デフォルトでは HTTP プロトコル経由でデータを収集しますが、Kafka からデータを利用するように設定することもできます。
  • ストレージ: ZipKin 内のリンクデータを保存するモジュールです。このモジュールは、ElasticSearch、Cassandra、または MySQL で設定できます。現在、ZipKin はこれら 3 つのデータ永続化方法をサポートしています。
  • API: ZipKinのAPIコンポーネントは、主に外部アクセスインターフェースを提供するために使用されます。例えば、追跡情報をクライアントに表示したり、監視のために外部システムに公開したりできます。
  • UI: ZipKinのUIコンポーネントは、APIコンポーネント上に構築された高レベルアプリケーションです。このUIコンポーネントを通じて、ユーザーは追跡情報を簡単に直感的に照会・分析できます。

Zipkinは一般的に、ZipkinサーバーとZipkinクライアントの2つのエンドに分かれています。クライアントは主にマイクロサービスアプリケーション内で構成され、マイクロサービス内のコールチェーン情報を収集し、そのデータをZipkinサーバーに送信します。

プロジェクト統合 ZipKin

Zipkinは一般的にサーバーとクライアントに分かれています。ZipkinサーバーのJARファイルをダウンロードして起動し、Zipkinクライアントをマイクロサービスに統合する必要があります。

ZipKin サーバーをダウンロードしてインストールします。

(1) ZipKinサーバーのJARファイルをダウンロードします。ブラウザに以下のリンクを直接入力してダウンロードすることもできます。

 https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec

Linux オペレーティング システムを使用している場合は、コマンド ラインに次のコマンドを入力してダウンロードすることもできます。

 wget https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec

ここで、ブラウザ経由でダウンロードした ZipKin サーバー JAR ファイルは、zipkin-server-2.12.9-exec.jar です。

(2)コマンドラインに次のコマンドを入力して、ZipKinサーバーを起動します。

 java - jar zipkin - サーバー- 2.12.9 - exec.jar

(3) ZipKin サーバーは起動時にデフォルトでポート 9411 をリッスンするため、以下に示すように、ブラウザーに http://localhost:9411 と入力すると、ZipKin インターフェイスを開くことができます。

ブラウザに http://localhost:9411 と入力してページを開くことができれば、ZipKin サーバーが準備完了であることを意味します。

プロジェクトはZipKinクライアントを統合

(1)以下に示すように、各マイクロサービス(ユーザーマイクロサービスshop-user、製品マイクロサービスshop-product、注文マイクロサービスshop-order、ゲートウェイサービスshop-gateway)にZipKin依存関係を追加します。

 <依存関係>
<グループID > org.springframework.cloud < / グループID >
<artifactId> スプリング- クラウド- スターター- ジップキン< / アーティファクトId >
< 依存関係>

(2)ゲートウェイサービスshop-gatewayのapplication.ymlファイルに次の設定を追加します。

 
探偵
サンプラー:
確率1.0
ジプキン
ベース- URL : http://127.0.0.1:9411
検出- クライアント- 有効: false

各構成の説明を以下に示します。

  • spring.sleuth.sampler.probability: Sleuth がサンプリングするサンプルの割合を表します。
  • spring.zipkin.base-url: ZipKin サーバーのアドレス。
  • spring.zipkin.discovery-client-enabled: これを false に設定すると、Nacos はこれをサービス名ではなく URL として扱うようになります。

(3)ユーザーマイクロサービス、製品マイクロサービス、注文マイクロサービス、サービスゲートウェイをそれぞれ起動し、以下に示すように、ブラウザでリンクhttp://localhost:10001/server-order/order/submit_order?userId=1001&productId=1001&count=1にアクセスします。

(4) 以下に示すように、Zipkin インターフェースの検索ボタンをクリックします。

クリック後のインターフェースを以下に示します。

ご覧のとおり、検索ボタンをクリックすると、ゲートウェイ サービス server-gateway に 63.190 ミリ秒、注文マイクロサービス server-order に 53.101 ミリ秒、ユーザー マイクロサービス server-user に 14.640 ミリ秒、製品マイクロサービス server-product に 10.941 ミリ秒かかったというリクエスト チェーンが表示されます。

(5) 以下に示すように、ZipKinインターフェースに表示される呼び出しチェーンを開きます。

クリック後のインターフェースを以下に示します。

通話のアクセス チェーン全体を非常に明確に確認できます。

特定のノードをクリックして、詳細な通話情報を表示することもできます。

たとえば、ゲートウェイ マイクロサービスをクリックして、ゲートウェイの特定のリンクを表示すると、次のようになります。

クリック後の結果は以下に表示されます。

次に、以下に示すように、注文マイクロサービスの特定の呼び出しチェーン情報を調べてみましょう。

クリック後の結果は以下に表示されます。

ご覧のとおり、ZipKin を使用すると、サービスの呼び出しチェーンと特定のマイクロサービスの呼び出しステータスを表示できます。ZipKin を使用することで、システムの呼び出しチェーンを分析し、システムのボトルネックを特定し、ターゲットを絞った最適化を実行できます。

さらに、ZipKin は、次に示すように、システム コール チェーンの JSON データのダウンロードもサポートしています。

以下は JSON ボタンをクリックした後の結果です。

表示される JSON データを以下に示します。


[
[
{
"traceId" : "9d244edbc1668d92" ,
「親ID」 : 「3f01ba499fac4ce9」
「id」 : 「5f0932b5d06fe757」
「種類」 : 「サーバー」
「名前」 : 「/get/{pid} を取得」
「タイムスタンプ」 : 1652413758790051
「期間」 : 10941
「ローカルエンドポイント」 : {
"serviceName" : "server-product" ,
IPv4 : 192.168.0.111
},
「リモートエンドポイント」 : {
IPv4 : 192.168.0.111
「ポート」 : 54140
},
「タグ」 : {
"http.メソッド" : "GET"
"http.path" : "/product/get/1001" ,
"mvc.controller.class" : "ProductController" ,
"mvc.controller.method" : "getProduct"
},
「共有」true
},
{
"traceId" : "9d244edbc1668d92" ,
「親ID」 : 「3f01ba499fac4ce9」
「id」 : 「c020c7f6e0fa1604」
「種類」 : 「サーバー」
"name" : "/update_count/{pid}/{count} を取得" ,
「タイムスタンプ」 : 1652413758808052
「期間」 : 5614
「ローカルエンドポイント」 : {
"serviceName" : "server-product" ,
IPv4 : 192.168.0.111
},
「リモートエンドポイント」 : {
IPv4 : 192.168.0.111
「ポート」 : 54140
},
「タグ」 : {
"http.メソッド" : "GET"
"http.path" : "/product/update_count/1001/1"
"mvc.controller.class" : "ProductController" ,
"mvc.controller.method" : "updateCount"
},
「共有」true
},
{
"traceId" : "9d244edbc1668d92" ,
「親ID」 : 「9d244edbc1668d92」
「id」 : 「3f01ba499fac4ce9」
「種類」 : 「クライアント」
「名前」「取得」
「タイムスタンプ」 : 1652413758763816
「期間」 : 54556
「ローカルエンドポイント」 : {
"serviceName" : "server-gateway" ,
IPv4 : 192.168.0.111
},
「リモートエンドポイント」 : {
IPv4 : 192.168.0.111
「ポート」 : 8080
},
「タグ」 : {
"http.メソッド" : "GET"
"http.path" : "/order/submit_order"
}
},
{
"traceId" : "9d244edbc1668d92" ,
「親ID」 : 「9d244edbc1668d92」
「id」 : 「475ff483fb0973b1」
「種類」 : 「クライアント」
「名前」「取得」
「タイムスタンプ」 : 1652413758759023
「期間」 : 59621
「ローカルエンドポイント」 : {
"serviceName" : "server-gateway" ,
IPv4 : 192.168.0.111
},
「タグ」 : {
"http.メソッド" : "GET"
"http.path" : "/order/submit_order"
}
},
{
"traceId" : "9d244edbc1668d92" ,
「id」 : 「9d244edbc1668d92」
「種類」 : 「サーバー」
「名前」「取得」
「タイムスタンプ」 : 1652413758757034
「期間」 : 63190
「ローカルエンドポイント」 : {
"serviceName" : "server-gateway" ,
IPv4 : 192.168.0.111
},
「リモートエンドポイント」 : {
IPv4 : 127.0.0.1
「ポート」 : 54137
},
「タグ」 : {
"http.メソッド" : "GET"
"http.path" : "/server-order/order/submit_order"
}
},
{
"traceId" : "9d244edbc1668d92" ,
「親ID」 : 「3f01ba499fac4ce9」
「id」 : 「a048eda8d5fd3dc9」
「種類」 : 「クライアント」
「名前」「取得」
「タイムスタンプ」 : 1652413758774201
「期間」 : 12054
「ローカルエンドポイント」 : {
"serviceName" : "server-order" ,
IPv4 : 192.168.0.111
},
「タグ」 : {
"http.メソッド" : "GET"
"http.path" : "/user/get/1001"
}
},
{
"traceId" : "9d244edbc1668d92" ,
「親ID」 : 「3f01ba499fac4ce9」
「id」 : 「5f0932b5d06fe757」
「種類」 : 「クライアント」
「名前」「取得」
「タイムスタンプ」 : 1652413758787924
「期間」 : 12557
「ローカルエンドポイント」 : {
"serviceName" : "server-order" ,
IPv4 : 192.168.0.111
},
「タグ」 : {
"http.メソッド" : "GET"
"http.path" : "/product/get/1001"
}
},
{
"traceId" : "9d244edbc1668d92" ,
「親ID」 : 「3f01ba499fac4ce9」
「id」 : 「c020c7f6e0fa1604」
「種類」 : 「クライアント」
「名前」「取得」
「タイムスタンプ」 : 1652413758805787
「期間」 : 7031
「ローカルエンドポイント」 : {
"serviceName" : "server-order" ,
IPv4 : 192.168.0.111
},
「タグ」 : {
"http.メソッド" : "GET"
"http.path" : "/product/update_count/1001/1"
}
},
{
"traceId" : "9d244edbc1668d92" ,
「親ID」 : 「9d244edbc1668d92」
「id」 : 「3f01ba499fac4ce9」
「種類」 : 「サーバー」
「名前」 : 「get /submit_order」
「タイムスタンプ」 : 1652413758765048
「期間」 : 53101
「ローカルエンドポイント」 : {
"serviceName" : "server-order" ,
IPv4 : 192.168.0.111
},
「リモートエンドポイント」 : {
IPv4 : 127.0.0.1
},
「タグ」 : {
"http.メソッド" : "GET"
"http.path" : "/order/submit_order" ,
"mvc.controller.class" : "OrderController" ,
"mvc.controller.method" : "submitOrder"
},
「共有」true
},
{
"traceId" : "9d244edbc1668d92" ,
「親ID」 : 「3f01ba499fac4ce9」
「id」 : 「a048eda8d5fd3dc9」
「種類」 : 「サーバー」
「名前」 : 「/get/{uid} を取得」
「タイムスタンプ」 : 1652413758777073
「期間」 : 14640
「ローカルエンドポイント」 : {
"serviceName" : "サーバーユーザー" ,
IPv4 : 192.168.0.111
},
「リモートエンドポイント」 : {
IPv4 : 192.168.0.111
「ポート」 : 54139
},
「タグ」 : {
"http.メソッド" : "GET"
"http.path" : "/user/get/1001" ,
"mvc.controller.class" : "UserController" ,
"mvc.controller.method" : "getUser"
},
「共有」true
}
]
]

JSON データに基づいてシステムの呼び出しチェーンを分析することもできます。

ZipKin データの永続性

プロジェクトにZipKinを統合しましたが、ZipKinのデータは現在システムメモリに保存されています。ZipKinを再起動すると、このデータは失われます。どうすればデータ損失を防ぐことができますか?ZipKinは、Elasticsearch、Cassandra、またはMySQLにデータを保存することで、データ損失を防ぐデータ永続性をサポートしています。ここでは、MySQLとElasticsearchにデータを保存する方法に焦点を当てます。

ZipKin データの MySQL への永続化

(1) ZipkinデータをMySQLに保存するには、MySQLのデータテーブル構造を理解する必要があります。幸いなことに、ZipkinはMySQLスクリプトを提供しており、https://github.com/openzipkin/zipkin/tree/master/zipkin-storageからダウンロードできます。

もちろん、ダウンロードした MySQL スクリプトを、ゲートウェイ サービス shop-gateway のリソース ディレクトリの下の scripts ディレクトリに配置しました。

(2)以下に示すように、MySQLデータベースにzipkinという名前の新しいデータベースを作成します。

 zipkin が存在しない場合はデータベースを作成します

(3) 新しく作成したデータベースzipkinでmysql.sqlスクリプトを実行します。スクリプト実行後の結果は以下になります。

ご覧のとおり、zipkin データベースに zipkin_annotations、zipkin_dependencies、zipkin_spans という 3 つの新しいテーブルが作成されています。

(4)ZipKinを起動するときに、以下のようにMySQLデータソースを指定します。

 java - jar zipkin - server - 2.12.9 - exec . jar -- STORAGE_TYPE = mysql -- MYSQL_HOST = 127.0 .0 .1 -- MYSQL_TCP_PORT = 3306 -- MYSQL_DB = zipkin -- MYSQL_USER = root -- MYSQL_PASS = root

(5) ZipKinを起動したら、ブラウザで以下のリンクhttp://localhost:10001/server-order/order/submit_order?userId=1001&productId=1001&count=1にアクセスします。

(6) zipkinデータベースのデータを確認すると、zipkin_annotationsテーブルとzipkin_spansテーブルにすでにシステムコールチェーンデータが含まれていることがわかりました。

以下は、zipkin_annotations テーブルの部分的なビューです。

以下は、zipkin_spans データ テーブルの部分的なビューです。

ご覧の通り、ZipKin はデータを MySQL に永続化しています。ZipKin を再起動すると、MySQL からデータが読み込まれ、データが失われることはありません。

ZipKinデータはElasticsearchに保存されます

(1) ElasticSearchの公式サイトからElasticSearchをダウンロードします。リンクは以下のとおりです。

https://www.elastic.co/cn/downloads/elasticsearch.

ここでダウンロードしたインストール パッケージは elasticsearch-8.2.0-windows-x86_64.zip です。

(2) elasticsearch-8.2.0-windows-x86_64.zipを解凍し、解凍したbinディレクトリ内のelasticsearch.batスクリプトを見つけてダブルクリックし、ElasticSearchを実行します。

(3)ZipKinサーバーを起動する際に、以下のようにElasticSearchを指定します。

 java - jar zipkin - server - 2.12 .9 - exec . jar -- STORAGE_TYPE = elasticsearch -- ESHOST = localhost : 9200

(4) ZipKinサーバーを起動した後、ブラウザでリンクhttp://localhost:10001/server-order/order/submit_order?userId=1001&productId=1001&count=1にアクセスします(以下を参照)。

ZipKin はリクエストのリンク情報を永続化するために Elasticsearch に保存します。