|
「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サーバーとZipkinクライアントの2つのエンドに分かれています。クライアントは主にマイクロサービスアプリケーション内で構成され、マイクロサービス内のコールチェーン情報を収集し、そのデータをZipkinサーバーに送信します。 プロジェクト統合 ZipKinZipkinは一般的にサーバーとクライアントに分かれています。ZipkinサーバーのJARファイルをダウンロードして起動し、Zipkinクライアントをマイクロサービスに統合する必要があります。 ZipKin サーバーをダウンロードしてインストールします。(1) ZipKinサーバーのJARファイルをダウンロードします。ブラウザに以下のリンクを直接入力してダウンロードすることもできます。 https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=execLinux オペレーティング システムを使用している場合は、コマンド ラインに次のコマンドを入力してダウンロードすることもできます。 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依存関係を追加します。 <依存関係> (2)ゲートウェイサービスshop-gatewayのapplication.ymlファイルに次の設定を追加します。 春: 各構成の説明を以下に示します。
(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 データを以下に示します。
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 に保存します。 |