什么是 gRPC?
gRPC 的几种常见模式
在学习 gRPC 的时候,相信大家对于它的四种模式都有了解,我们来简单回顾一下:
-
简单模式(Simple RPC):这种模式最为传统,即客户端发起一次请求,服务端响应一个数据,这和大家平时熟悉的 RPC 没有什么大的区别,所以不再详细介绍。
-
服务端数据流模式(Server-side streaming RPC):这种模式是客户端发起一次请求,服务端返回一段连续的数据流。典型的例子是客户端向服务端发送一个股票代码,服务端就把该股票的实时数据源源不断的返回给客户端。如果是使用我们容器云功能的同学应该会发现,我们的容器实时日志流就是使用了这个典型模式。
-
客户端数据流模式(Client-side streaming RPC):与服务端数据流模式相反,这次是客户端源源不断地向服务端发送数据流,而在发送结束后,由服务端返回一个响应。典型的例子是物联网终端向服务器报送数据。
-
双向数据流模式(Bidirectional streaming RPC):顾名思义,这是客户端和服务端都可以向对方发送数据流,这个时候双方的数据可以同时互相发送,也就是可以实现实时交互。典型的例子是聊天机器人。
接下来我们通过一个小例子来看看 gRPC 具体的使用流程。
假设我们有一个聊天机器人,现需要增加一个对外提供服务的接口。具体需求为,接口传入参数是一个人名,返回一段内容是“Hello 人名”的音频。如果这个是让你在不使用 gRPC 的情况下,你会怎么做?大家可能会选择使用 restful api 来实现这个功能,传入人名,返回音频二进制数据。
那么如果使用 gRPC,我们需要怎么来设计呢?
第一步,需要定义一个接口文档,也就是 proto 文件。在定义内会定义一个 Service,接下来再在 Service 里定义一个 SayHello 的方法。下面定义传入参数,输入 name 返回 message,需要注意 message 是 bytes 类型,即返回的格式是二进制数据。对于 Golang 底层对应的是一个 bytes 数据,对于其他语言可能是字节流或二进制。
syntax = "proto3";
package helloworld;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message contain