クイックスタート
このガイドでは、シンプルな動作例を使用して、RubyでのgRPCの開始方法を説明します。
クイックスタート
前提条件
- Rubyバージョン2以上
gRPC
gRPCをインストールするには、次のコマンドを実行します。
$ gem install grpc
gRPCツール
RubyのgRPCツールには、プロトコルバッファコンパイラ`protoc`と、`.proto`サービス定義からサーバーとクライアントコードを生成するための特別なプラグインが含まれています。クイックスタートの最初の部分では、helloworld.protoからサーバーとクライアントのスタブを既に生成していますが、残りのクイックスタート、後のチュートリアル、そして独自のプロジェクトのためには、これらのツールが必要です。
gRPCツールをインストールするには、次のコマンドを実行します。
$ gem install grpc-tools
サンプルのダウンロード
このクイックスタートを進めるには、サンプルコードのローカルコピーが必要です。GitHubリポジトリからサンプルコードをダウンロードします(次のコマンドではリポジトリ全体がクローンされますが、このクイックスタートや他のチュートリアルに必要なのはexamplesディレクトリのみです)。
# Clone the repository to get the example code:
$ git clone -b v1.62.0 --depth 1 --shallow-submodules https://github.com/grpc/grpc
# Navigate to the "hello, world" Ruby example:
$ cd grpc/examples/ruby
gRPCアプリケーションの実行
`examples/ruby`ディレクトリから
サーバーを実行します
$ ruby greeter_server.rb
別のターミナルから、クライアントを実行します
$ ruby greeter_client.rb
おめでとうございます!gRPCを使用したクライアントサーバーアプリケーションを実行しました。
gRPCサービスの更新
今度は、クライアントが呼び出すことができるサーバーに追加メソッドでアプリケーションを更新する方法を見てみましょう。gRPCサービスはプロトコルバッファを使用して定義されています。`.proto`ファイルでサービスを定義する方法の詳細については、基本チュートリアルを参照してください。現時点では、サーバーとクライアントの「スタブ」の両方に、クライアントから`HelloRequest`パラメータを受け取り、サーバーから`HelloResponse`を返す`SayHello` RPCメソッドがあり、このメソッドは次のように定義されていることを知っていれば十分です。
// 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`ディレクトリから
サーバーを実行します
$ ruby greeter_server.rb
別のターミナルから、クライアントを実行します
$ ruby greeter_client.rb