grpc的stream流模式

本文介绍了gRPC的stream流模式,包括客户端流模式、服务端流模式和双向流模式。客户端流模式允许客户端并发向服务端发送数据,服务端接收但不并发回传;服务端流模式则相反。双向流模式中,客户端和服务端都能同时发送和接收数据。在proto文件中使用`stream`关键字定义流模式,并通过protoc生成相应方法。客户端通过连接调用流模式函数,服务端通过实现接口处理流数据。
摘要由CSDN通过智能技术生成

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函数来获取流模式传输方式,
//这个就是我们客户端需要使用的传输数据的方法,这里会返回一个流模式用的结构Greeter_PutStreamClient,之后就是使用他的Send()函数来并发的传输流数据
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函数。
//onlyClientStream 客户端的流模式
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 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值