GoでgRPCサーバたててevansで実行するまで

goでgRPCサーバたてて、evansで叩くまでの備忘録です。

gRPCサーバ実装

一応ソースあげておきました。

grpcのインストール

go get -u google.golang.org/grpc

protoファイル作成

schema/sample.proto

syntax = "proto3";
service Sample {
  rpc GetSample (GetSampleRequest) returns (SampleResponse) {}
}
message GetSampleRequest {
  string sample_txt = 1;
}
message SampleResponse {
  string sample_message = 1;
}

コード生成

mkdir pb

cd schema

protoc --go_out=plugins=grpc:../pb sample.proto

ここまででpb配下にsample.pb.goが生成されていると思います。

serviceレイヤ実装

service/sample.go

package service

import (
    "context"

    "github.com/ybalexdp/sample-grpc/pb"
)

type SampleService struct {
}

func (s *SampleService) GetSample(ctx context.Context, message *pb.GetSampleRequest) (*pb.SampleResponse, error) {
    return &pb.SampleResponse{
        Message: "Hello :" + message.Name,
    }, nil
}

main実装

main.go

package main

import (
    "log"
    "net"

    "github.com/ybalexdp/sample-grpc/pb"
    "github.com/ybalexdp/sample-grpc/service"

    "google.golang.org/grpc"
)

func main() {
    listenPort, err := net.Listen("tcp", ":2007")
    if err != nil {
        log.Fatalln(err)
    }
    server := grpc.NewServer()
    sampleService := &service.SampleService{}
    pb.RegisterSampleServer(server, sampleService)
    server.Serve(listenPort)
}

あとは

go run main.go

するだけ。

evans導入&実行

evansインストール(mac)

brew tap ktr0731/evans

brew install evans

evans起動&API実行

evans --path schema --port 2007 sample.proto

  ______
 |  ____|
 | |__    __   __   __ _   _ __    ___
 |  __|   \ \ / /  / _. | | '_ \  / __|
 | |____   \ V /  | (_| | | | | | \__ \
 |______|   \_/    \__,_| |_| |_| |___/

 more expressive universal gRPC client


pb.Sample@127.0.0.1:2007>call GetSample
name (TYPE_STRING) => test
{
  "message": "Hello :test"
}

pb.Sample@127.0.0.1:2007>