gRPC 的流模式有三种:
- 客户端流模式,客户端向服务端发送多条消息,发送完毕后等待服务端返回结果。这可用于数据上报等场景。
- 服务端流模式,客户端向服务端发送一条消息,服务端向客户端返回多条消息。这可用于服务端向客户端推送消息的场景,比如实时发送股票行情。
- 双向流模式,客户端和服务端都向对方发送多条消息。你可能会在聊天应用中使用到这种模式。
下面我们来实现相关代码。
proto 文件定义
首先,我们来编写 proto 文件,定义相关接口。我们在下面的示例中实现一个简单的 calculator 功能,分别实现加法、求平均值、生成多个随机数三种方法,分别使用客户端流、服务端流、双向流模式。
syntax = "proto3";
package proto;
option go_package = "git.gqnotes.com/guoqiang/grpcexercises/calculator/pb";
service CalculateService {
// 求和-客户端流式
rpc Sum(stream SumRequest) returns(SumResponse) {}
// 生成一定数量的随机数-服务端流式
rpc RandomNums(RandomNumsRequest) returns(stream RandomNumsResponse) {}
// 双向流式求平均值
rpc Average(stream AverageRequest) returns(stream AverageResponse) {}
}
message SumRequest {
int64 num =1;
}
message SumResponse {
int64 total = 1;
}
message RandomNumsRequest {
int64 num =1;
}
message RandomNumsResponse {
int64 num = 1;
}
message AverageRequest {
int64 num =1;
}
message AverageResponse {
float average = 1;
}
生成相关代码
我们修改一下 Makefile 文件,添加如下代码:
calculator-gen:
protoc -Icalculator/proto/ --go_out=./calculator --go_opt=module=git.gqnotes.com/guoqiang/grpcexercises/calculator --go-grpc_out=./calculator --go-grpc_opt=module=git.gqnotes.com/guoqiang/grpcexercises/calculator calculator/proto/*.proto
执行 make calculator-gen,生成相关代码。
编写服务端代码
我们在 server 目录下新建相关 go 文件,编写服务端代码。我们先来实现 Sum 方法,代码如下:
package main
import (
"git.gqnotes.com/guoqiang/grpcexercises/calculator/pb"
"io"
)
// Sum 计算和-客户端流式
func (s *Server) Sum(stream pb.CalculateService_SumServer) error {
var sum int64
for {
req, err := stream.Recv()
if err == io.EOF {
break
}
if err != nil {
return err
}
sum += req.Num
}
if err := stream.SendAndClose(&pb.SumResponse{
Total: sum}); err != nil {