Go 语言Grpc入门

159 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

安装 Protocol Buffers v3

  1. 下载Protocol
wget https://github.com/google/protobuf/releases/download/v3.5.1/protobuf-all-3.5.1.zip
  1. 解压并安装protocol
unzip protobuf-all-3.5.1.zip
cd protobuf-3.5.1/
./configure
make
make install
  1. 验证是否安装成功
protoc --version

创建Go项目,并编写proto

  1. 创建一个grpc-example项目
$ mkdir grpc-example
$ go mod init grpc-example
  1. 安装grpc依赖
go get -u google.golang.org/grpc
go get -u github.com/golang/protobuf/protoc-gen-go
  1. 编写hello_grpc.proto文件 项目目录如下:
- proto
 |- hello_grpc.proto
syntax = "proto3";

package say_hello;

option go_package="/say_hello";

service SayHelloService {
  rpc SayHello(SayHelloRequest) returns (SayHelloResponse) {}
}

message SayHelloRequest {
  string request = 1;
}

message SayHelloResponse {
  string response = 1;
}

执行protoc --go_out=plugins=grpc:. *.proto生成代码,生成后的项目结构如下

image.png

实现接口

type SayHelloServiceImpl struct {
}

func (SayHelloServiceImpl) SayHello(ctx context.Context, req *say_hello.SayHelloRequest) (resp *say_hello.SayHelloResponse, err error) {
   resp = &say_hello.SayHelloResponse{}
   if req.Name == "" {
      return nil, errors.New("req name is invalid")
   }
   resp.HelloResponse = fmt.Sprintf("hello %s ~", req.Name)
   return
}

启动server

var port = 8888

func main() {
   server := grpc.NewServer()
   say_hello.RegisterSayHelloServiceServer(server, new(SayHelloServiceImpl))

   listen, err := net.Listen("tcp", fmt.Sprintf(":%d", port))
   if err != nil {
      panic(err)
   }

   if err := server.Serve(listen); err != nil {
      panic(err)
   }
}

client测试

var serverPort = 8888

func TestSayHello(t *testing.T) {
   conn, err := grpc.Dial(fmt.Sprintf(":%d", serverPort), grpc.WithInsecure())
   if err != nil {
      t.Fatal(err)
   }
   defer conn.Close()

   client := say_hello.NewSayHelloServiceClient(conn)

   req := &say_hello.SayHelloRequest{
      Name: "Tom",
   }
   resp, err := client.SayHello(context.Background(), req)
   if err != nil {
      t.Fatal(err)
   }
   t.Logf("resp: %s", resp.HelloResponse)
}

先启动server端,后指定客户端代码,终端会打印resp: hello Tom ~验证成功。