固定链接 从零开始搭建 gRPC 服务 – Golang 篇(二)

从零开始搭建 gRPC 服务 – Golang 篇(二)

从零开始搭建 gRPC 服务 – Golang 篇(二)

从零开始搭建 gRPC 服务 – Golang 篇(一)中介绍了如何搭建 gRPC 环境并构建一个简单的 gRPC 服务,本文将介绍 gRPCstreaming

流式 RPC

gRPC 基于标准的 HTTP/2 进行传输,可以方便的实现 streaming 功能。要在 gRPC 中使用 streaming,只需要在 proto 中在请求或响应前加上 stream 即可。

服务端流式 RPC:Server-side streaming RPC

客户端向服务器发送请求并获取流以读取消息序列;客户端从返回的流中读取,直到没有更多消息; gRPC 保证单个 RPC 调用中的消息排序。

从零开始搭建 gRPC 服务 – Golang 篇(一)中的 helloworld.proto 中增加接口 LotsOfReplies

编译 .proto 文件

此时生成的代码就已经包含了流的处理,在使用上需要注意:服务器端代码的实现要通过流的方式发送响应。

编写 server.go

如上代码所示,服务端在接收到请求后通过 stream 返回了 10 个响应。

编写 client.go

客户端从 stream 中读取到若干响应,直到读到 EOF 结束。

运行 gRPC 服务

打开两个会话窗口,在其中之一执行:

在另一个会话窗口运行:

客户端流式 RPC:Client-side streaming RPC

客户端再次使用提供的流写入一系列消息并将其发送到服务器;一旦客户端写完消息,它就等待服务器读取它们并返回它的响应; gRPC 保证在单个 RPC 调用中的消息排序。

改写 helloworld.proto ,增加 LotsOfGreetings

编写 server.go

服务端通过 stream 接收到若干请求,直到读到 EOF 后再返回响应。

编写 client.go

客户端通过 stream 发起 10 个请求,然后关闭 stream 并接收响应。

运行 gRPC 服务

打开两个会话窗口,在其中之一执行:

在另一个会话窗口运行:

双向流式 RPC:Bidirectional streaming RPC

双方使用读写流发送一系列消息,这两个流独立运行,因此客户端和服务器可以按照他们喜欢的顺序进行读写:例如服务器可以在写入响应之前等待接收所有客户端消息,或者它可以交替读取消息然后写入消息,或其他一些读写组合;gRPC 保证在单个 RPC 调用中的消息排序。

改写 helloworld.proto ,增加 BidiHello

编写 server.go

服务端从 stream 中读取到请求后立即返回。

编写 client.go

客户端从标准输出接收输入,然后通过 stream 发送请求,另一个 goroutine 则不断从 stream 中接收响应。

运行 gRPC 服务

打开两个会话窗口,在其中之一执行:

在另一个会话窗口运行:

本文作者:任立翔

您的留言将激励我们越做越好