アルパカログ

カスタマーサポート (CS) とエンジニアリングを掛け算したい CRE (Customer Reliability Engineer) が気になる技術や思ったことなど。

Goで立てたgRPCサーバにRuby/Elixirクライアントで接続してみる

gRPCはGoogleOSSとして公開しているRPCフレームワークです。

gRPCを使うと、異なるマシン/言語間でもローカルオブジェクトかのごとくメソッドを呼び出すことができます。

詳細は下記をご覧ください。

今日はそれを確かめるために、公式のサンプルをそのまま使って、Goで立てたgRPCサーバのメソッドをRubyのgRPCクライアントから呼び出してみます。

Ruby と Go の gRPC サンプルをそれぞれ動かしてみます。今回 Ruby は 2.5.1 を、Go は 1.11.0 を使いました。

サンプルで動作確認をしたら、Go でサーバを立てて Ruby クライアントを起動してみます。

% go run greeter_server/main.go
% ruby greeter_client.rb
"Greeting: Hello world"
% ruby greeter_client.rb hoge
"Greeting: Hello hoge"

ちゃんとレスポンスが返ってきます。これはすごい。

異なる言語間での開発では、proto ファイルが共有されていることproto ファイルが変更されたとき gRPC コードを再生成することさえ守っていれば大丈夫そうです。

gRPC を使えば、例えばスマホアプリのクライアントで、データ操作やロジックに関するメソッドを全てサーバ側に寄せて、クライアントコードはビューに関する部分に徹することができるなど、コードの見通しが格段にアップしそうですね。

Elixir クライアント

最後に Elixir クライアントを試してみます。

Elixir は gRPC の公式チュートリアルが存在しません。下記の OSS を試してみました。

grpc-elixir/examples/helloworld at master · tony612/grpc-elixir · GitHub

Erlang/OTP は 21 を、Elixir は 1.6.6 を使用しました。

% mix run priv/client.exs
%Helloworld.HelloReply{message: "Hello grpc-elixir"}

Go で立てたサーバに接続できました。

WARNING: APIs are unstable now. Be careful to use it in production!

と書かれていますが Hello World は動きました。素晴らしいですね。