Goとgrpc-gatewayでリバースプロキシを開発する――gRPCサービスのRESTful API化:スキマ時間にこっそり学ぶ「gRPC」入門(終)
第8回は、gRPCをサポートしないWebブラウザなどのクライアントからgRPCサービスを利用するためのリバースプロキシgrpc-gatewayを紹介します。プログラミング言語はGoです。
本連載のサンプルコードをGitHubで公開しています。こちらからダウンロードしてみてください。
WebブラウザをgRPCクライアント化する方法
今回のテーマは、WebブラウザをはじめとするgRPCをサポートしないWebクライアントのgRPCクライアント化です。gRPCはバックエンドでマイクロサービス間の通信に用いられることが多いのですが、フロントエンドでもgRPCを使えれば、Webブラウザのために別途APIを整備する必要がなくなるなどのメリットが生まれます。
Webブラウザは、本稿の執筆時点でgRPCをサポートしていません。そのため、以下のような手段で間接的にgRPCサービスを利用することになります。
- gRPC Web
- Connect
- grpc-gateway
gRPC-WebとConnect
gRPC-Webは、WebブラウザでgRPCサービスを利用するためのプロトコルです。JavaScriptなどからは、このプロトコルをサポートするクライアントスタブライブラリ(protocのgRPC-Webプラグインで生成)を使用して、gRPCサービスを呼び出すためのコードを記述できます。ただし、gRPC-WebはWebブラウザの機能上の制約により完全なgRPCクライアントになることはできず、実際にはクライアントとgRPCサーバの間にプロトコル変換のためのリバースプロキシを挟む必要があります。リバースプロキシとしては、Envoyというプロキシソフトウェアがよく使われています。
grpc/grpc-web: gRPC for Web Clients
【補足】リバースプロキシ
リバースプロキシとは、特定のサーバのために設けられるプロキシ(アクセスを代行するサーバ)で、クライアントは不特定多数となります。これに対して一般的なプロキシ(フォワードプロキシ)は、特定のクライアントのために設けられるプロキシで、サーバは不特定多数となります。いわゆるプロキシというと後者であったため、リバース(逆)プロキシと呼ばれています。フォワードプロキシが、クライアントネットワーク側に設置されるのに対して、リバースプロキシはサーバ側ネットワークに配置されます。後述の図1では、不特定のクライアントからのアクセスを中継し、gRPCサーバへのアクセスを代行していることが示されています。
リバースプロキシによるプロトコル変換とは別に、Connectというライブラリを利用することで、プロトコル定義ファイルからgRPCとgRPC-Webの双方に対応したコードを生成するというアプローチもあります。ConnectはRESTful API形式の独自のプロトコルもサポートするので、これによりWebクライアントからの利用が非常に容易になるというメリットがあります。
Connect - Simple, reliable, interoperable. A better gRPC.
grpc-gateway
Copyright © ITmedia, Inc. All Rights Reserved.