这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战
书接上文,我们继续实现剩余的两种方式–客户端流式 RPC、双向流式 RPC。
Client-side streaming RPC:客户端流式 RPC、
客户端流式 RPC,单向流,客户端通过流式发起多次 RPC 请求到服务端,服务端发起一次响应给客户端
Proto :
1 | go复制代码syntax = "proto3"; |
server:
1 | go复制代码package main |
如上,我们对每一个 Recv 都进行了处理,当发现 io.EOF (流关闭) 后,需要通过 stream.SendAndClose 方法将最终的响应结果发送给客户端,同时关闭正在另外一侧等待的 Recv。
client:
1 | go复制代码package main |
在 Server 端的 stream.CloseAndRecv,与 Client 端 stream.SendAndClose 是配套使用的方法。
开启服务器端,开启客户端。执行结果如下:
1 | go复制代码$ go run server.go |
1 | go复制代码$ go run client.go |
Bidirectional streaming RPC:双向流式 RPC
双向流式 RPC,由客户端以流式的方式发起请求,服务端也以流式的方式响应请求。
首个请求一定是 Client 发起,但具体交互方式(谁先谁后、一次发多少、响应多少、什么时候关闭)根据程序编写的方式来确定(可以结合协程)。
Proto :
1 | go复制代码syntax = "proto3"; |
server:
1 | go复制代码package main |
client:
1 | go复制代码package main |
服务端在循环中接收客户端发来的数据,如果遇到io.EOF表示客户端流被关闭,如果函数退出表示服
务端流关闭。生成返回的数据通过流发送给客户端,双向流数据的发送和接收都是完全独立的行为。需
要注意的是,发送和接收的操作并不需要一一对应,用户可以根据真实场景进行组织代码。
开启服务器端,开启客户端。执行结果如下:
1 | go复制代码$ go run server.go |
1 | go复制代码$ go run client.go |
本文转载自: 掘金