Edited at

GoでgRPC


概要

前回、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のサーバーと通信したいので、前回使用したものと同じものを使用します。


helloworld.proto

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のみ実装します。

ほぼチュートリアルから持って来ています。


[client.go]

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が返って来ました。


参考

Go Quick Start