クイックスタート

このガイドでは、簡単な動作例で Ruby の gRPC のはじめ方を紹介します。

クイックスタート

このガイドでは、簡単な動作例で Ruby の gRPC のはじめ方を紹介します。

前提条件

  • Ruby バージョン 2 以上

gRPC

gRPC をインストールするには、次のコマンドを実行します。

gem install grpc

gRPCツール

Ruby の gRPC ツールには、Protocol Buffers コンパイラ `protoc` と、`.proto` サービス定義からサーバーおよびクライアントコードを生成するための特殊なプラグインが含まれています。クイックスタート例の最初の部分では、`helloworld.proto` からサーバーとクライアントのスタブを生成済みですが、残りのクイックスタート、その後のチュートリアル、および独自のプロジェクトでは、これらのツールが必要になります。

gRPC ツールをインストールするには、次のコマンドを実行します。

gem install grpc-tools

サンプルをダウンロードする

このクイックスタートを進めるには、サンプルコードのローカルコピーが必要です。GitHub リポジトリからサンプルコードをダウンロードしてください(以下のコマンドはリポジトリ全体をクローンしますが、このクイックスタートや他のチュートリアルには例のみが必要です)。

# Clone the repository to get the example code:
git clone -b v1.74.0 --depth 1 --shallow-submodules https://github.com/grpc/grpc
# Navigate to the "hello, world" Ruby example:
cd grpc/examples/ruby

gRPCアプリケーションを実行する

examples/ruby ディレクトリから

  1. サーバーを実行する

    ruby greeter_server.rb
    
  2. 別のターミナルで、クライアントを実行する

    ruby greeter_client.rb
    

おめでとうございます!gRPCを使用したクライアント・サーバーアプリケーションを実行できました。

gRPCサービスを更新する

次に、クライアントが呼び出すための追加メソッドをサーバーに実装する方法を見ていきましょう。gRPC サービスは Protocol Buffers を使用して定義されます。`.proto` ファイルでサービスを定義する方法については、Basics tutorial で詳しく説明しています。今のところ、サーバーとクライアントの「スタブ」の両方に `SayHello` RPC メソッドがあり、クライアントからの `HelloRequest` パラメータを受け取り、サーバーからの `HelloResponse` を返すこと、そしてこのメソッドが次のように定義されていることを知っておけば十分です。

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

これを更新して、`Greeter` サービスが 2 つのメソッドを持つようにしましょう。`examples/protos/helloworld.proto` を編集し、同じリクエストとレスポンスタイプを持つ新しい `SayHelloAgain` メソッドを追加してください。

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
  // Sends another greeting
  rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

ファイルを保存してください!

gRPCコードを生成する

次に、新しいサービス定義を使用するようにアプリケーションで使用されている gRPC コードを更新する必要があります。`examples/ruby/` ディレクトリから

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

これにより、生成されたクライアントおよびサーバークラスが含まれる `lib/helloworld_services_pb.rb` が再生成されます。

サーバーを更新する

同じディレクトリで `greeter_server.rb` を開きます。新しいメソッドを次のように実装します。

class GreeterServer < Helloworld::Greeter::Service

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

  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

実行!

以前行ったのと同じように、`examples/ruby` ディレクトリから

  1. サーバーを実行する

    ruby greeter_server.rb
    
  2. 別のターミナルで、クライアントを実行する

    ruby greeter_client.rb
    

次は何をするか