Microsoftは先週、.NET用gRPC-Webプロトコルの実用レベルの実装をリリースした。元々は試験的機能というサポートだったが、今回、コンポーネントがgrpc-dotnetプロジェクトの一部となったのだ。新しいコンポーネントにより、ブラウザ内でgRPCを使用できるようになるので、HTTPサーバをプロキシとして使用しなくても、Webアプリケーションが直接gRRCサーバと通信可能になる。
Googleがオリジナルを開発して使用したgRPCは、HTTP/2上に実装された、ハイパフォーマンスなリモートプロシージャコールフレームワークである。しかし、ブラウザが直接HTTP/2フレーミングを公開していないため、WebアプリケーションがgRPC実装を直接使用することはできない。gRPC-Webはこの問題を解決するための標準プロトコルで、ブラウザからgRPCの利用が可能になる。
今年初めにMicrosoftは、試験的プロジェクトとしてgRPC-Webのサポートを発表した。当時、同社でASP.NET Coreを担当するプリンシパルソフトウェアエンジニアであるJames Newton-King氏は、同プロジェクトは製品化を確約するものではない、と述べていた。
gRPC-Webを実装するアプローチをテストして、プロキシ経由でgRPC-Webをセットアップする従来の方法と比較したときに、このアプローチが.NET開発者にとって価値のあるものなのか、フィードバックを集めたいと思っています。
最初のgRPC-web実装は2018年にJavaScriptクライアントライブラリとしてリリースされた。これにより、HTTPサーバをプロキシとして使用する必要なく、WebアプリケーションがgRPCサービスと直接通信できるようになった。これは、HTTP/1.1およびHTTP/2と互換性のある、エンドツーエンドのgRPCパイプラインを生成することで実現されている。その上でブラウザが通常のHTTP要求を送信できるとともに、ブラウザとサーバ間のgRPC-Webプロキシが、リクエストとレスポンスのトランザクションを可能にしている。gRPCと同じようにgRPC-Webも、(Web)クライアントとgRPCサービスの間で事前定義されたコントラクトを使用する。メッセージのシリアライズとエンコードにはProtocol Buffersが使用される(他のエンコーダを使用することも可能)。
(出典: gRPC website)
新しいコンポーネントでは、ASP.NET CoreのgRPCアプリケーションを、.NET Blazor WebAssemblyアプリケーション、JavaScript SPAのどちらからでも、直接呼び出すことができる。また、IIS上のASP.NET Core gRPCアプリケーションとAzure APP Serviceサーバは、いずれも現時点ではgRPCサービスをホストできないため、代替手段も提供されている。
ただし、gRPCサービスをブラウザからgRPC-Webで呼び出す場合には、いくつかの制約がある。具体的には、クライアントストリーミングと双方向ストリーミングコールはサポートされていない、別ドメインのgRPCサービス呼び出しにはサーバ上でCORSが設定されている必要がある、といったものだ。また、gRPCサーバはgRPC-Webをサポートするように設定されているか、サードパーティのサービスプロキシ(Envoyなど)がブラウザとサーバ間で呼び出し変換を行う必要がある。
新リリースでは、オリジナルのプロジェクト資料が更新され、サンプルgRPC-Webアプリケーションが公開されている。gRPC-WEB for .NETはNuGet上で、Grpc.AspNetCore.Web(ASP.NET Core gRPCサービスにgRPC-Webサポートを追加する)と、Grpc.Net.Client.Web(.NETからgRPC-Webエンドポイントの呼び出しを可能にする)という、2つのパッケージとして提供される。コンポーネントには.NET Core 3.1 SDK以降が必要で、Visual Studio 2019 (16.4以降)、Visual Studio Code、Visual Studio for Mac (バージョン8.4以降)で使用することができる。gRPC-Webを使用するメリットに関する詳細は、こちらに説明されている。