Go中使用grpc(一)| 青训营笔记

98 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第4天,今天我学习了go语言如何使用grpc。

准备工作

  • go语言环境(学go当然得有吧)
  • Protocol buffer windows安装的得下载release对应版本解压
  • protocol compiler plugins
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2

尤其是提一下第二点的Protocol buffer安装的问题,需要把下载的 protoc-21.12-win64.zip文件中的bin\protoc.exe文件放进GOPATH的bin中

编写.proto

下面是一个example

  • syntax是协议号,通常采用proto3
  • option go_package 是位置
  • package 是包名称
  • service定义服务
  • message定义消息体
syntax = "proto3";

option go_package = "./helloworld";

package helloworld;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

生成代码

我们在终端中根据以下指令的生成代码

protoc --go_out=. *.proto 
protoc --go-grpc_out=. *.proto 
  1. 第一行语句将生成.pb.go用于填充、序列化、反序列化的代码
  2. 第二行语句将生成_grpc.pb.go服务端需要实现的接口和客户端可以调用的方法

创建服务

简单来说,创建一个服务只需要,实现接口和监听请求

实现接口

新建一个struct,一定记得要引入UnimplementedGreeterServer,然后实现定义的接口SayHello。在SayHello函数中实现我们需要做的事情。

// server is used to implement helloworld.GreeterServer.
type server struct {
   pb.UnimplementedGreeterServer
}

// SayHello implements helloworld.GreeterServer
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
   log.Printf("Received: %v", in.GetName())
   return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
}

监听请求

  • net.Listen() 监听端口
  • grpc.NewServer() 创建gRPC服务
  • pb.RegisterGreeterServer() 注册服务实现者
func main() {
   flag.Parse()
   lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
   if err != nil {
      log.Fatalf("failed to listen: %v", err)
   }
   s := grpc.NewServer()
   pb.RegisterGreeterServer(s, &server{})
   log.Printf("server listening at %v", lis.Addr())
   if err := s.Serve(lis); err != nil {
      log.Fatalf("failed to serve: %v", err)
   }
}

执行代码

下面我们看看运行的效果,我们用一个客户端发起请求,看到服务端成功接收到了请求。

2023/01/18 21:59:36 server listening at [::]:50051
2023/01/18 21:59:53 Received: world

今天的学习就先到这里,预期将会持续三天,逐步理解grpc的使用和原理。