gRPCのQuick start (Ruby)をやった
Ruby gRPC
Published: 2020-12-19

やったこと

gRPC に入門します。

公式のチュートリアルとは少しだけ手順を変えてやっていきます。言語はRubyです。

確認環境

$ docker --version
Docker version 19.03.13, build 4484c46d9d

調査

gRPC とは

Googleが開発を開始したオープンソースのリモートプロシージャコール (RPC) システムである。

さらにデフォルトで、Protocol Buffersを使うことが出来ます。

Protocol Buffers とは

Protocol buffers are Google’s language-neutral, platform-neutral, extensible mechanism for serializing structured data – think XML, but smaller, faster, and simpler

シリアライズしてあるデータで、速い(とのこと)。

Quick start を進める

tab1 (server)

-- local
$ docker run -it --rm grpc/ruby bash

-- コンテナ
$ gem install grpc

$ gem install grpc-tools

$ git clone -b v1.34.0 https://github.com/grpc/grpc
$ cd /grpc/examples/ruby
$ ruby greeter_server.rb

tab2 (client)

※ コンテナIDを $ docker ps を実行するなどして取得してください

-- local
$ docker exec -it de1f4f419893 bash

-- コンテナ
$ cd /grpc/examples/ruby

-- 編集用
$ apt-get update
$ apt-get install vim

今回は、tab2 (client) の中で色々作業していきます。

examples/protos/helloworld.proto

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
  // 今回追加する
  rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

gRPCのコードを生成

$ grpc_tools_ruby_protoc -I ../protos --ruby_out=lib --grpc_out=lib ../protos/helloworld.proto

このファイルが更新されました。

	modified:   lib/helloworld_pb.rb
	modified:   lib/helloworld_services_pb.rb

greeter_server.rb

class GreeterServer < Helloworld::Greeter::Service
  ...(省略)

  def say_hello_again(hello_req, _unused_call)
    Helloworld::HelloReply.new(message: "Hello again, #{hello_req.name}")
  end
end

greeter_client.rb

def main
  stub = Helloworld::Greeter::Stub.new('localhost:50051', :this_channel_is_insecure)
  user = ARGV.size > 0 ?  ARGV[0] : 'world'
  message = stub.say_hello(Helloworld::HelloRequest.new(name: user)).message
  p "Greeting: #{message}"

  # ここが追加するコード
  message = stub.say_hello_again(Helloworld::HelloRequest.new(name: user)).message
  p "Greeting: #{message}"
end

実行します

$ ruby greeter_client.rb

最後に

新しい言葉が多く出てきましたが、手を動かすことで開発の流れを少しだけイメージすることができました。

gRPC は数種類の通信方法があるみたいなので、やっていきたいと思います。

参考