TL;DR

Web ブラウザから gRPC サーバと通信するためのライブラリとプロトコル。サポートするのは Unary RPC と Server streaming RPC だけである。

なぜ必要か

ブラウザからは gRPC を直接呼べない。理由は 2 つある。

1 つ目は、gRPC は HTTP/2 を使うが、ブラウザは HTTP/2 の使用を強制できないことである。ブラウザは、サーバと HTTP/2 で通信できるときは HTTP/2 を使い、そうでなければ勝手に HTTP/1.1 にフォールバックする。

2 つ目は、gRPC は HTTP Trailer を多用するが、ブラウザを含む多くの HTTP 実装がこれをサポートしていないことである。

仕組み

HTTP/2 を強制できない問題

Envoy などのプロキシサーバを間に挟み、ブラウザからの HTTP/1.1 の通信を HTTP/2 に変換して gRPC サーバに渡す。

HTTP Trailer を使えない問題

gRPC Web プロトコルでは、HTTP Trailer をレスポンスボディの末尾にエンコードして付ける。ただし、ほとんどの gRPC サーバは gRPC Web プロトコルをサポートしていないので、プロキシサーバで変換する。

Buf が開発した Connect で作った gRPC サーバは、gRPC Web プロトコルをサポートしている。そのため、プロキシを挟まずにブラウザと直接やり取りできる。

注意点

HTTP/1.1 でもストリーミングの受信はできるが、送信には HTTP/2 が必要になる。そのため、クライアントからストリーミングで送る RPC は使えない。

関連

出典