Skip to content

MS_gRPC

nishi_74322014 edited this page Aug 3, 2026 · 1 revision

gRPC

概要

  • RPC を実現するために Google が開発したプロトコルの 1 つ。

  • 多くの言語でクロスプラットフォームで利用できる。

  • 一般的な利用シナリオ
    マイクロサービス型のアーキテクチャにおけるバックエンドサービスへの接続

    • モバイルデバイスからの接続
    • ブラウザからの接続

移行メモ(補足): 「ブラウザからの接続」は、そのままではできない。 ブラウザの JavaScript からは HTTP/2 のフレームを直接制御できないため、 gRPC-Web(プロキシまたは対応ミドルウェアで変換)が必要になる。 gRPC-Web では クライアント ストリーミングと双方向ストリーミングが使えない (サーバ ストリーミングまで)という制約もある。 ASP.NET Core では Grpc.AspNetCore.Web で対応する。

詳細

前提

Protocol Buffers

  • Protocol Buffers が前提と成る。
  • 故に、IDL(インターフェース定義言語)が必要になる。

HTTP/2

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(証明書)を併用する。

4種類の通信方式

方式 内容
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.DeadlineCancellationToken を使う。

WCFとの関係

バインディングなど、WCF(MS_WCF.md)と似ている所がある。

ただ、上記を見ると、MS も gRPC 推しであるもよう
(.NET Core(MS_DotNetCore.md)の WCF はマイグレ・パスの 1 つと思われる)。

補足(最新化): この見立てはそのとおりになった。 WCF は .NET Core 以降に移植されず、 Microsoft は WCF からの移行先として gRPC を案内している。 なお、WCF の資産をそのまま動かしたい場合は コミュニティ プロジェクトの CoreWCF という選択肢もある。

RESTとの使い分け

補足: 実務では次のように整理すると判断しやすい。

観点 gRPC REST / JSON
主用途 サービス間(内部)通信 公開 API、ブラウザ向け
電文 バイナリ(小さい・速い) テキスト(人が読める)
契約 .proto による IDL が必須 OpenAPI は任意
ブラウザ gRPC-Web が必要 そのまま使える
デバッグ 専用ツールが要る(grpcurl 等) cURLコマンド で足りる

「内部は gRPC、外向けは REST」という併用が定石である。

参考


Tags: .NET開発, 通信技術, .NET Standard, .NET Core, ASP.NET, ASP.NET Web API

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally