当前位置:网站首页>多语言通信基础 06 go实现grpc的四种数据流模式实现
多语言通信基础 06 go实现grpc的四种数据流模式实现
2022-04-23 14:41:00 【一越王超】
grpc的数据传输模式有多种:
- 简单模式:客户端发起一次请求,服务端响应一次数据,和普通的rpc没有区别。
- 服务端数据流模式:客户端发起一次请求,服务端返回一段连续的数据流。典型的例子是客户端发给服务端一个股票代码,服务端将该股票的数据实时不断的返回给客户端。还有我们常用的订阅场景也属于服务端流模式。
- 客户端数据流模式。与服务端数据流模式相反,由客户端源源不断的像服务端发送数据流,发送结束后,由服务端返回一个响应。典型的例子是物联网终端像服务器报送数据。
- 双向数据流模式:客户端和服务端可以向双方实时发送数据流进行交互,典型应用是聊天机器人,即时通信工具等。
propto文件
各种模式的proto文件内容如下:
syntax = "proto3";
option go_package = ".;proto"; // 指明当前目录
service Greeter {
rpc GetStream(StreamReqData)returns(stream StreamResData); //服务端流模式
rpc PutStream(stream StreamReqData)returns(StreamResData); //客户端流模式
rpc Al1Stream(stream StreamReqData)returns(stream StreamResData); //双向流模式
}
message StreamReqData {
string data = 1;
}
message StreamResData {
string data = 1;
}
serve服务端程序
服务端必须实现proto中的三个函数。
package main
import (
"OldPackageTest/stream_grpc_test/proto"
"fmt"
"google.golang.org/grpc"
"net"
"sync"
"time"
)
const PORT = ":50052"
type server struct {
}
// 服务端流模式
func (s *server) GetStream(req *proto.StreamReqData, res proto.Greeter_GetStreamServer) error {
i := 0
for {
i++
_ = res.Send(&proto.StreamResData{
Data: fmt.Sprintf("%v", time.Now().Unix()),
})
time.Sleep(time.Second)
if i > 10 {
break
}
}
return nil
}
// 客户端流模式
func (s *server) PutStream(cliStr proto.Greeter_PutStreamServer) error {
for {
if a, err := cliStr.Recv(); err != nil {
fmt.Println(err)
break
} else {
fmt.Println(a.Data)
}
}
return nil
}
// 双向流模式
func (s *server) AllStream(allStr proto.Greeter_AllStreamServer) error {
wg := sync.WaitGroup{}
wg.Add(2)
go func() {
defer wg.Done()
for {
data, _ := allStr.Recv()
fmt.Println("收到客户端消息:" + data.Data)
}
}()
go func() {
defer wg.Done()
for {
_ = allStr.Send(&proto.StreamResData{Data: "我是服务器"})
time.Sleep(time.Second)
}
}()
wg.Wait()
return nil
}
func main() {
lis, err := net.Listen("tcp", PORT)
if err != nil {
panic(err)
}
s := grpc.NewServer()
proto.RegisterGreeterServer(s, &server{})
err = s.Serve(lis)
if err != nil {
panic(err)
}
}
client客户端程序
package main
import (
"context"
"fmt"
"sync"
"time"
"google.golang.org/grpc"
"OldPackageTest/stream_grpc_test/proto"
)
func main() {
conn, err := grpc.Dial("localhost:50052", grpc.WithInsecure())
if err != nil {
panic(err)
}
defer conn.Close()
//服务端流模式
c := proto.NewGreeterClient(conn)
res, _ := c.GetStream(context.Background(), &proto.StreamReqData{Data: "慕课网"})
for {
a, err := res.Recv() //如果大家懂socket编程的话就明白 send recv
if err != nil {
fmt.Println(err)
break
}
fmt.Println(a.Data)
}
//客户端流模式
putS, _ := c.PutStream(context.Background())
i := 0
for {
i++
_ = putS.Send(&proto.StreamReqData{
Data: fmt.Sprintf("慕课网%d", i),
})
time.Sleep(time.Second)
if i > 10 {
break
}
}
//双向流模式
allStr, _ := c.AllStream(context.Background())
wg := sync.WaitGroup{}
wg.Add(2)
go func() {
defer wg.Done()
for {
data, _ := allStr.Recv()
fmt.Println("收到客户端消息:" + data.Data)
}
}()
//1. 集中学习protobuf, grpc
go func() {
defer wg.Done()
for {
_ = allStr.Send(&proto.StreamReqData{Data: "慕课网"})
time.Sleep(time.Second)
}
}()
wg.Wait()
}
版权声明
本文为[一越王超]所创,转载请带上原文链接,感谢
https://yiyuewangchao.blog.csdn.net/article/details/124338828
边栏推荐
- 自动化的艺术
- Interviewer: let's talk about the process of class loading and the mechanism of class loading (parental delegation mechanism)
- 2-GO variable operation
- SVN详细使用教程
- LM317的直流可调稳压电源Multisim仿真设计(附仿真+论文+参考资料)
- Using MATLAB programming to realize the steepest descent method to solve unconstrained optimization problems
- 一款不错的工具:aardio
- OC 转 Swift 条件编译、标记、宏、 Log、 版本检测、过期提示
- Svn detailed use tutorial
- MySQL报错packet out of order
猜你喜欢
随机推荐
pnpm安装使用
八路抢答器系统51单片机设计【附Proteus仿真、C程序、原理图及PCB文件、元器件清单和论文等】
I thought I could lie down and enter Huawei, but I was confused when I received JD / didi / iqiyi offers one after another
C语言p2选择分支语句详解
AT89C52 MCU frequency meter (1Hz ~ 20MHz) design, LCD1602 display, including simulation, schematic diagram, PCB and code, etc
Achievements in science and Technology (21)
Use of ansible and common modules
The art of automation
初始c语言大致框架适合复习和初步认识
Proteus simulation design of DC adjustable regulated power supply (with simulation + paper and other data)
ASEMI三相整流桥和单相整流桥的详细对比
Electronic perpetual calendar of DS1302_ 51 single chip microcomputer, month, day, week, hour, minute and second, lunar calendar and temperature, with alarm clock and complete set of data
自动化的艺术
直流可调稳压电源的Proteus仿真设计(附仿真+论文等资料)
async void 导致程序崩溃
拼接hql时,新增字段没有出现在构造方法中
编程哲学——自动加载、依赖注入与控制反转
do(Local scope)、初始化器、内存冲突、Swift指针、inout、unsafepointer、unsafeBitCast、successor、
The initial C language framework is suitable for review and preliminary understanding
数组模拟队列进阶版本——环形队列(真正意义上的排队)