🐷
Go言語でgRPCに入門してみた
仕事で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
参考
Discussion