stream流模式简介
- 流模式就是与简单模式对应的,支持个服务之间并发的进行数据交互与收发。他一共有三种基本形式——客户端流模式、服务端流模式、双向流模式。
- 客户端流模式:就是客户端并发的向服务端发送数据,而服务端不停的接收数据而不可以并发向客户端发送数据。
- 服务端流模式:就和客户端流模式相反。
- 双向流模式:就是客户端和服务端都在并发的向另一端发送和接收数据。
proto文件的定义
- 如果服务需要支持流模式,那么在定义proto文件时就需要使用stream关键定义,protoc才会帮我们生成对应的流模式使用的方法。
syntax = "proto3";
option go_package = ".;proto";
/*
grpc的流模式一共有三种,其实就是把客户端还有服务端的消息,变成流的形式传输
*/
service Greeter {
rpc GetStream(StreamReqData) returns (stream StreamResData); //服务端流模式
rpc PutStream(stream StreamReqData) returns (StreamResData); //客户端流模式
rpc AllStream(stream StreamReqData) returns (stream StreamResData); //双向流模式
}
message StreamReqData {
string data = 1;
}
message StreamResData {
string data = 1;
}
客户端流模式
- 我们查看protoc帮我们生成的文件中定义好的PutStream函数来获取流模式传输方式,
func (c *greeterClient) PutStream(ctx context.Context, opts ...grpc.CallOption) (Greeter_PutStreamClient, error) {
stream, err := c.cc.NewStream(ctx, &_Greeter_serviceDesc.Streams[1], "/Greeter/PutStream", opts...)
if err != nil {
return nil, err
}
x := &greeterPutStreamClient{
stream}
return x, nil
}
type Greeter_PutStreamClient interface {
Send(*StreamReqData) error
CloseAndRecv() (*StreamResData, error)
grpc.ClientStream
}
type greeterPutStreamClient struct {
grpc.ClientStream
}
func (x *greeterPutStreamClient) Send(m *StreamReqData) error {
return x.ClientStream.SendMsg(m)
}
- 客户端:通过GreeterClient连接去调用PutStream函数。
func onlyClientStream(cli proto.GreeterClient) {
putS, err := cli.PutStream(context.Background())
if err != nil {
panic(err)
}
i := 0
for {
i++
putS.Send(&proto.StreamReqData{
Data: fmt.Sprintf("LLL%v", i)})
if i > 10 {
break
}
time.Sleep(time.Second)
}
}
func main() {
conn, err := grpc.Dial("127.0.0.1:50052", grpc.WithTransportCredentials(insecure.NewCredentials()))
if err