続き Unnaryの実装

Goを使用したgRPCサーバー起動チュートリアル。

Mac側の準備

Protoc Setup

code generation のためにprotocをインストールする。

$ brew install protobuf

Go側の準備

grpc-go

grpc/grpc-goをインストールする。

$ go get -u google.golang.org/grpc

golang/protobuf

golang/protobufをインストールする。

$ go get -u github.com/golang/protobuf/protoc-gen-go

動作概要

  1. greet.protoを作成しprotobufコマンドによりgreet.goを生成する。
  2. server.go, client.goを作成する。それぞれの内部ではgreet.goを使用している。
  3. server.go を走らせてgRPCサーバーの起動を確認する。
  4. Client.goを走らせてgRPCサーバーとの疎通を確認する。

ディレクトリ構成

GOPATH/src/github.com/benibana2001/grpc-go-test
	-greet/
			-greetpb/
					-greet.proto // <= 1.
					-greet.pb.go // <= 2. .protocコマンドを使用してgreet.protoより生成
  		-greet_server/
  				-server.go   // <= 3.
      -greet_client/
      		-client.go   // <= 4.
	-caluculater/

Generate code from .proto to .go

以下のような感じで.protoから.goを生成する。

$ protoc greet/greetpb/greet.proto --go_out=plugins=grpc:.

Coding

1. greet/greetpb/greet.proto

syntax = "proto3";
package greet;
option go_package="greetpb";

service GreetService{}

2. greet/greetpb/greet.pb.go

protocコマンドにより生成される .pb.goファイル。

// Code generated by protoc-gen-go. DO NOT EDIT.
// source: greet/greetpb/greet.proto

package greetpb

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	grpc "google.golang.org/grpc"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

func init() { proto.RegisterFile("greet/greetpb/greet.proto", fileDescriptor_fe6f881da19a2871) }

var fileDescriptor_fe6f881da19a2871 = []byte{
	// 72 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4c, 0x2f, 0x4a, 0x4d,
	0x2d, 0xd1, 0x07, 0x93, 0x05, 0x49, 0x10, 0x5a, 0xaf, 0xa0, 0x28, 0xbf, 0x24, 0x5f, 0x88, 0x15,
	0xcc, 0x31, 0xe2, 0xe3, 0xe2, 0x71, 0x07, 0x31, 0x82, 0x53, 0x8b, 0xca, 0x32, 0x93, 0x53, 0x9d,
	0x38, 0xa3, 0xd8, 0xa1, 0xaa, 0x93, 0xd8, 0xc0, 0x0a, 0x8d, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff,
	0xbb, 0xd0, 0x0c, 0xc2, 0x45, 0x00, 0x00, 0x00,
}

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4

// GreetServiceClient is the client API for GreetService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type GreetServiceClient interface {
}

type greetServiceClient struct {
	cc *grpc.ClientConn
}

func NewGreetServiceClient(cc *grpc.ClientConn) GreetServiceClient {
	return &greetServiceClient{cc}
}

// GreetServiceServer is the server API for GreetService service.
type GreetServiceServer interface {
}

// UnimplementedGreetServiceServer can be embedded to have forward compatible implementations.
type UnimplementedGreetServiceServer struct {
}

func RegisterGreetServiceServer(s *grpc.Server, srv GreetServiceServer) {
	s.RegisterService(&_GreetService_serviceDesc, srv)
}

var _GreetService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "greet.GreetService",
	HandlerType: (*GreetServiceServer)(nil),
	Methods:     []grpc.MethodDesc{},
	Streams:     []grpc.StreamDesc{},
	Metadata:    "greet/greetpb/greet.proto",
}

3. greet/greet_server/server.go

package main
import (
	"fmt"
	"github.com/benibana2001/gcp-go/greet/greetpb"
	"google.golang.org/grpc"
	"log"
	"net"
)

type server struct{}
func main() {
  lis, _ := net.Listen("tcp", "0.0.0.0:5051") //omit error
  s := grpc.NewServer()
  
  // Code Generate されたserver.goより
  greetpb.RegisterGreetServiceServer(s, &server{})
  
  if err := s.Serve(lis); err != nil {
    log.Fatalf("failed to serve: %v", err)
  }
}
  

4. greet/greet_client/client.go

func main() {
  cc, _ := grpc.Dial("localhost:50051", grpc.WithInsecure()) //omit error
  defer cc.Close()
  
  c := greetpb.NewGreetServiceClient(cc) //connect

続き Unnaryの実装