Dapr 入門チュートリアル - ミドルウェア

Dapr 入門チュートリアル - ミドルウェア

Dapr を使用すると、一連のミドルウェア コンポーネントを連鎖させることで、カスタム処理パイプラインを定義できます。リクエストは、ユーザー コードにルーティングされる前に、定義されたすべてのミドルウェア コンポーネントを通過し、その後、定義されたミドルウェアを逆の順序で通過してから、クライアントに戻ります。

Dapr ミドルウェア

Dapr ミドルウェア

Dapr サイドカーは起動すると、ミドルウェア処理パイプラインを構築します。デフォルトでは、パイプラインはトレース ミドルウェアと CORS ミドルウェアで構成されます。 Dapr 構成を介して追加されたミドルウェアは、定義された順序でパイプラインに追加され、このパイプラインは、ステータス、pub/sub、サービス呼び出し、バインディング、セキュリティなど、すべての Dapr API エンドポイントに適用されます。

次の構成例では、OAuth 2.0 ミドルウェアと大文字のミドルウェア コンポーネントを使用するカスタム パイプラインを定義します。この場合、すべてのリクエストは OAuth 2.0 プロトコルを介して承認され、ユーザー コードに転送される前に大文字に変換されます。

 apiバージョン: dapr .io / v1alpha1
種類: 構成
メタデータ:
名前: パイプライン
名前空間: デフォルト
仕様:
httpパイプライン:
ハンドラー:
- 名前: oauth2
タイプ: ミドルウェアhttp://www.youtube.com/watch?v=vUyQyYyxc oauth2
- 名前: 大文字
タイプ: ミドルウェアhttp://www.youtube.com/watch?v=vUyQyYyxc 大文字

他のビルディング ブロック コンポーネントと同様に、ミドルウェア コンポーネントも拡張可能です。 Dapr で現在サポートされているミドルウェアを次の表に示します。

ミドルウェア

説明する


コンポーネントバージョン

OAuth2 認可付与フロー

Web API で OAuth2 認可付与フローを有効にする

アルファ

v1

OAuth2 クライアント資格情報付与フロー

Web API で OAuth2 クライアント資格情報付与フローを有効にする

アルファ

v1

オープンIDコネクト

Web API で OpenID Connect を使用してベアラー トークンを検証する

アルファ

v1

レート制限

1秒あたりに許可されるHTTPリクエストの最大数を制限する

アルファ

v1

Rego/OPAポリシー

受信 Dapr HTTP リクエストに Rego/OPA ポリシーを適用する

アルファ

v1

ルーターチェッカー

RouterChecker ミドルウェアを使用して、無効な HTTP リクエスト ルーティングを防止します。

アルファ

v1

センチネル

Sentinelミドルウェアを使用してアプリケーションの信頼性と回復力を確保する

アルファ

v1

大文字

リクエスト本文を大文字に変換する (デモ)

安定した

v1

ワス

HTTPパイプラインでWASMミドルウェアを使用する

アルファ

v1

これらのミドルウェア実装のソース コードは、Github リポジトリ https://github.com/dapr/components-contrib/tree/master/middleware/http にあります。

カスタムミドルウェア

Dapr は FastHTTP を使用して HTTP サーバーを実装するため、カスタム HTTP ミドルウェアは FastHTTP ハンドラーとして記述する必要があります。ミドルウェアは、以下に示すようにミドルウェア インターフェイスを実装する必要があります。

 パッケージミドルウェア
輸入
「github.com/valyala/fasthttp」

タイプミドルウェアインターフェース{
GetHandler ( メタデータメタデータ) ( func ( h fasthttp . RequestHandler ) fasthttp . RequestHandler , error )
}

このインターフェースは、fasthttp.RequestHandler とエラーを返す GetHandler メソッドを定義します。カスタム ミドルウェア ハンドラーの実装には、任意のインバウンド ロジックとアウトバウンド ロジックを含めることができます。

 func ( m * customMiddleware ) GetHandler ( metadata メタデータ) ( func ( fasthttp.RequestHandler ) fasthttp.RequestHandler , error ) {
var err エラー
func ( h fasthttp.RequestHandler ) 返しますfasthttp . リクエストハンドラ{
戻り値 func ( ctx * fasthttp . RequestCtx ) {
h ( ctx )
}
}, エラー
}

その後、カスタム ミドルウェア コンポーネントを components-contrib リポジトリに提供できます。 components-contrib があなたの提出を承認したら、Dapr ランタイム リポジトリの https://github.com/dapr/dapr/tree/master/cmd/daprd/components の下にミドルウェア登録ファイルを追加する必要があります。

ミドルウェアの登録

たとえば、大文字ミドルウェアの登録は次のコードに示されています。

 パッケージコンポーネント

輸入
「文字列」

「github.com/valyala/fasthttp」

「github.com/dapr/components-contrib/middleware」
httpMiddlewareLoader "github.com/dapr/dapr/pkg/components/middleware/http"
httpミドルウェア「github.com/dapr/dapr/pkg/middleware/http」
「github.com/dapr/kit/logger」

関数init () {
ミドルウェアローダーデフォルトレジストリRegisterComponent ( func ( log logger . Logger ) httpMiddlewareLoader . FactoryMethod {
return func ( メタデータミドルウェア.Metadata ) ( httpMiddleware.Middleware , error ) {
func ( h fasthttp.RequestHandler ) 返しますfasthttp . リクエストハンドラ{
戻り値 func ( ctx * fasthttp . RequestCtx ) {
本文: = 文字列( ctx . PostBody ())
ctxリクエストSetBody ([] byte ( 文字列.ToUpper ( 本文)))
h ( ctx )
}
}, なし
}
}, "大文字" )
}

しかし、Dapr がミドルウェアの拡張を完全に開放していないこともわかります。ユーザーがメインリポジトリ内のコードを更新するという特定のニーズを持っている場合、必然的に柔軟性は低下しますが、低品質のミドルウェアによって引き起こされる Dapr のさまざまな問題を回避することもできます。

OAuth ミドルウェアの例

次に、Dapr でミドルウェアを使用する方法を説明するために、OAuth ミドルウェアを構成します。 OAuth ミドルウェアを構成することで、アプリケーションを変更せずに Web API で OAuth 認証を有効にします。この設計により、認証/承認の問題がアプリケーションから分離されるため、アプリケーション オペレーターはアプリケーション コードに影響を与えることなく、認証/承認プロバイダーを採用および構成できます。

dapr oauth ミドルウェア

ここでは、K8s クラスターの Ingress コントローラーとして ingress-nginx を使用します。インストールされていない場合は、次の Helm チャートを使用して簡単にインストールできます。

 helm リポジトリingress - nginx を追加しますhttps://kubernetes.github.io/ingress-nginx
helm インストール- リリースingress - nginx / ingress - nginx

まず、以下に示すように、Node.js を使用して開発された echoapp を作成しました。

 express は 次ののように機能します
const bodyParser = require ( "ボディパーサー" );
const app = express ();
アプリbodyParser.json () 使用します
ポート= 3000 ;
アプリ取得( "/echo" 、 ( reqres ) => {
var テキスト= reqクエリ文章;
console .log ( "エコー中: " + テキスト);
解像度send ( "アクセストークン: " + 要求ヘッダー[ "authorization" ] + " テキスト: " + テキスト);
});

アプリlisten ( port , () => console . log ( `Node App はポート$ { port } リッスンしています! ` ));

次に、リクエスト ヘッダー内の認証情報とクライアントのリクエスト テキスト情報を取得するための /echo インターフェイスを作成しました。

次に、Github を使用して認証と承認を実装します。まず、https://github.com/settings/developers にアクセスして、以下に示すように OAuth アプリケーションを登録します。

新しいOAuthアプリケーションを作成する

ここでは、アプリケーションの URL を http://echo.dapr.local として指定します。新しいアプリケーションを登録するには、「アプリケーションの登録」をクリックします。登録後、アプリケーションの詳細ページで clientId 情報を取得できます。 「新しいクライアント シークレットを生成」ボタンをクリックして、clientSecret 情報を手動で取得する必要があります。後で使用するので、2 つのパラメータ値を記録します。

クライアントシークレットを取得する

次に、echoapp アプリケーションを Kubernetes クラスターにデプロイします。対応するリソース リストは次のとおりです。

 apiバージョン: アプリ/ v1
種類: デプロイメント
メタデータ:
名前: echoapp
ラベル:
アプリ: エコー
仕様:
セレクター:
マッチラベル:
アプリ: エコー
テンプレート
メタデータ:
ラベル:
アプリ: エコー
注釈:
ダップルio / 有効: "true"
dapr .io / アプリ- ID : "echoapp"
dapr .io / アプリ- ポート: "3000"
dapr .io / config : 「パイプライン」
仕様:
コンテナ:
- 名前: エコー
画像: dapriosamples / ミドルウェア- echoapp : 最新
ポート:
- コンテナポート: 3000
imagePullPolicy : 常に
---
apiバージョン: ネットワークk8sio / v1
種類: イングレス
メタデータ:
名前: echo - イングレス
仕様:
イングレスクラス名: nginx
ルール:
- ホスト: エコーダップル地元
http://www.google.com/dp ...
パス:
- バックエンド:
サービス
名前: echoapp - dapr
ポート:
番号80
パス/
パスタイプ: プレフィックス

echoapp アプリケーションを公開するために、上記で Ingress オブジェクトを作成したことに注意してください。サービス オブジェクトを積極的に作成するのではなく、echoapp-dapr サービスを直接関連付けたことに注意してください。このサービスのポート 80 は、echoapp アプリケーションの dapr サイドカーのポート 3500 にマップされています。

また、上記のアプリケーションに追加された注釈にも注意してください。これには、使用する構成オブジェクトを指定するために使用される dapr.io/config: "pipeline" が含まれるため、pipeline という名前の構成オブジェクトも作成する必要があります。

 apiバージョン: dapr .io / v1alpha1
種類: 構成
メタデータ:
名前: パイプライン
仕様:
トレース:
サンプリングレート: "1"
ジプキン:
エンドポイントアドレス: "http://zipkin.default.svc.cluster.local:9411/api/v2/spans"
httpパイプライン:
ハンドラー:
- タイプ: ミドルウェアhttp://www.youtube.com/watch?v=vUyQyYyxc oauth2
名前: oauth2

ここでは、echoapp アプリケーション用に middleware.http.oauth2 タイプのミドルウェアを構成します。対応するプロセッサ名は oauth2 で、これは以下に示すように、Dapr のコンポーネント コンポーネントに対応します。

 apiバージョン: dapr .io / v1alpha1
種類: コンポーネント
メタデータ:
名前: oauth2
仕様:
タイプ: ミドルウェアhttp://www.youtube.com/watch?v=vUyQyYyxc oauth2
バージョン: v1
メタデータ:
- 名前: クライアントID
: "<クライアントID>"
- 名前: クライアントシークレット
: "<クライアントシークレット>"
- 名前: スコープ
価値""
- 名前: authURL
: "https://github.com/login/oauth/authorize"
- 名前: トークンURL
: "https://github.com/login/oauth/access_token"
- 名前: リダイレクトURL
: "http://echo.dapr.local"
- 名前: authHeaderName
: "承認"

Dapr OAuth ミドルウェアを使用するには、次の情報を構成する必要があります。

  • クライアントID
  • クライアントシークレット
  • スコープ
  • 認証URL
  • トークンURL

次の表は、いくつかの一般的な認可サーバーの認可/トークン URL を示しています。

サーバ

認証URL

トークンURL

Azure アドオン

https://login.microsoftonline.com/{テナント}/oauth2/authorize

https://login.microsoftonline.com/{テナント}/oauth2/token

GitHub

https://github.com/login/oauth/authorize

https://github.com/login/oauth/access_token

グーグル

https://accounts.google.com/o/oauth2/v2/auth

https://accounts.google.com/o/oauth2/token https://www.googleapis.com/oauth2/v4/token

ツイッター

https://api.twitter.com/oauth/authorize

https://api.twitter.com/oauth2/token

ここでは GitHub の認証サーバー構成を使用します。最後に追加された authHeaderName: authorization プロパティにも注意してください。上記のコードでは、認証値は Header ヘッダーから取得されます。

次に、上記のすべてのリソース オブジェクトを作成します。作成が完了したら、echo.dapr.local ドメイン名を Ingress コントローラーにマップすることを忘れないでください。

 $ kubectl ポッドを取得する
名前準備完了ステータス再起動年齢
echoapp - b7f5469cb - hzvth 2 / 2 実行中0 51
$ kubectl svc を取得します
名前タイプクラスタ- IP 外部- IP ポート( S ) 年齢
echoapp - dapr ClusterIP なし< なし> 80 / TCP50001 / TCP50002 / TCP9090 / TCP 69 m
$ kubectl get ingress echo - イングレス
名前クラスホストアドレスポート年齢
echo - イングレスnginx echoダップルローカル192.168 .0 .52 80 59 m

次に、ブラウザに http://echo.dapr.local/v1.0/invoke/echoapp/method/echo?text=hello と入力して、アプリケーションの echo メソッドにアクセスします。通常のアクセス中に、予想外の 502 エラーが発生します。

502 エラー

これは、Dapr 1.4 以降、セキュリティ対策として daprd プロセスがロックダウンされ、ポッド境界内からの接続のみを受け入れるようになっているためです。 Dapr への外部呼び出しを有効にする場合は、アプリケーションに次のアノテーションを追加する必要があります。

 dapr .io / サイドカー- listen - アドレス: "0.0.0.0"

この注釈をデプロイメントに追加します。更新後、http://echo.dapr.local/v1.0/invoke/echoapp/method/echo?text=hello に再度アクセスすると、正常に動作します。最初は、認証のために GitHub にジャンプします。

GitHub 認証

承認後、ページは自動的に戻り、アクセス トークン データやテキスト パラメータの値など、エコー インターフェイスによって返されたデータが通常どおり表示されます。

echo メソッド

この時点で、元のアプリケーションに侵入することなく、Dapr 内のアプリケーションに対して OAuth ミドルウェアが有効になりました。

<<:  ポリシー・アズ・コードがクラウドの誤った構成を防ぐ方法

>>:  Alibaba Cloud データベースの NL2SQL テクノロジーが国際的に権威のある評価で第 1 位を獲得

推薦する

Huawei Quick App IDE、迅速なアプリ開発を加速するサーバーレスクラウドサービスを開始

Huawei Quick App IDEはサーバーレスクラウド開発機能を正式にリリースし、クラウド機...

クラウド コンピューティングのトレンド: オーケストレーション自動化は RPA にどのような影響を与えますか?

先月、ガートナーは2021年のクラウドコンピューティングのトップ10トレンドを発表しました。その中で...

革新を続けながらクラウドデータストレージのコストを削減する 7 つの方法

[[330351]] 【51CTO.com クイック翻訳】 今はビジネスにとって厳しい時期です。不況...

大学生の SEO の本当の旅

私は1990年生まれの2年生です。私は子供の頃からコンピューターに興味がありましたが、私の家族は貧し...

2021 年の DevOps トレンド 15 選

DevOps は長年にわたって存在しており、2021 年も間違いなく成長を続けるでしょう。多くの組織...

「Genyun」産業用インターネットプラットフォームとアプリケーション - 顧客価値を高める産業用インターネットプラットフォーム

インダストリアル インターネットの概念が提唱されて以来、世界中の産業界は積極的に応用の実践と探求を行...

過去10年間の中国のオンラインビデオ業界の人物と出来事

QVODはかつて、オンラインビデオ業界の大きな「ナマズ」や「ダークホース」と見なされていました。しか...

企業は自社のビジネスに最適なクラウド プラットフォームをどのように選択すればよいのでしょうか?

マルチクラウド展開においてパブリッククラウドとプライベートクラウドのオプションのバランスを取ることは...

2024 年のクラウド コンピューティングのトップ 10 トレンド

クラウド コンピューティングは、テクノロジーの世界に変革をもたらし、急速に成長し続けています。 20...

Kafka サービスを監視する方法

みなさんこんにちは。Hua Zaiです。またお会いできて嬉しいです。監視は常に Kafka にとって...

草の根ウェブマスターがインターネットに挑戦し、何度も失敗:メンタリティが成功と失敗を決める

序文:草の根ウェブマスターとして、A5 のようなウェブマスター プラットフォームで自分の経験を共有す...

中国のバレンタインデーに向けて電子メール マーケティングを革新するにはどうすればよいでしょうか?

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

APPプロモーションノート:100日間のチャンネルプロモーション作業の概要!各種チャンネルリソースのリストを添付します。

1. アプリ推奨サイトが自らを推奨する最も美しいアプリケーション、Coolan.com、DEMO8、...

製品の使用の観点からユーザーエクスペリエンスを探る

最近、日本のホストが比較的安価で品質が良いことがわかったので、自分でLinuxサーバーの旅を始めまし...

分散ストレージの技術動向(II):デュアルRAIDメカニズム

[[386284]] 3 つのコピーを持つ分散ストレージが直面するパフォーマンスの問題、安定性、信頼...