Dapr を使用してマイクロサービスをゼロから簡素化する例

Dapr を使用してマイクロサービスをゼロから簡素化する例

序文

既存のマイクロサービス モデルでは、登録センター、サービス検出、サービス呼び出しリンク追跡、要求サーキット ブレーク、再試行フロー制御など、多数のインフラストラクチャ モジュールをビジネス コードに統合する必要があり、システムが肥大化して重くなってしまいます。

新世代のマイクロサービス モデルである Dapr は、サイドカー モデルを使用して既存のマイクロサービス システム コードを簡素化し、サイドカー モデル内のインフラストラクチャ層を分離することで、開発者がビジネス ロジックの作成に集中できるようにします。

この記事では、net6 と dapr1.5 に基づいて dapr の簡単な使用例を構築します。

1. Dockerをインストールする

Dapr の動作は Docker 環境に依存します。

学習環境として、Centos 7 システムを使用して Docker をインストールします。

Docker をインストールするには、daocloud ワンクリック インストール コマンドを使用することをお勧めします。

curl -sSL https://get.daocloud.io/docker | sh

インストールが完了したら、次のコマンドを実行します。

[root@localhost ~]# docker -v
Docker バージョン 20.10.11、ビルド dea9396

対応する Docker バージョンが表示されれば、インストールは成功です。

2. Dapr CLIをインストールする

公式の説明: Dapr CLI は、さまざまな Dapr 関連のタスクを実行するためのメイン ツールです。 これを使用すると、Dapr サイドカーを使用してアプリケーションを実行できるほか、サイドカー ログを表示したり、実行中のサービスを一覧表示したり、Dapr ダッシュボードを実行したりできます。

Dapr CLI をダウンロード

wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash

インストールを確認する

dapr -v

次の出力が表示されればインストールは成功です。

CLI バージョン: 1.5.0
ランタイムバージョン: 1.5.0

国内のネットワークの問題により、公式の Dapr インストール方法を使用すると、通常さまざまな問題が発生するため、dapr をダウンロードしてスクリプトを通じてインストールします。

ホストファイルを変更する

vi /etc/hosts
140.82.114.4 github.com  
199.232.69.194 github.global.ssl.fastly.net
140.82.114.9 コードロード.github.com

キャッシュを更新する

yum インストール -y nscd
サービス nscd 再起動

まず Git をインストールし、次のコマンドを実行する必要があります。

git クローン -v https://gitee.com/Two-Twoone/dapr-installer.git
cd dapr-installer/
./install.sh

まだ遅いですが、まったくダウンロードできないよりはましです。

上記のコマンドは複数のコンテナを起動します。確認するには次の操作を実行します。

[root@localhost dapr-installer]# docker ps --format "テーブル {{.ID}}\t{{.Names}}\t{{.Ports}}"
コンテナID名ポート
a0565f609846 dapr_placement 0.0.0.0:50005->50005/tcp、:::50005->50005/tcp
c392f5cf7a18 dapr_redis 0.0.0.0:6379->6379/tcp、:::6379->6379/tcp
2ee68c450b29 dapr_zipkin 9410/tcp、0.0.0.0:9411->9411/tcp、:::9411->9411/tcp

3. Net6 SDKをインストールする

rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
 yumアップデート
 yum で dotnet-sdk-6.0 をインストールします

4. アプリケーションを作成する

製品とカートの2つのプロジェクトを作成し、Daprを参照します。

dotnet パッケージ Dapr.AspNetCore を追加します

Program.cs でのAddDaprの呼び出しによりDaprClientクラスが ASP.NET Core インジェクション システムに登録されます。 クライアントが登録されると、 DaprClientのインスタンスをサービス コードに挿入して、Dapr サイドカー、ビルディング ブロック、コンポーネントと通信できるようになります。

ビルダー.Services.AddControllers().AddDapr();

4.1 サービスコール

マイクロサービス システムでは、サービス間の呼び出しが不可欠です。主な難しさは、サービスの場所、エラー発生時の再試行方法、負荷分散などの問題に集中しています。

Dapr は、これらの問題を解決するために、サービスのリバース プロキシ モジュールとしてサイドカーを使用します。

次のコードを製品プロジェクトに追加します

[ルート("api/[コントローラー]")]
    [APIコントローラー]
    パブリッククラス ProductController: ControllerBase
    {
        プライベート ILogger<ProductController> _logger;

        パブリック ProductController(ILogger<ProductController> ロガー)
        {
            _logger = ロガー;
        }
        プライベート静的読み取り専用List<string> products = 新しいList<string> { "aa", "bb", "cc", "dd", "ee", "ff", "gg", "hh", "ii", "jj", "kk", "ll", "mm", "nn" };
        [HttpGet]
        パブリックアクション結果取得()
        {
            _logger.LogInformation($"製品を取得するメソッドが呼び出されました");
            文字列[] temps = 新しい文字列[5];
            (int i = 0; i < 5; i++) の場合
            {
                ランダム random = new Random(Guid.NewGuid().GetHashCode());
                temps[i] = products[random.Next(0, products.Count - 1)];
            }
            Ok( temps ) を返します。
        }
    }
# 製品プロジェクトを開始します dapr run --app-id ProductDemo --app-port 5010 --dapr-http-port 7015 -- dotnet /root/www/product/Dapr.Product.Sample.dll --urls http://*:5010

カート プロジェクトでは、次のコードを追加します。dapr は、http および grpc 呼び出しメソッドをサポートしています。ここでは、よく使用される webapi を例として、http を使用して呼び出します。

InvokeMethodAsync メソッドの appid は、呼び出しアドレスに関係なく、dapr run の appid に対応します。

[ルート("api/[コントローラー]")]
    [APIコントローラー]
    パブリッククラス CartController: ControllerBase
    {
        プライベート読み取り専用 DaprClient _daprClient;
        プライベート読み取り専用 ILogger<CartController> _logger;
        パブリック CartController(DaprClient daprClient、ILogger<CartController> ロガー)
        {
            _daprClient = daprClient;
            _logger = ロガー;
        }

        [HttpGet]
        [ルート("GetProducts")]
        パブリック非同期タスク<IActionResult> GetProducts()
        {
            _logger.LogInformation($"カートの商品を取得");
            var products = await _daprClient.InvokeMethodAsync<List<string>>(HttpMethod.Get, "ProductDemo", "/api/Product/GetAll");
            Ok(製品)を返します。
        }
    }

プログラムをLinuxサーバーにアップロードして実行する

# Cart プロジェクトを開始します dapr run --app-id CartDemo --app-port 5020 --dapr-http-port 7025 -- dotnet /root/www/cart/Dapr.Cart.Sample.dll --urls http://*:5020

インターフェースを呼び出すと、Cart プロジェクトがほとんどコードの侵入なしにインターフェース呼び出しを実装していることがわかります。

[root@localhost ~]# curl -X 'GET' 'http://192.168.2.110:5020/api/Cart/GetProducts'
["aa","bb","cc","dd","ee","ff","gg","hh","ii","jj","kk","ll","mm","nn"]

Dapr は、サービス登録、検出、負荷分散のために内部的に mDns を使用します。複数の製品を展開すると、ポーリング呼び出しの効果を確認できます。

セルフホスト モードでは、Dapr は mDNS を使用して検索します。 Kubernetes モードで実行している場合、Kubernetes DNS サービスがアドレスを決定します。

呼び出しが失敗し、一時的なエラーが発生した場合、サービス呼び出しは自動的に再試行されます。Dapr はデフォルトで再試行を有効にするため、インターフェイスがべき等性をサポートしないことは非常に危険です。

4.2. 公開と購読

パブリッシュ/サブスクライブ モードは、主にマイクロサービスがメッセージに基づいて相互に通信するために使用されます。また、これも言及する必要があると言う人もいるかもしれません。RabbitMQ/Kafkaを構築するだけです。

使用するコンポーネントに応じて異なる SDK を導入することになり、メッセージ キューの監視と消費モードも異なることがわかります。

Dapr は、パブリッシュ/サブスクライブ機能の実装を大幅に簡素化するビルディング ブロックを提供します。これにより、基盤となるインフラストラクチャから切り離され、ビジネス ロジックを記述するときにメッセージ キューについて心配する必要がなくなります。

プログラムにパブリッシュ・サブスクライブのサポートを追加する

 アプリ。
        app.UseEndpoints(エンドポイント =>
        {
            エンドポイント.MapSubscribeHandler();
        });

メッセージを購読し、トピック機能を使用し、pubsubとトピック名を渡す

 [トピック("pubsub", "newUser")]
        パブリック ActionResult サブユーザー情報 (ユーザー情報 us)
        {
            _logger.LogInformation($"サブスクリプションメッセージを受信しました。ID:{us.id}、名前:{us.name}、年齢:{us.age}、性別:{us.sex}");
            Ok("処理が完了しました")を返します。
        }

メッセージを発行するには、daprのパブリックメソッドPublishEventAsyncを使用し、pubsubとトピック名、およびメッセージ本文を渡します。

[HttpPost]
        パブリック非同期Task<IActionResult> PubUserInfo(UserInfo us)
        {
            _daprClient.PublishEventAsync("pubsub", "newUser", us); を待機します。
            Ok() を返します。
        }

メッセージの公開およびサブスクリプション コンポーネントは、RabbitMQ、Redis、Kafka などをサポートします。

4.3 状態管理

​Dapr はデフォルトで Redis を状態ストレージとして使用します。 MongoDB、PostgreSQL、SQL Serverなどもサポートしています。

下位層で使用されるミドルウェアを上位層に公開しないため、同じコード セットを使用して、異なる環境で異なるミドルウェアを使用できます。

[HttpPost]
       [ルート("SaveUserList")]
        パブリック非同期タスク<IActionResult> SaveUserList()
        {
            var temps = 新しいリスト<UserInfo>
            {
                新しいUserInfo("Xiaohong",1,true,Guid.NewGuid().ToString()),
                新しい UserInfo("小黄",1,true,Guid.NewGuid().ToString()),
                新しい UserInfo("小蓝",1,true,Guid.NewGuid().ToString())
            };
          	_daprClient.SaveStateAsync("statestore", "UserList", temps) を待機します。
            Ok(1)を返します。
        }
        [HttpGet]
        [ルート("GetUserList")]
        パブリック非同期タスク<IActionResult> GetUserList()
        {
            var list = _daprClient.GetStateAsync<List<UserInfo>>("statestore", "UserList"); を待機します。
            Ok(リスト)を返します。
        }
      	[HttpGet]
        [ルート("DeleteUserList")]
        パブリック非同期タスク<IActionResult> DeleteUserList()
        {
            _daprClient.DeleteStateAsync("statestore", "UserList") を待機します。
            Ok(1)を返します。
        }

        パブリックレコード UserInfo(string name, int age, bool sex, string id);

4.4 リンクトラッキング

従来のマイクロサービスでは、リンク追跡には強力なコード侵入が必要です。

Dapr は Sidecar に http/grpc ミドルウェアを追加します。すべてのアプリケーション トラフィックをインターセプトし、相関 ID を自動的に挿入して分散トランザクションを追跡します。

Zipkin プロトコルを使用した分散トレースは、コード インストルメンテーションなしで、構成可能なトレース レベルですべてのトラフィックを自動的にトレースします。

5. まとめ

この記事では Dapr の簡単な例のみを示し、各コンポーネントの具体的な実装原則については詳しく説明しません。

従来のマイクロサービス フレームワークと比較した Dapr の最大の利点は Sidecar です。以前のマイクロサービス フレームワークでは、コード プロジェクトでマイクロサービス関連のクラス ライブラリを参照する必要がありました。サービス登録と検出、サーキット ブレーキング、構成など、実装するには対応するクラス ライブラリを呼び出す必要がありました。これらのクラス ライブラリはマイクロサービス プロセスで実行されるため、ビジネス コードと同じ (または互換性のある) 言語で開発する必要があり、比較的重いものでした。

Sidecar モデルは、マイクロサービスの「登録検出、サーキット ブレーカー、構成」などの機能を、ビジネス コードのプロセスに付随する独立したプロセスに分離します。ビジネス コードは、http または grpc を介して Sidecar プロセスと通信し、マイクロサービスの関連サービスの呼び出しを完了します。

当然のことながら、Sidecar モードでは、ビジネス コード内に Sidecar プロセスと通信するコードはわずかしかないため、非常に軽量です。このように、Sidecar プロセス内のサービスは独立してアップグレードでき、ビジネス コードに干渉することなくモジュールを自由に組み合わせることができます。同時に、サイドカープロセスは独立したプロセスであるため、業務コードとサイドカープロセスは、http や grpc などの言語に依存しないプロトコルを使用して通信し、業務コードは任意の言語で開発できます。

Dapr を使用してマイクロサービスを最初から簡素化する方法について説明したこの記事はこれで終わりです。Dapr で簡素化されたマイクロサービスに関する関連コンテンツをさらにご覧になりたい場合は、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Ansible で K8s クラスターをデプロイする方法
  • .NET Core 分散リンク追跡フレームワークの基本的な実装原理
  • .NET MAUI プロジェクトでハイパーリンクを作成する
  • .NetとJSを組み合わせてURLエンコードとデコードを実現
  • .NET Coreはdotnet publishコマンドを通じてアプリケーションを公開します。
  • k8s で実行される .NET プロジェクト用の Dapr 継続的インテグレーション プロセス

<<:  MySQL で指定エンコーディングを実装する際の落とし穴について

>>:  テーブルの最大幅と最小幅を設定する際の互換性の問題と解決策の詳細な説明

推薦する

エンタープライズプロダクション MySQL 最適化入門

Oracle、DB2、SQL Server などの他の大規模データベースと比較すると、MySQL に...

JS+Canvas が抽選ホイールを引く

この記事では、宝くじターンテーブルを描画するJS + Canvasの具体的なコードを参考までに共有し...

Dockerはbusyboxを使用してベースイメージを作成します

Docker イメージの最初の行は FROM alpine などのイメージで始まりますが、最初のベー...

CocosCreator で物理エンジン ジョイントを使用する方法

目次マウスジョイント マウスジョイント距離ジョイント距離ジョイントモータージョイント直動ジョイント変...

MYSQL ストアドプロシージャと関数の簡単な記述

ストアドプロシージャとは簡単に言えば、これは強力で、JAVA 言語のメソッドに似た比較的複雑な論理関...

JSON.stringify のさまざまな用途のまとめ

序文json を使用したことがある人なら、オブジェクトを文字列化してからバックエンドに送信するのが一...

JavaScript が Taobao の虫眼鏡効果を模倣

この記事では、淘宝虫眼鏡効果を実現するためのJavaScriptの具体的なコードを参考までに紹介しま...

MySQLサブクエリでorder byが効かない問題の解決方法

偶然にも、SQL ステートメントを異なる MySQL インスタンスで実行すると、異なる結果が生成され...

VUE無限レベルツリーデータ構造表示の実装

目次コンポーネントの再帰呼び出しレンダリングメソッドの使用プロジェクトに取り組んでいると、左側のメニ...

Chrome タブバーを実装するための CSS のヒント

今回は、Google Chrome のタブバーのような、特殊な丸い角を持つナビゲーション バーのレイ...

Linux での MySQL 5.6 バイナリのインストール プロセス

1.1 バイナリインストールパッケージをダウンロードするhttps://dev.mysql.com/...

editplus の Zen コーディング例コードの説明

たとえば、次のように入力します。 XML/HTML コードdiv#ページ>(div#ヘッダー&...

JavaScriptはフォームデータの非同期取得を実装します

この記事では、フォームデータの非同期取得を実現するためのJavaScriptの具体的なコードを例とし...

Linux で Nginx 1.16.0 をインストールするための詳細なチュートリアル

最近 Linux をいじっていたので、nginx の新しいバージョンをインストールしたいと思いました...

VUEはG2チャートを使用した実装を導入します

目次G2チャートについて使用テンプレートで使用される完全なコード (棒グラフ)世界地図を追加するG2...