grpc介绍

在正式介绍 gRPC 之前,我们先简单介绍一下什么是 RPC,它是 Remote Procedure Call 的缩写,中文译为远程过程调用(也可译为远程方法调用或远程调用),它是计算机通信协议,该协议可以实现调用远程服务就像调用本地服务一样简单,无需关心跨网络,跨平台,跨语言等问题。

gRPC 是通信协议基于 HTTP/2,支持多语言的 RPC 框架,使用 Protobuf 作为它的接口设计语言(IDL),可以通过 protoc 工具生成 Golang 语言的结构体,服务端接口和客户端 Stub。

gRPC 消息序列化方式通常使用 Protobuf,它是二进制格式,体积小,网络传输快,占用带宽流量少,调用性能更高,但是可读性差。不过,gRPC 也支持 JSON 序列化方式。

怎么使用 gRPC 定义服务端

gRPC 默认使用 Protobuf 作为接口设计语言,我们可以在 .proto 文件中使用 service 关键字定义服务,使用 rpc 和 returns 关键字定义指定请求参数和返回结果的方法。

示例代码:

service User {
	rpc Login (LoginRequest) returns (LoginResponse);
}
message LoginRequest {
	string email = 1;
	string password = 2;
}
message LoginResponse {
	int64 id = 1;
	string name = 2;
}

阅读上面这段代码,我们使用 Protobuf 接口设计语言定义了一个一元 RPC 服务,即客户端向服务端发送一个请求,服务端向客户端返回一个响应。

此外,gRPC 还支持另外三种定义服务的方式,即服务器流式 RPC、客户端流式 RPC 和双向流式 RPC。

gRPC 提供了 Protobuf 编译器插件 protoc-gen-grpc,用于编译 .proto 文件,生成服务端和客户端代码,我们只需在服务端编写实现 Api 的代码,然后在客户端调用 Api。

怎么使用 gRPC 的客户端

我们通过 protoc 编译 .proto 文件,自动生成服务端和客户端代码后,我们如果想要使用 gRPC 的客户端,还需要手动编写客户端代码,也就是在服务端实现 Api 的业务逻辑代码,然后在客户端调用 Api,具体如下:
在服务端,手动编写生成的服务端方法的业务逻辑代码,然后运行 gRPC 服务,接收并处理客户端请求,gRPC 服务自动解码请求参数,然后执行服务的方法,并将返回结果自动进行编码。
在客户端,Stub (也称为存根或客户端)实现和服务相同的方法,然后客户端可以本地调用这些方法,将请求参数封装在 Protobuf 的消息类型中,gRPC 将请求发送给服务器,并返回服务器的 Protobuf 序列化方式的响应消息。