概要
前回、JavaでgRPCサーバーがビルド出来たので、今度はGoのクライエントからリクエストしてみます。
流れは同じで、protoファイルからGoコードを生成し、クライエントを実装します。
環境
- Mac
- Go version 1.12
コンパイラをダウンロード
ここから落としてきて、パスを通す。
brewでもいけるみたいです。
ライブラリを落とす
$ go get -u google.golang.org/grpc
$ go get -u github.com/golang/protobuf/protoc-gen-go
上がgRPCを使用するライブラリ。
下がGoコード生成用のライブラリです。
上でダウンロードしたコンパイラがprotoc-gen-goを使用するので、go/binにパスを通す必要があります。
protoファイルの準備
Javaのサーバーと通信したいので、前回使用したものと同じものを使用します。
syntax = "proto3";
option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
package helloworld;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
※ optionはJava用、packageはGo用
コード生成
$ protoc --go_out=plugins:grpc:helloworld/ helloworld.proto
※ plugin:grpcが抜けるとサーバーとクライエントのコードが生成されませんでした。
また、「protoc-gen-go: program not found or is not executable」というエラーが出る場合は、protoc-gen-goへのパスが通ってないと思われるので、チェックしてみてください。
Javaサーバーへ通信
今回は既にJavaサーバーが出来ているので、Clientのみ実装します。
ほぼチュートリアルから持って来ています。
package main
import (
pb "./helloworld"
"context"
"google.golang.org/grpc"
"log"
"os"
"time"
)
const (
address = "localhost:8080"
defaultName = "Takeshi"
)
func main() {
conn, err := grpc.Dial(address, grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewGreeterClient(conn)
name := defaultName
if len(os.Args) > 1 {
name = os.Args[1]
}
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("reply: %s", r.Message)
}
Javaのサーバー側を起動し、Goのclientを実行する。
reply: Hello Takeshi
無事、Takeshiが返って来ました。