-
Notifications
You must be signed in to change notification settings - Fork 0
MS_gRPC
- TOP > インフラストラクチャ > 通信技術 > HTTP > WebAPI
-
RPC を実現するために Google が開発したプロトコルの 1 つ。
-
多くの言語でクロスプラットフォームで利用できる。
-
一般的な利用シナリオ
マイクロサービス型のアーキテクチャにおけるバックエンドサービスへの接続- モバイルデバイスからの接続
- ブラウザからの接続
移行メモ(補足): 「ブラウザからの接続」は、そのままではできない。 ブラウザの JavaScript からは HTTP/2 のフレームを直接制御できないため、 gRPC-Web(プロキシまたは対応ミドルウェアで変換)が必要になる。 gRPC-Web では クライアント ストリーミングと双方向ストリーミングが使えない (サーバ ストリーミングまで)という制約もある。 ASP.NET Core では
Grpc.AspNetCore.Webで対応する。
- Protocol Buffers が前提と成る。
- 故に、IDL(インターフェース定義言語)が必要になる。
HTTP/2をトランスポートとして利用する。
補足: HTTP/2 が前提であることの実務上の影響は大きい。
- HTTP/1.1 しか通さない中間装置(古いロードバランサ、 一部のリバース プロキシ、企業プロキシ)を経由できない。
- IIS で ASP.NET Core の gRPC をホストする場合、 TLS 必須かつ HTTP/2 の有効化が必要になる。
- Azure App Service (Windows) は長らく gRPC 非対応であった。
以下を参考にすると、WebAPI の一般的な認証機構を流用する模様。
補足: 実際、gRPC の認証は メタデータ(HTTP/2 ヘッダ)に Bearer トークンを載せる方式が主流で、 WebAPIの認証と同じ考え方でよい。 チャネル レベルでは TLS/mTLS(証明書)を併用する。
| 方式 | 内容 |
|---|---|
| Unary 通信 | 通常の関数コールのように扱える、1 リクエスト / 1 レスポンス型の通信方法 |
| Server Streaming 通信 | クライアントが 1 度リクエストを送信し、サーバから複数回数のレスポンスを返す。プッシュ型の実装に利用できる |
| Client Streaming 通信 | クライアントから複数回数のリクエストを送信し、それらを読み込んだサーバから 1 度のレスポンスを待つ |
| Duplex Streaming 通信 | 双方向ストリーミングの通信方式(TCP/IP の生実装のような) |
言語によって、同期呼び出し(ブロッキング)と
非同期呼び出し(ノンブロッキング)の両方の API が生成される。
.NET では非同期(Task ベース)が基本である。
gRPC ではデッドライン(いつまでに完了すべきか)を指定する。
補足: gRPC のデッドラインは、 一般的な「タイムアウト(この呼び出しは何秒まで)」ではなく 絶対時刻として伝播する。 このため、A → B → C と多段呼び出しをしても 全体の期限が引き継がれ、 ASP.NETで考慮すべきタイムアウト値で問題になる 「上位が諦めたのに下位が動き続ける」という状況を避けやすい。 .NET では
CallOptions.DeadlineとCancellationTokenを使う。
バインディングなど、WCF(MS_WCF.md)と似ている所がある。
ただ、上記を見ると、MS も gRPC 推しであるもよう
(.NET Core(MS_DotNetCore.md)の WCF はマイグレ・パスの 1 つと思われる)。
補足(最新化): この見立てはそのとおりになった。 WCF は .NET Core 以降に移植されず、 Microsoft は WCF からの移行先として gRPC を案内している。 なお、WCF の資産をそのまま動かしたい場合は コミュニティ プロジェクトの CoreWCF という選択肢もある。
補足: 実務では次のように整理すると判断しやすい。
観点 gRPC REST / JSON 主用途 サービス間(内部)通信 公開 API、ブラウザ向け 電文 バイナリ(小さい・速い) テキスト(人が読める) 契約 .protoによる IDL が必須OpenAPI は任意 ブラウザ gRPC-Web が必要 そのまま使える デバッグ 専用ツールが要る(grpcurl 等) cURLコマンド で足りる 「内部は gRPC、外向けは REST」という併用が定石である。
- WebAPI
- RPC
- gRPC 公式サイト
- gRPC - Wikipedia
- .NET での gRPC の概要 - Microsoft Learn
- gRPC / MagicOnion 入門 - xin9le.net
Tags: .NET開発, 通信技術, .NET Standard, .NET Core, ASP.NET, ASP.NET Web API
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。