gRPC-WEB がもたらす我々の生活への変化
gRPC-WEB が GA となった。これが我々の生活にどのような変化をもたらすのかについて考える。
従来の gRPC の課題
gRPC は google が公開している RPC 方式であり、java, golang などの言語で利用可能になっている。 gRPC は protocol buffers over HTTP/2 を基本としているため、通信が multiplexing されるし、schema 定義がきっちりされるのでクライアント側とのコミュニケーションがしやすい。
一方、protocol buffers はbinary であるためにbinaryの取扱が苦手な Browser JavaScript からのアクセスが難しいという問題があった。
grpc-gateway
grpc-gateway という実装があって、これを利用すれば Browser JavaScript からのアクセスも可能ではある。しかし、専用の gateway server を golang で生成して運用することになって煩雑である。
また、client library を protobuf 定義ファイルから生成することができないので、そういった意味では、gRPC の魅力を 100% 引き出すことができていないといえるかもしれない。 もちろん、Swagger の定義を生成することができるので、そこから codegen することはできる。
外部に向けて JSON API を提供する必要がある場合には grpc-gateway は引き続き有力な選択肢となるが、SPA web application のためのエンドポイントの場合には、grpc-web の方が今後は良い選択となると私は考える。
また、grpc-gateway はコミュニティ実装であるから、公式ではない。
gRPC-WEB
gRPC-WEB のプロトコルは PROTOCOL-WEB.md で解説されている。
多くのブラウザで動作するように、base64で encode する方法などが protocol で設定されている。
gRPC-WEB の実装
現在のところ nginx module と envoy というプロキシサーバーによる実装、grpcwebproxy という go 実装が提供されている。
nginx module
https://github.com/grpc/grpc-web/tree/master/net/grpc/gateway/nginx
nginx module も提供されている。
grpcweb
https://github.com/improbable-eng/grpc-web/tree/master/go/grpcweb
grpcweb は go のライブラリ実装。既存の golang で書かれた gRPC サーバー実装の中に組み込んで、 gRPC-web で export する機能を追加することができる。 便利。
grpcwebproxy
https://github.com/improbable-eng/grpc-web/tree/master/go/grpcwebproxy
golang で実装されている grpc-web の実装。go で single binary で導入できるので、一番導入が簡単そう。
envoy
Envoy は C++ で書かれた proxy server です。拡張が容易になっていて、C++ で簡単に拡張できるようになっています。
Envoy の grpc-web の実装は envoy の repository の中にあります。C++ ですがコメントがたくさんあるのでわかりやすいですね。
Envoy の中に実装されているのは、Proxy layer でカバーできていればすべてのサーバー実装で使えるので、まずは proxy layer で実装したということのようだ。
Envoy は C++ で書かれているのでビルドがそこそこ面倒なので docker での運用が現実的と思われる。プリビルドバイナリも提供されているが、ubuntu と alpine のみなので centos 勢としては悲しい。
今後の grpc-web の roadmap
https://github.com/grpc/grpc-web/blob/master/ROADMAP.md
このドキュメントで今後の ROADMAP が述べられている。 いくつか気になったところを紹介する。
非バイナリフォーマット
Binary の protobuf を base64 などにエンコーディングする方式は CPU overhead/memory overhead が大きい。よって、gmail などで採用されている、text protocol だが高速に処理できるフォーマットを使うようにすれば良いのではないか、とのこと。
Local Proxies
各言語用のサーバーライブラリの側に、gRPC-WEB サポートを追加しようというプラン。 今は go だけあるっぽい。Java support が待ち遠しい。
TypeScript support
これはほしい。Protobuf から生成されたクライアントに型情報が付けば、IDE 上での作業が快適になることは間違いない。
Web UI Support
gRPC-WEB を実際に試せる web console を作りたい、とのこと。
長期的な展望
whatwg streams api が各ブラウザに実装されて普及すれば、native の gRPC protocol を利用可能になるのではなるとのこと。