tjtjtjのメモ

自分のためのメモです

hello, grpc

envoy の流れで go-control-plane を小一時間眺めたがよくわからなかった。grpcサンプルを実行したものの書いてないから?ここをアレンジしつつ写経し、ここにおいた。

protoc 導入

windows なので、ここ から protoc-3.8.0-win64.zip ダウンロード -> 展開 -> protoc.exe を path が通ってるところに配置。

proto ファイルを書く

syntax = "proto3";

package ping;

service Ping {
    rpc Hello (HelloRequest) returns (HelloResponse) {
    }
}

message HelloRequest {
    string toMessage = 1;
}

message HelloResponse {
    string resMessage = 1;
}

proto ファイルからgoのファイルを生成

protoc すると ping.proto の階層に ping.pb.go が生成される。

protoc --go_out=plugins=grpc:./ proto/ping/ping.proto

grpc サーバを作る

service.go

package main

import (
    "log"
    "net"

    "google.golang.org/grpc"
    "golang.org/x/net/context"
    "grpcprac/prac1/proto/ping"
)

type PingService struct {
}

func (s *PingService) Hello(ctx context.Context, req *ping.HelloRequest) (*ping.HelloResponse, error) {
    toMessage := req.GetToMessage()
    log.Println(toMessage)
    response := ping.HelloResponse{
        ResMessage: "I hear " + toMessage,
    }
    return &response, nil
}

var port = ":19003"

func main() {
    listenPort, err := net.Listen("tcp", port)
    if err != nil {
        log.Fatalln(err)
    }
    server := grpc.NewServer()
    pingService := PingService{}
    ping.RegisterPingServer(server, &pingService)

    log.Printf("[server started] localhost%s", port)
    err = server.Serve(listenPort)
    if err != nil {
        log.Fatalln(err)
    }
}

grpc クライアントを作る

package main

import (
    "context"
    "log"
    "time"

    "google.golang.org/grpc"
    "grpcprac/prac1/proto/ping"
)

const (
    address     = "localhost:19003"
)

func main() {
    conn, err := grpc.Dial(address, grpc.WithInsecure())
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
    c := ping.NewPingClient(conn)

    message := "qwer"

    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()
    r, err := c.Hello(ctx, &ping.HelloRequest{ToMessage: message})
    if err != nil {
        log.Fatalf("could not greet: %v", err)
    }
    log.Printf("Ping: %s", r.ResMessage)
}

実行

サーバ

>go run service.go
go: finding github.com/golang/protobuf/proto latest
go: finding golang.org/x/net/context latest
go: finding google.golang.org/grpc/codes latest
go: finding google.golang.org/grpc/status latest
go: finding golang.org/x/net latest
2019/06/25 20:24:03 [server started] localhost:19003
2019/06/25 20:24:13 qwer
2019/06/25 20:24:18 qwer
2019/06/25 20:24:24 qwer
2019/06/25 20:24:29 qwer

クライアント

>go run client.go
2019/06/25 20:24:13 Ping: I hear qwer

>go run client.go
2019/06/25 20:24:18 Ping: I hear qwer

>go run client.go
2019/06/25 20:24:24 Ping: I hear qwer

>go run client.go
2019/06/25 20:24:29 Ping: I hear qwer