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

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

推薦する

Vue3 のウォッチの使用方法とベストプラクティスガイド

目次序文🌟 1. APIの紹介2. 複数のデータソースの監視3. リスニングアレイ4. 監視対象5....

適応幅(パーセンテージ)に応じて Div の高さを調整する純粋な CSS

今日のレスポンシブ レイアウトの要件では、サイズを自動的に調整できる多くの要素で高さと幅の適応を実現...

Dockerでnginxをデプロイし、設定ファイルを変更する方法

Dockerでnginxをデプロイするのはとても簡単ですたった 1 行のコマンド: docker 実...

HTMLページの読み込み速度を上げる方法

(1)HTTPリクエストを減らす。 (リソース ファイルをマージし、イメージ スプライトを使用します...

Windows での MySQL コミュニティ サーバー 8.0.16 のインストールと構成方法のグラフィック チュートリアル

最近、MySQL関連の構文をよく見かけます。また、MySQLストアドプロシージャの書き方も学びたいの...

Ubuntu 19でdockerソースをインストールできない問題を共有する

主要な Web サイトと個人的な習慣に従って、Docker ソースを追加するには次の方法を使用します...

MySQL がデータの削除と挿入に非常に時間がかかる問題の解決策

会社の開発者がテスト環境で挿入ステートメントを実行すると、正常に実行されるまでに 10 秒以上かかり...

AWS無料サーバーアプリケーションとネットワークプロキシ設定チュートリアルの詳細な説明

目次予防必要条件AWSアカウントを申請する仮想マシンの申請と有効化仮想マシンを申請するセキュリティグ...

Node.js の非同期ジェネレータと非同期反復の詳細な説明

序文ジェネレーター関数は、async/await が導入される前から JavaScript に存在し...

CentOS MySQLデータベースのスケジュールバックアップを実装する方法

次のスクリプトは、MySQLデータベース全体のスケジュールされたバックアップに使用されます。 mys...

nginx パニック問題の解決方法の詳細な説明

nginx パニック問題に関しては、まず nginx の起動プロセス中に、マスター プロセスが構成フ...

セマフォによるTomcatの異常終了の解決方法

最近はビッグデータで遊んでいます。友人が私のところに来て、オンラインの Tomcat が不可解に終了...

MySQL における識別子の大文字と小文字の区別の問題の詳細な分析

MySQL では、テーブル名の大文字と小文字の区別の問題が発生する可能性があります。実際、これはプラ...

JDカルーセル効果を実現するための純粋なHTMLとCSS

JD カルーセルは、動的な効果を追加せず、主に位置決めの知識を使用して、純粋な HTML と CS...

システムメンテナンスページにリダイレクトするように nginx を設定する

先週末、兄弟プロジェクトはより良いサービスを提供するためにサーバーを拡張する準備をしていました。兄弟...