Help us understand the problem. What is going on with this article?

GoでgRPC

More than 1 year has passed since last update.

概要

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

nannou
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away