WEB+DB PRESS vol 110 の「速習 gRPC」 をやってみる - EchoService -

コードは以下です。

GitHub - dany1468/grpc_webdb_shakyo at 1_echo_service

WEB+DB の記事中では Go で書かれていますが、それの Ruby 版と .NET Core 版を自習としてやった感じです。

.NET Core 版は書くの放置してたら .NET Core 3 系が出て、ドキュメントもいろいろ整備されて待ってて良かった感。

環境は macOS Majave です。

Ruby 版について

上記のリンクをなぞっていくと EchoService を作る分には十分でした。(というか EchoService だと GenericService として存在してるので作る必要すら。。)

コミットログに実行コマンドを書いていますが、grpc-tools を入れて以下のコマンドで Go の方で定義した proto ファイルから stub を生成しています。

$ bundle exec grpc_tools_ruby_protoc -I ../golang/echo/proto --ruby_out=./proto --grpc_out=./proto ../golang/echo/proto/echo.proto

この辺の generator は PythonC++ の例を見ても同様に用意されてるみたいです。楽ちん。

.NET Core 版について

上記の gRPC の方のチュートリアルを見ると Grpc.Tools という Nuget package を使うことで MSBuild に integrate される形で生成できるとなっています。 obj の下に生成されるみたいです。

また dotnet-grpc という dotnet tools も提供されているようです。今回はこちらを使っています。 Manage Protobuf references with dotnet-grpc | Microsoft Docs

.NET Core 版は Server/Client で Project を分けているので、それぞれで以下を実行しています。

# Server
$ dotnet grpc add-file -p Server.csproj -s Server ../../../golang/echo/proto/echo.proto
# Client
$ dotnet grpc add-file -p Client.csproj -s Client ../../../golang/echo/proto/echo.proto

これで以下のコミットの結果が得られます。

Visual Studio for Mac だと obj 以下のファイルを認識しない?

どういう訳かビルドは通るのですが、参照がおかしいような波線が出続けました。(というか、 EchoService という名前が .NET Core の gRPC Service の命名と被るので、最初は補完も出ないし、なんか間違い続けた。。)

<protobuf の package 名>.<protobuf の service 名>.<protobuf の service 名>Base を継承した Service を書けば動くということだけ覚えておけばまずは書けそう。

Rider で開いたら問題無くコード補完も効きました。VS for Mac の設定が悪かったのかなぁ。

Mac で実行する場合の注意点

上記の 「Visual Studio for Mac」をみていると dotnet dev-certs https --trust で行けそうな手順になっているが、だめ。その直後に 「Note」として以下のリンクが提示されている。

なるほどと、Program.cs に追加してみるがそれだけでは駄目で、直前にある以下の対応が Client 側にも必要になる。これは Ruby の方でも insecure な接続にする設定をしていたので、なるほどという感じ。

その辺の対応した commit が以下。

https://github.com/dany1468/grpc_webdb_shakyo/commit/d00290fe8283c9865395adef7f2eef17b7930491

終わりに

最初の手順的なところで詰まることはありつつも、コマンドとかを理解すれば後はやりやすそうに感じました。

また時間があればストリーミングの方もやってみたいと思います。