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 で指定エンコーディングを実装する際の落とし穴について

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

推薦する

Vueのフィルターとディレクティブの詳細な説明

目次vueカスタムディレクティブグローバル指令ローカル指示使用フック関数(両方ともオプション)使用方...

JavaScript でプライベート メンバーを作成する

目次1. クロージャを使用する2. ES6クラスを使用する3. ES2020提案を使用する4. We...

HTMLノードの追加と削除の簡単な例

<br />HTMLノードの追加と削除の簡単な例<input type="...

Vueがビデオアップロード機能を実装

この記事では、参考までに、ビデオアップロード機能を実現するためのVueの具体的なコードを紹介します。...

水平プログレスバーの最後にテキストを表示するための実装コードの CSS 記述

問題の説明仕事で以下の成果を達成したいと考えています。 解決div タグに相対配置を追加し、絶対配置...

ウェブページ内の 2 つのボックス モデル (W3C ボックス モデル、IE ボックス モデル)

Web ページ ボックス モデルには 2 種類あります。 1: 標準 W3C ボックス モデル。2:...

Vue の高度な構築プロパティの詳細な説明

目次1. ディレクティブカスタムディレクティブ2. ミックスイン3. 継承を拡張する4. 提供して注...

CSSはスクロールを許可しながらスクロールバーを非表示にするためにオーバーフローを設定します

CSS は、スクロールを許可しながらスクロール バーを非表示にするために Overflow を設定し...

MySQLにおけるトランザクション分離レベルの実装原理の詳細な説明

序文データベース トランザクションに関して言えば、トランザクションの ACID 特性、分離レベル、解...

MySQLのスケジュールタスクが正常に実行できない原因の分析と解決

目次序文原因分析と解決策スケジュールされたタスクを迅速に実行する要約する序文データベースのスケジュー...

vue $setは配列コレクションオブジェクトへの値の割り当てを実装します

Vue $set 配列コレクションオブジェクトの割り当てVue カスタム配列オブジェクト コレクショ...

HTML マークアップ言語 - フォーム

123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...

JavaScript ウェブページ入門開発詳細説明

パート3: ❤バックエンドデータ受信を見落とす3つの方法❤ (おすすめ集)パート 2: Web フォ...

色の16進数カラーコード表表示と16進値の比較表示で簡単に検索できます

さまざまな色の16進コード表[パート1] 赤とピンク、およびそれらの 16 進コード。 #99003...

MySQL ストアド プロシージャの作成、呼び出し、管理の詳細な説明

目次ストアドプロシージャの概要ストアド プロシージャを使用する理由は何ですか?ストアドプロシージャの...