当前位置:网站首页>多语言通信基础 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
边栏推荐
- 编程哲学——自动加载、依赖注入与控制反转
- [servlet] detailed explanation of servlet (use + principle)
- OpenFaaS实战之四:模板操作(template)
- PCIe X1 插槽的主要用途是什么?
- epoll 的 ET,LT工作模式———实例程序
- 《JVM系列》 第七章 -- 字节码执行引擎
- PWM speed regulation control system of DC motor based on 51 single chip microcomputer (with complete set of data such as Proteus simulation + C program)
- 单相交交变频器的Matlab Simulink建模设计,附Matlab仿真、PPT和论文等资料
- 【工厂模式详解】工厂方法模式
- QT actual combat: Yunxi chat room
猜你喜欢
Branch statement of process control
A good tool: aardio
阿里研发三面,面试官一套组合拳让我当场懵逼
Find daffodils - for loop practice
剑指 Offer II 019. 最多删除一个字符得到回文(简单)
Interviewer: let's talk about the process of class loading and the mechanism of class loading (parental delegation mechanism)
机器学习之逻辑回归(Logistic Regression)原理讲解和实例应用,果断收藏
[detailed explanation of factory mode] factory method mode
SVN详细使用教程
QT interface optimization: QT border removal and form rounding
随机推荐
async void 导致程序崩溃
三、梯度下降求解最小θ
Find daffodils - for loop practice
Basic regular expression
Use of ansible and common modules
Proteus simulation design of four storey and eight storey elevator control system, 51 single chip microcomputer, with simulation and keil c code
MQ-2和DS18B20的火灾温度-烟雾报警系统设计,51单片机,附仿真、C代码、原理图和PCB等
编程哲学——自动加载、依赖注入与控制反转
C语言知识点精细详解——初识C语言【1】——你不能不知的VS2022调试技巧及代码实操【2】
Design of single chip microcomputer Proteus for temperature and humidity monitoring and alarm system of SHT11 sensor (with simulation + paper + program, etc.)
全连接层的作用是什么?
8.5 循环神经网络简洁实现
1N5408-ASEMI整流二极管1N5408
单相交交变频器的Matlab Simulink建模设计,附Matlab仿真、PPT和论文等资料
本以为能躺着进华为,结果陆续收到京东/滴滴/爱奇艺offer的我迷茫了
直流可调稳压电源的Proteus仿真设计(附仿真+论文等资料)
面试官:说一下类加载的过程以及类加载的机制(双亲委派机制)
I/O复用的高级应用之一:非阻塞 connect———使用 select 实现(也可以用 poll 实现)
Detailed explanation of C language P2 selection branch statement
一个月把字节,腾讯,阿里都面了,写点面经总结……