分散アプリケーションランタイム Dapr: すべてを API にできる

分散アプリケーションランタイム Dapr: すべてを API にできる

​Dapr[1]はDistributed Application Runtimeの略語です。マルチランタイムの詳細については、Bilgin Ibryamの「マルチランタイムマイクロサービスアーキテクチャ」[2]を参照してください。英語で読みたくない場合は、私の以前の翻訳を読んでください。

Dapr は、API を提供することでアプリケーションを周辺コンポーネントから分離し、開発者がビジネス ロジックの開発に集中できるようにする分散システム ツールキットです。分離も従来の SDK との大きな違いです。機能は、アプリケーションにライブラリを追加することによって提供されるのではなく、アプリケーションの近くにあるサイドカー ランタイムによって提供されるようになりました (サイドカーは、ポッド内のコンテナーであるよく知られたサービス メッシュ サイドカーではなく、オペレーティング システムの initd、ログ収集コンポーネント、さらには Java のマルチスレッドなど、システム ソフトウェア設計で広く使用されているパターンです)。したがって、ここで言及されている Dapr サイドカーは、独立したプロセスである場合もあれば、ポッド内のコンテナーである場合もあります。

Dapr では、多くの一般的な SDK 機能を見ることができます。

  • SpringCloudやNetflixのOSSサービスコール[3]や、タイムアウト、サーキットブレーカー、再試行などの弾力的な戦略など[4]
  • Spring Data KeyValueと同様に、状態ストレージ[5]の抽象化を提供し、さまざまな永続ストレージへのアクセスを簡素化します。
  • Kafka、NATS、MQTTなどのメッセージブローカーは、サービスがメッセージを介して通信するためのパブリッシュ/サブスクライブ[6]抽象化を提供します。
  • 例えば、Kafka、MQTT、RabbitMQは、イベントトリガーアプリケーションのための抽象化を提供します。バインディング[7]
  • Redisのような分散ロック[8]
  • Consul、Kubernetesなどの名前解決[9]
  • ...

上記の機能は、HTTP および gRPC API を通じてアプリケーションに公開されます。これらのAPIはDaprではビルディングブロック[10]と呼ばれ、抽象化のみを提供します。つまり、アプリケーションコードを変更することなく、基盤となる実装(Daprではコンポーネント[11]とも呼ばれます)を自由に置き換えることができます。

例えば、アプリケーションがストレージに状態を保存する必要がある場合、開発中はメモリ[12]をストレージコンポーネントとして使用し、他の環境ではMysql[13]、Redis[14]などの永続化コンポーネントを使用することができます。

次に、公式の入門ガイドを参考にして Dapr を体験してください。 Daprはさまざまな入門ガイドを提供しています[15]。ここではhello-kubernetes[16]を選択しました。ただし、実際の操作は公式の動作と若干異なる場合があります。これらの違いのおかげで、私は Dapr についてさらに詳しく知ることができます。

環境

Dapr CLIをインストールする

Dapr CLI は Dapr を操作するためのツールです。 Dapr インスタンスのインストール、管理、デバッグの実行に使用できます。公式のインストールドキュメント[17]を参照してください。私はmacOSを使用し、homebrewを選択してインストールしました。

 brew インストール dapr - cli

現在の最新バージョンは 1.9.1 です。

 dapr バージョン
CLIバージョン: 1.9.1
ランタイムバージョン:なし

Kubernetes クラスターを作成する

実験環境クラスターとして k3s v1.23.8+k3s2 を使用します。

エクスポート INSTALL_K3S_VERSION = v1 .23 .8 + k3s2
curl - sfL https : //.k3s.io取得します| sh - s - --disable traefik --disable servicelb --write-kubeconfig-mode 644 --write-kubeconfig ~/.kube/config

Daprをインストールする

次のコマンドを実行して、クラスターに Dapr をインストールします。

 dapr を初期化します--kubernetes --wait

コンポーネントが正常に機能していることを確認します。 Kubernetes 環境では、多くのコマンドで --kubernetes​ または -k パラメータを使用する必要があります。

 dapr ステータス-k
名前 名前空間 正常 状態 レプリカ バージョン 作成日
dapr -ダッシュボードdapr -システムTrue実行中1 0.11 .0 472023-02-11 08 : 30.25
dapr -セントリーdapr -システム真の実行中1 1.9 .6 472023-02-11 08 : 30.25
dapr -サイドカー-インジェクター dapr -システム走行1 1.9 .6 472023-02-11 08 : 30.25
dapr -演算子dapr -システムTrue実行中1 1.9 .6 472023-02-11 08 : 30.25
dapr -配置-サーバー dapr -システムTrue実行中1 1.9 .6 472023 - 02 - 11 08 : 30.25

サンプルアプリケーション

環境がデプロイされたら、使用するサンプル アプリケーションを見てみましょう。

 gitクローンhttps://github.com/dapr/quickstarts
cd クイックスタート/チュートリアル/ hello - kubernetes

例には、pythonapp​ と nodeapp の 2 つのアプリケーションと Redis が含まれています。

  • nodeappは注文の作成と照会のためのHTTPエンドポイントを提供し、注文情報はRedisに保存されます。
  • pythonapp​は引き続きnodeappのHTTPエンドポイントにアクセスして注文を作成します。

Dapr の 2 つの機能、サービス呼び出しと状態ストレージが使用されます。

アプリケーション名前空間を作成する

アプリケーションは dpar-test 名前空間にデプロイされます。

 kubectl 名前空間 daprの作成-テスト

状態ストレージ

状態の保存には Redis を使用します。まず、Redis を名前空間ストアにデプロイします。簡単にするために、マスター ノードは 1 つだけ使用され、パスワードは changeme に設定されています。

 helmリポジトリbitnamiを追加しますhttps://charts.bitnami.com/bitnami
helm リポジトリの更新
helm は redis bitnami / redis --namespace store --create-namespace をインストールします \
--set レプリカ.レプリカ数=0 \
--set auth.password=変更パスワード

コンポーネントの作成

Redis にはパスワードが設定されているため、Secret 経由で渡される Redis にアクセスするためのパスワードを Dapr に提供する必要があります。秘密は dapr-test に保存されます。

 kubectl は、ジェネリック redis - n dapr - test シークレットを作成します--from-literal=redis-password=changeme

Redisストア仕様[18]に従って、dapr-testの下にコンポーネントstatetoreを作成します。

  • コンポーネントタイプはstate.redisです
  • バージョン versinotallow=v1
  • アクセスアドレス redisHost=redis-master.store:6379
  • Redisのアクセスパスワードは、秘密鍵redisのキーredis-passwordから取得されます。
  • auth.secretStoreはシークレットストアタイプが`Kubernetes`であることを指定します[19]
 kubectl 適用-n dapr -テスト-f - << EOF
apiバージョン: dapr.io/v1alpha1
種類:コンポーネント
メタデータ:
名前:ステートストア
仕様:
タイプ:状態.redis
バージョン: v1
メタデータ:
-名前: redisHost
: redis-master.store : 6379
-名前: redisPassword
シークレットキーリファレンス:
名前:レディス
キー: redis -パスワード
認証:
シークレットストア: kubernetes
終了

状態ストアへのアクセス

Dapr API [20]を介して状態ストアにアクセスします。リクエスト形式:POST http://localhost:<daprPort>/v1.0/state/<storename>。

以下は nodeapp​ のコードの一部です。 stateStoreName​ は上記で作成した状態ストアです。アプリケーションとコンポーネントが同じ名前空間にある場合は、statestore を直接使用します。それ以外の場合は、コンポーネントを storeName.storeNamespace と同じ名前空間に作成する必要があります (コンポーネント名 statestore がコード内にハードコードされているため)。

 const stateStoreName = `statestore` ;
const stateUrl = `http : // localhost : $ { daprPort } /v1.0/state/ $ { stateStoreName } ` ;

定数状態= [ {
キー: "order"
:データ
} ] ;

const response =フェッチを待機( stateUrl , {
メソッド: "POST"
本文: JSON .stringify (状態)
ヘッダー: {
「コンテンツタイプ」 : 「application/json」
}
} ) ;

サービスコール

呼び出し元 pythonapp のコード。

  • アドレス localhost およびポート 3500 のサイドカー daprd を介して HTTP API にアクセスします。
  • リクエスト ヘッダーの dapr-app-id を介してターゲット アプリケーション ID nodeapp を指定します。アプリケーション ID は、Kubernetes アノテーション dapr.io/app-id を通じて設定されます。詳細な注釈については[21]のドキュメントを参照してください。
  • ターゲットメソッド名はリクエストパスによって指定されます: /neworder
 dapr_port = os .getenv ( "DAPR_HTTP_PORT" , 3500 )
dapr_url = "http://localhost:{}/neworder" .format ( dapr_port )

0の場合
真の場合:
1 + = 1
メッセージ= { "データ" : { "注文ID" : n } }

試す
レスポンス=リクエスト.post ( dapr_url jsnotallow =メッセージタイムアウト= 5 ヘッダー= { "dapr-app-id" : "nodeapp" } )
応答がない場合は.ok :
print ( "HTTP %d => %s" % (レスポンス.status_code ,
レスポンス.content .decode ( "utf-8" ) ) flush = True )
except 例外を eとして:
印刷( e フラッシュ= True )

時間.睡眠( 1 )

アプリケーションをデプロイする

 kubectl を適用-n dapr -test -fデプロイ/ノード.yaml
kubectl wait --for=cnotallow=ready ポッド -n dapr-test -l app=node --timeout=60s
kubectl apply -n dapr -test -f deploy / python .yamlを実行します。
kubectl wait --for=cnotallow=ready ポッド -n dapr-test -l app=python --timeout=60s

ノード コンテナのログを確認すると、pythonapp からのリクエストが受信され、注文が正常に保存されていることがわかります。

 kubectl ログ -f -n dapr-test -l app=node -c ノード

注文 ID: 1 の状態が正常に保存されました
新しい注文が入りました!注文ID: 1
注文 ID: 2 の状態が正常に保存されました
新しい注文が入りました!注文ID: 2
注文 ID: 3 の状態が正常に保存されました
新しい注文が入りました!注文ID: 3
注文 ID: 4 の状態が正常に保存されました
新しい注文が入りました!注文ID: 4

デバッグ

元の公式ガイドでは、Redis とアプリケーションを同じ名前空間にデプロイし、ストレージ コンポーネント名は nodeapp にハードコードされていました。実験していたときは、Redis は別のスペースにデプロイされていました。ノード コンテナのログを確認すると、次の内容が表示されました。

新しい注文が入りました注文ID : 1
状態を永続化できませんでした。

daprd コンテナには、次のログのみがあります。

 time = "2023-02-11T02:55:38.166259509Z" level = info msg = "HTTP API が呼び出されました: POST /v1.0/state/statestore" app_id = nodeapp instance = nodeapp - 857 cf6f985 - jnmzw scope = dapr .runtime .http - info type = log useragent = "node-fetch/1.0 (+https://github.com/bitinn/node-fetch)" ver = 1.9 .6

nodeapp​ ポッドに dapr.io/log-level="debug"​ アノテーションを追加すると、daprd コンテナはデバッグ ログを出力できます。

 time = "2023-02-11T03:05:07.663028821Z" level = debug msg = "{ERR_STATE_STORE_NOT_CONFIGURED 状態ストアが構成されていません}" app_id = nodeapp instance = nodeapp - 59 b754ff54 - c4x4s scope = dapr .runtime .http type = log ver = 1.9 .6

デバッグ方法の詳細については、公式のトラブルシューティングドキュメント[22]を参照してください。

要約する

Dapr は、従来の SDK アプローチとは異なるシステム統合のアプローチを提供するため、開発者は基盤となる実装を気にすることなくビジネス ロジックに集中できます。組織にとっては、アプリケーションの移植性が向上し、さまざまなクラウド環境を使用できるようになります。

ただし、Dapr 自体はクラウドやクラスターを越えることはできません。コミュニティでは、ハイブリッド マルチクラウド環境でサービス呼び出しを実装するために、サービス メッシュとの統合を検討しています。皆さんも楽しみにしてください。

参考文献

[1] ダプル: https://dapr.io

[2] マルチランタイムマイクロサービスアーキテクチャ: https://www.infoq.com/articles/multi-runtime-microservice-architecture/

[3] サービス呼び出し: https://docs.dapr.io/developing-applications/building-blocks/service-invocation/

[4] 回復力ポリシー: https://docs.dapr.io/operations/resiliency/policies/

[5] 状態ストレージ: https://docs.dapr.io/developing-applications/building-blocks/state-management/

[6] パブリッシュ/サブスクライブ: https://docs.dapr.io/developing-applications/building-blocks/pubsub/

[7] バインディング: https://docs.dapr.io/developing-applications/building-blocks/bindings/

[8] 分散ロック: https://docs.dapr.io/developing-applications/building-blocks/distributed-lock/distributed-lock-api-overview/

[9] 名前解決: https://docs.dapr.io/reference/components-reference/supported-name-resolution/

[10] ビルディングブロック: https://docs.dapr.io/concepts/building-blocks-concept/

[11] コンポーネント: https://docs.dapr.io/concepts/components-concept/

[12] メモリ: https://docs.dapr.io/reference/components-reference/supported-state-stores/setup-inmemory/

[13] MySQL: https://docs.dapr.io/reference/components-reference/supported-state-stores/setup-mysql/

[14] Redis: https://docs.dapr.io/reference/components-reference/supported-state-stores/setup-redis/

[15] 各種入門ガイド: https://github.com/dapr/quickstarts/tree/master/tutorials

[16] hello-kubernetes: https://github.com/dapr/quickstarts/tree/master/tutorials/hello-kubernetes

[17] インストールドキュメント: https://docs.dapr.io/getting-started/install-dapr-cli/

[18] Redisストア仕様: https://docs.dapr.io/reference/components-reference/supported-state-stores/

[19] Kubernetes​: https://docs.dapr.io/reference/components-reference/supported-secret-stores/kubernetes-secret-store/

[20] 状態ストレージにアクセスするためのDapr API: https://docs.dapr.io/reference/api/state_api/#save-state

[21] ドキュメント: https://docs.dapr.io/reference/arguments-annotations-overview/

[22] トラブルシューティングドキュメント: https://docs.dapr.io/operations/troubleshooting/

<<:  2023 年のクラウド コンピューティング、サービスとしてのサービス、コスト最適化の予測

>>:  グリーンクラウドコンピューティングは持続可能な開発を推進します

推薦する

ウェブサイトのデザイン分析: 製品におけるガイド付きデザインについての簡単な説明

初めて見知らぬ街に旅行する人を想像してみてください。トラブルを避けたい、見知らぬ土地に不慣れなため、...

SEO担当者はホームページとコラムページの重みを合理的に分析する必要がある

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますSEO プ...

wholesaleinternet - 月額 19 ドルのサーバー、いつまで待つつもりですか?

WholesaleInternet は、カンザスシティのダウンタウンにあるインターネット サービス会...

SEOの真の意味を10の側面から簡単に解説

最近、正確に言うと、過去 4 か月間、Baidu のアップデートはかなり混乱しています。純粋に手作業...

#推奨# テンセントクラウド:グループ購入活動、15元/月、2M帯域幅/1Gメモリ/1コア/50gハードディスク、Windows付き

Tencent CloudのAMDクラウドサーバーグループ購入ギフトイベントが再び登場しました。これ...

百度のアルゴリズム異常は「砂糖で覆われた弾丸」の疑い

みなさんこんにちは。私は梁磊です。百度はここ数日、異常な動きを見せています。皆さんも慣れていると思い...

A5 マーケティング: タイトル タグを使用してエンタープライズ ウェブマスターに優れたユーザー エクスペリエンスを提供する方法

企業で最適化を行うウェブマスターは、ウェブサイトのタイトルタグを知っておく必要があると思います。英語...

ウェブサイトの検索エンジンランキングを向上させる方法

1. ウェブサイトのランキングの基本原則 検索エンジンの「古代」の時代では、検索結果におけるウェブサ...

JD.com の 3 段階分類ページの SEO、ユーザー エクスペリエンス、マーケティング手法の簡単な分析 (パート 1)

今日は、「家電」ページを例に、JD.com の 3 階層のカテゴリ ページを見てみましょう。まず頭を...

ocitysolutions-4.17ドル/512MB RAM/15GB HDD/150GB フロー

Ocitysolutions は、Mineocity ゲーム コンソール プロバイダーとして 201...

#BlackFriday# desivps: 年間 17 ドル、サンノゼ VPS、1G メモリ/1 コア/15gNVMe/1.5T トラフィック/10Gbps 帯域幅

desivps は、今年のブラックフライデーに VPS プロモーションを開始しました。デフォルトは米...

クラウド運用ツール: 多ければ良いというわけではない

企業がクラウドやマルチクラウドの展開を運用するにつれて、クラウドの運用やクラウドの運用が解決すべき問...

contabo: 新しい日本の VPS、月額 8.99 ユーロ、8G メモリ/4 コア (AMD EPYC 7282)/200g SSD/10T トラフィック

2003年に設立されたドイツの超老舗企業Contaboが、日本東京にデータセンターを増設し、日本VP...

hosthatch UK VPS はいかがでしょうか?ロンドン VPS レビュー

Hosthatchは英国ロンドンで独自のVPSクラウドサーバー事業を展開しており、安価で費用対効果が...

Android スマートフォンは本当に簡単に感染するのでしょうか?

最近、「スーパーモバイルウイルス」として知られるトロイの木馬が、Android システムのセキュリテ...