Golang grpc 服务端流模式

流模式定义
流模式需要stream标识,由于实现服务端流效果,所以返回结果使用stream标识
//stream.proto
syntax = "proto3";

option go_package = "./;streampb";

message StreamReqData{
  string data = 1;
}

message StreamResData{
  string data = 1;
}

//流需要stream 标识
service Greeter {
  rpc  GetStream(StreamReqData) returns (stream StreamResData);
}
生成代码
 protoc -I . stream.proto --go_out=plugins=grpc:.
服务端实现
流程和一元rpc差不多,唯一的区别是入参多了一个参数(Greeter_GetStreamServer),该参数有send方法发送数据

Greeter_GetStreamServer 名字是proto中 rpc中声明的服务名 + “_” + rpc方法名 + server
package main

import (
	streampb "Study/Four/pro"
	"fmt"
	"google.golang.org/grpc"
	"net"
	"time"
)

type service struct {
}

func (s *service) GetStream(req *streampb.StreamReqData, res streampb.Greeter_GetStreamServer) error {
	count := 0
	for {
		time.Sleep(time.Second)
		count++
		res.Send(&streampb.StreamResData{
			Data: fmt.Sprintf("data:%s,time:%d", req.Data, count),
		})
	}
}

func main() {
	server := grpc.NewServer()
	streampb.RegisterGreeterServer(server, &service{})
	listen, _ := net.Listen("tcp", ":8088")
	server.Serve(listen)
}

客户端实现
使用也和一元rpc差不多,唯一的区别是返回的类型,流模式下返回的res提供Recv获取数据
package main

import (
	streampb "Study/Four/pro"
	"context"
	"fmt"
	"google.golang.org/grpc"
)

func main() {
	dial, _ := grpc.Dial(":8088", grpc.WithInsecure())
	client := streampb.NewGreeterClient(dial)
	stream, _ := client.GetStream(context.Background(), &streampb.StreamReqData{
		Data: "let's go",
	})

	for {
		if res, err := stream.Recv(); err == nil {
			fmt.Println(res)
		}
	}
}

运行结果

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值