🐷

Go言語でgRPCに入門してみた

2020/09/22に公開

仕事でgrpcを使いそうな雰囲気があったので、Hello Worldレベルで良いのでとりあえず動作させて感触を見てみました。

内容としては名前をサーバに送信すると"hello {名前}"というメッセージが返ってくるだけの本当に触りの触りをやってみました。

前提

OS: mac os 10.15
Go: 1.15.2

前準備

適当に動作確認用のディレクトリを作成します。
僕はtestにしました。

mkdir test && cd test
go mod init test

必要なライブラリなども追加していきます。

go get -u google.golang.org/grpc
go get -u github.com/golang/protobuf/protoc-gen-go
curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v3.13.0/protoc-3.13.0-osx-x86_64.zip
unzip protoc-3.13.0-osx-x86_64.zip

通信インターフェイスの定義と生成

gRPCは.protoで通信する際のインターフェイスを定義するようです。
今回はnameを送信してmsgをレスポンスするインターフェイスを定義しました。

syntax = "proto3";
service Hello {
  rpc hello (HelloMessage) returns (HelloResponse) {}
}
message HelloMessage {
  string name = 1;
}
message HelloResponse {
  string msg = 1;
}

そしてこの定義を元にclientや通信用の構造体を生成します。

mkdir hello
./bin/protoc --go_out=plugins=grpc:hello/. hello.proto

サーバーを実装

まずはメッセージを受信して返却するサーバ側を実装します。

mkdir server && touch server/server.go

中身はこんな具合。

package main

import (
	"context"
	"fmt"
	"log"
	"net"
	"test/hello"

	"google.golang.org/grpc"
)

func main() {
	listenPort, err := net.Listen("tcp", ":19003")
	if err != nil {
		log.Fatal(err)
	}
	server := grpc.NewServer()
	hello.RegisterHelloServer(server, &Hello{})
	server.Serve(listenPort)
}

type Hello struct{}

func (h *Hello) Hello(cts context.Context, message *hello.HelloMessage) (*hello.HelloResponse, error) {
	res := hello.HelloResponse{Msg: fmt.Sprintf("hello %s\n", message.Name)}
	return &res, nil
}

クライアントの実装

次にクライアントを実装をします。

mkdir client && touch client/client.go

こちらの中身はこんな具合。

package main

import (
	"context"
	"fmt"
	"log"

	"google.golang.org/grpc"

	hello "test/hello"
)

func main() {
	con, err := grpc.Dial("127.0.0.1:19003", grpc.WithInsecure())
	if err != nil {
		log.Fatal("client connection error:", err)
	}
	defer con.Close()
	client := hello.NewHelloClient(con)
	message := &hello.HelloMessage{Name: "world"}
	res, _ := client.Hello(context.TODO(), message)
	fmt.Printf("%s\n", res.Msg)
}

実行してみる

以下のようにサーバを起動してからクライアントを起動して「hello world」と表示されれば、うまくいってます。

go run ./server/server.go
go run ./client/client.go
> hello world

参考

https://grpc.io/docs/languages/go/
https://qiita.com/marnie_ms4/items/4582a1a0db363fe246f3

Discussion