这是我参与「第五届青训营 」笔记创作活动的第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
- 第一行语句将生成
.pb.go用于填充、序列化、反序列化的代码 - 第二行语句将生成
_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的使用和原理。