先ほど、Dapr でサービス呼び出しを行う方法と、最も単純な状態管理について学習しました。このセクションでは、Dapr のパブリッシュ/サブスクライブ モードを有効にする方法を学習します。パブリッシャーは特定のトピックに関するメッセージを生成し、サブスクライバーは特定のトピックに関する情報をリッスンします。
次に使用する例には、パブリッシャーが含まれています。
さらに 3 人のメッセージ サブスクライバーが含まれます:
Dapr は、プラグ可能なメッセージ バスを使用してパブリッシュ/サブスクライブをサポートし、接続されたサービスの相互運用性を向上させるために、共通のイベント エンベロープ形式として CloudEvents (CNCF プロジェクト) にメッセージを配信します。 ここでは Redis Streams (Redis バージョン = > 5 で有効化) を使用しますが、RabbitMQ や Kafka などのミドルウェアを使用することもできます。次の図は、ローカル モードでコンポーネントが相互に接続される様子を示しています。 dapr パブリッシュ/サブスクライブ ローカル初期化Dapr を使用すると、ローカル マシンからクラウド環境に同じマイクロサービスをデプロイできます。この利便性を説明するために、まずこのサンプル プロジェクトをローカルにデプロイし、次に Kubernetes 環境にデプロイします。 Dapr サービスをローカルで使用するには、まず Dapr をローカルで初期化する必要があります。 $ dapr 初期化 何らかのネットワーク上の理由により、上記のコマンドが正常に初期化されない可能性があります。オフラインインストールを使用できます。 https://github.com/dapr/installer-bundle/releases にアクセスして、対応するシステムの Bundle 👝 パッケージをダウンロードし、解凍します。たとえば、ここに Mac M1 がある場合、ダウンロードするには次のコマンドを使用します。 $ wget https://github.91chi.fun/https://github.com/dapr/installer-bundle/releases/download/v1.8.4/daprbundle_darwin_arm64.tar.gz その後、次のコマンドを使用して再初期化できます。 $ dapr init -- from - dir daprbundle /
dapr コンテナ ニュース購読サービスここでは、以前に使用したクイックスタート プロジェクトを引き続き使用し、プロジェクトをローカルに複製します。 gitクローン [-b <dapr_version_tag>] https://github.com/dapr/quickstarts.git tutorials/pub_sub ディレクトリに移動します。 ➜ パブリッシュサブスクライブgit :(622b7d9) ls Nodeメッセージサブスクリプションサービスを実行するまず、Dapr を使用してノード メッセージ サブスクリプション サービスを実行します。 node-subscriber ディレクトリに移動し、依存関係をインストールします。 $ cdノードサブスクライバー ノード メッセージ サブスクリプション サービスを実行するには、次のコマンドを実行します。 $ dapr実行--app -idノード サブスクライバー--app -port 3000 ノードapp.js 上記のコマンドでは、app-id はマイクロサービスの一意の識別子、--app-port は Node アプリケーションが実行されているポート、最後にアプリケーションを実行するコマンドは node app.js です。 Python メッセージサブスクリプションサービスの実行次に、Dapr を使用して Python メッセージ サブスクリプション サービスを実行します。 python-subscriber ディレクトリに移動します。 $ cd python - サブスクライバー アプリケーションの依存関係をインストールします。 $ pip3 インストール-r 要件.txt ここでも、dapr run を使用してサブスクリプション サービスを実行します。 $ dapr run --app - id python - subscriber --app - port 5001 python3 app .py ここでは C# 環境がないため、Node および Python メッセージ サブスクリプション サービスのみを実行します。 メッセージ公開サービス次に、フロントエンドのメッセージ公開サービスである React を実行してみましょう。再度、 react-form プロジェクト ディレクトリに移動します。 $ cd react - フォーム 次に、次のコマンドを実行して依存関係をインストールし、サービスをビルドします。 $ npm ビルドクライアントを実行 ビルドが完了したら、次の dapr コマンドを使用してフロントエンド サービスを開始できます。 $ dapr run --app - id react -form --app - port 8080 npm run start を実行します == APP == Listening on port 8080! のようなログが表示されたら、アプリケーションが正常に起動したことを意味します。次に、ブラウザで http://localhost:8080 にアクセスして、フロントエンド アプリケーションにアクセスします。 フロントエンドページ たとえば、メッセージ タイプ A を選択し、メッセージ コンテンツを入力して、[送信] をクリックして送信し、上記の 2 つのメッセージ サブスクライバー サービス (Node と Python) のログを確認します。 件名を選択し、テキストを入力してメッセージを送信してください。それぞれの Dapr ログを監視します。 Dapr メッセージ購読および公開サービス Node サブスクライバーはタイプ A と B のメッセージを受信し、Python サブスクライバーはタイプ A と C のメッセージを受信するので、各コンソール ウィンドウのログ表示に注意してください。 さらに、Dapr CLI はテスト用のメッセージを公開するメカニズムを提供します。たとえば、次のコマンドを使用してメッセージを公開できます。 $ dapr publish -- publish - app - id react - form -- pubsub pubsub -- topic A -- データファイルmessage_a .json dapr-cli 公開 この時点で、メッセージのサブスクリプションと公開に Dapr を使用する機能のデモンストレーションが完了しました。 Kubernetesで実行上記では、デモ サービスをローカルに展開しました。 Dapr を使用して開発されたサービスはプラットフォームから独立しており、クラウド環境に簡単に移行できることがわかっています。たとえば、上記のサンプル アプリケーションを Kubernetes クラスターにデプロイします。 Kubernetes で同じコードを実行するには、まず Redis ストレージをセットアップし、次にマイクロサービスをデプロイする必要があります。同じマイクロサービスが使用されますが、最終的なアーキテクチャは異なります。 K8sで実行 Helm を使用して、bitnami の下に redis アプリケーションをインストールしました。 $ helm リポジトリにbitnami を追加しますhttps://charts.bitnami.com/bitnami Redis サービスを取得したら、パブリッシュ/サブスクライブ コンポーネントを作成する必要があります。前回の記事では、Redis を使用する状態管理コンポーネントを作成しました。対応するコンポーネント リソース リストは次のとおりです。 # デプロイ/ redis 。 ヤム 上記のリソース リストを適用するだけです。 $ kubectl apply -f デプロイ/ redis .yaml これで、Redis をミドルウェアとして使用するパブリッシュ/サブスクライブ コンポーネントができました。上記のオブジェクトの型は レディスパブリッシュサブスクライブ 次に、Python、Node、React-form の 3 つのマイクロサービスをデプロイします。 $ kubectl apply -f deploy / node - サブスクライバー.yaml デプロイ後、ポッドのステータスを確認します。 $ kubectl ポッドを取得する react-form マイクロサービスは、LoadBalancer タイプのサービスを通じてサービスを外部に公開します。 $ kubectl svc を取得します その後、割り当てられた EXTERNAL-IP を介してフロントエンド サービスにアクセスできるようになります。同様に、フロントエンド ページでいくつかの異なるメッセージ通知を送信し、kubectl logs を使用して Node および Python サブスクリプション サービスのログを観察します。 $ kubectl logs -- セレクターapp = node - subscriber - c node - subscriber K8s での Pub-Sub 仕組みサンプルのパブリッシュ/サブスクライブ アプリケーションがローカルと Kubernetes で実行されたので、これがどのように動作するかを分析してみましょう。アプリケーションは 2 つのサブスクライバーと 1 つのパブリッシャーに分かれています。 ノードメッセージサブスクリプションサービスnode-scriber ディレクトリに戻り、Node.js サブスクライバー コード app.js を確認します。このサービスは、Express を通じて 3 つの API エンドポイントを公開します。 1 つ目は GET エンドポイントです。 アプリ。 取得( "/dapr/subscribe" 、 ( _req 、 res ) => { このコードは、pubsub コンポーネントにサブスクライブするトピックを Dapr に指示します。 アプリ。 post ( "/A" 、 ( 要求、 応答) => { これら 2 つのエンドポイントは、各トピック タイプからのメッセージを処理します。ここではメッセージをログに記録するだけですが、より複雑なアプリケーションでは、ここでビジネス ロジックを処理する必要があります。 さらに、Subscription オブジェクトを直接作成して、どのサービスのどのコンポーネントのどのトピックをサブスクライブするかを宣言することもできます。 Python メッセージサブスクリプションサービスまた、python-subscriber ディレクトリに移動し、Python サブスクリプション サービスのコード ファイル app.py を表示します。 Node.js サブスクライバーと同様に、3 つの API エンドポイントを公開しますが、ここでは flask を使用し、最初のエンドポイントは GET エンドポイントです。 ルート( '/dapr/subscribe' 、 メソッド= [ 'GET' ])。 同様に、これは Dapr に pubsub コンポーネントのどのトピックをサブスクライブするかを指示します。ここでは、トピック A と C を持つ pubsub というコンポーネントをサブスクライブします。これらのトピックのメッセージは、他の 2 つのルートによって処理されます。 ルート( '/A' 、 メソッド= [ 'POST' ])。 Reactフロントエンドアプリケーション上記は2つのサブスクリプションサービスです。次に出版社を見てみましょう。当社のパブリッシャーはクライアントとサーバーに分かれています。 クライアントは、Create React App を使用して開始されたシンプルなシングルページ React アプリケーションです。関連するクライアント コードは react-form/client/src/MessageForm.js にあります。ユーザーがフォームを送信すると、React の状態は最新の集約された JSON データで更新されます。デフォルトでは、データは次のように設定されます。 { フォームが送信されると、集約された JSON データがサーバーに送信されます。 フェッチ( "/publish" 、 { サーバーは、POST エンドポイント /publish を公開する典型的な Express アプリケーションです。これはクライアントからのリクエストを受け取り、Dapr に従って公開します。 Express の組み込み JSON ミドルウェア関数は、受信リクエスト内の JSON を解析するために使用されます。 アプリ。 express.json () を使用します。 このようにして、送信された messageType を取得し、メッセージを公開するために使用するトピックを決定できます。 Dapr を使用してメッセージを公開するには、Dapr が提供する API エンドポイント (http://localhost:<DAPR_URL>/publish/<PUBSUB_NAME>/<TOPIC>) を直接使用することもできます。取得したデータに基づいて Dapr メッセージ公開用の URL を構築し、JSON データを送信します。 POST リクエストは、正常に完了した後、応答で成功コードを返す必要もあります。 const publishUrl = `$ { daprUrl } / publish / $ { pubsubName } / $ { req . 体? 。 メッセージタイプ} ` ; daprUrl アドレスのポートは、次のコードを使用して取得できます。 const daprUrl = `http : //localhost:${process.env.DAPR_HTTP_PORT || 3500}/v1.0`; デフォルトでは、Dapr は 3500 で実行されますが、Dapr をローカルで実行し、別のポートに設定すると (CLI 実行コマンドで --app-port フラグを使用)、そのポートは環境変数としてアプリケーションに挿入されます。 サーバーは、デフォルトのホームページ/ルートのリクエストをビルドされたクライアント側コードに転送することで、React アプリケーション自体もホストします。 アプリ。 取得( "/" 、 関数( _req 、 res ) { そのため、サーバーを介してフロントエンドページに直接アクセスできます。 パブリッシュ/サブスクライブ モデルは、マイクロサービス開発において非常に重要なモデルであり、高いスケーラビリティと疎結合を実現するために使用できます。パブリッシュとサブスクライブは、高いスケーラビリティを必要とする大規模なアプリケーションでよく使用されます。パブリッシュおよびサブスクライブ アプリケーションは、通常、従来のクライアント/サーバー アプリケーションよりもスケーラビリティが優れています。 Pub-sub を使用すると、コンポーネントを完全に分離できるため、パブリッシャーはサブスクライバーについて知る必要がなくなり、サブスクライバーもパブリッシャーについて知る必要がなくなります。これにより、開発者は相互に直接依存しない、よりスリムなマイクロサービスを作成できます。
|
<<: SaaS プロバイダーを選択する際に尋ねるべき重要な質問
サーバー仮想化は、VMware が登場した約 20 年前に爆発的に普及しました。しかし、長い道のりを...
過去 1 年間、企業はオフィスでの勤務から自宅からのリモート勤務への移行を可能にするテクノロジーを導...
ホウ・ジヨンJoyo.com の創設者から DHgate.com の現 CEO に至るまで、Wang...
Liziqiは幸運な人だと言う人が多すぎます。実際、李子奇の現在の状況は、最初から最も適切な道を選ん...
疫病の影響、貿易環境の変化、戦争紛争の影響…全体的な経済低迷とマクロ経済環境への高圧力の状況下で、す...
Racknerd は昨日、Sharktech のロサンゼルス データ センターの VPS サービスに...
[[403814]]この記事はWeChatの公開アカウント「Java Geek Technology...
gcorelabs 極東データセンター ウラジオストクはホスト キャットでテストされ、リリースされま...
メーデー後の新たな始まり - ウェブサイトをランク付けするには?この間、私のサイトの多くはランキング...
本日より、Namecheap はドメイン名移管の 1 週間限定プロモーションを開始しました。直接 3...
編集者注: ユーザー インターフェイスの設計は、ユーザーを維持したいアプリケーションや Web サイ...
インターネットは巨大であり、多くの企業は、顧客が検索エンジンを通じて自社を見つけられるようにするため...
Hosthatch はフロリダ州タンパに登録されています。Facebook でハードウェア機器を公開...
みなさんは公式アカウントに興味があるようですが、それらの記事だけでは不十分なので、今日はもうできない...
raksmart は毎年恒例のスーパープロモーションを開始しました。期間は 11 月 30 日までで...