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 は Python や C++ の例を見ても同様に用意されてるみたいです。楽ちん。
.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
これで以下のコミットの結果が得られます。
- https://github.com/dany1468/grpc_webdb_shakyo/commit/7fe4822387dfc578c4f479d5d76b274fabca4408
- https://github.com/dany1468/grpc_webdb_shakyo/commit/66a6e8816b58d27130dac0e8e46c7f883e94f670
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
終わりに
最初の手順的なところで詰まることはありつつも、コマンドとかを理解すれば後はやりやすそうに感じました。
また時間があればストリーミングの方もやってみたいと思います。