LoginSignup
1

More than 3 years have passed since last update.

GoでgRPC

Last updated at Posted at 2019-08-05

概要

前回、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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1