gRPC 介绍
gRPC(Google Remote Procedure Call)是一个高性能、开源的远程过程调用(RPC)框架,由 Google 开发。它基于 HTTP/2 协议,支持多种编程语言,能够高效地连接数据中心内和跨数据中心的服务,并提供可插拔的负载平衡、跟踪、健康检查和身份验证支持。
gRPC 生命周期1
一元 RPC
最简单的 RPC 类型,其中客户端发送单个请求并返回单个响应。
- 一旦客户端调用存根方法,就会通知服务器已使用客户端的此调用的元数据 、方法名称和指定的截止时间(如果适用)调用了 RPC。
- 然后,服务器可以立即发回自己的初始元数据(必须在任何响应之前发送),或者等待客户端的请求消息。哪个先发生,取决于应用程序。
- 服务器收到客户端的请求消息后,会执行创建和填充响应所需的所有工作。然后,响应会(如果成功)连同状态详细信息(状态代码和可选状态消息)以及可选尾随元数据一起返回给客户端。
- 如果响应状态为 OK,则客户端得到响应,从而完成客户端的调用。
服务器流式 RPC
服务器流式 RPC 与一元 RPC 类似,不同之处在于服务器会返回一串消息来响应客户端的请求。发送完所有消息后,服务器的状态详细信息(状态代码和可选状态消息)和可选尾随元数据将发送到客户端。这样就完成了服务器端的处理。客户端收到所有服务器消息后即完成。
客户端流式 RPC
客户端流式 RPC 与一元 RPC 类似,不同之处在于客户端向服务器发送的是一串消息,而不是单条消息。服务器通常会(但不一定)在收到所有客户端消息后,以单条消息(以及其状态详细信息和可选的尾随元数据)进行响应。
双向流式 RPC
在双向流式 RPC 中,调用由客户端调用方法和服务器接收客户端元数据、方法名称和截止时间发起。服务器可以选择发回其初始元数据或等待客户端开始流式传输消息。
客户端和服务器端的流处理是特定于应用程序的。由于这两个流是独立的,因此客户端和服务器可以按任何顺序读取和写入消息。例如,服务器可以等到收到客户端的所有消息后再写入其消息,或者服务器和客户端可以玩“乒乓球”——服务器收到请求,然后发回响应,然后客户端根据响应发送另一个请求,依此类推。
如何使用 gRPC
-
安装 gRPC
在项目中使用 gRPC,首先需要安装相关库。以下是 Node.js 的安装示例:
npm install grpc @grpc/proto-loader
-
定义服务
创建一个 .proto 文件,定义服务和消息格式。例如,创建一个 example.proto 文件:
syntax = "proto3";
package example;
// 定义服务
service Greeter {
// 定义方法
rpc SayHello (HelloRequest) returns (HelloResponse);
}
// 定义请求消息
message HelloRequest {
string name = 1;
}
// 定义响应消息
message HelloResponse {
string message = 1;
} -
生成代码
使用 gRPC 工具生成客户端和服务器端代码。
grpc_tools_node_protoc --proto_path=. --js_out=import_style=commonjs,binary:. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` example.proto
-
实现服务器
在服务器端实现定义的服务逻辑。例如,创建一个 server.js 文件:
const grpc = require('grpc');
const protoLoader = require('@grpc/proto-loader');
// 加载proto文件
const packageDefinition = protoLoader.loadSync('example.proto', {});
const exampleProto = grpc.loadPackageDefinition(packageDefinition).example;
// 实现服务逻辑
function sayHello(call, callback) {
callback(null, { message: `Hello, ${call.request.name}` });
}
// 启动gRPC服务器
const server = new grpc.Server();
server.addService(exampleProto.Greeter.service, { sayHello: sayHello });
server.bind('127.0.0.1:50051', grpc.ServerCredentials.createInsecure());
console.log('gRPC 服务器正在运行,端口: 50051');
server.start(); -
实现客户端
在客户端调用远程服务。例如,创建一个 client.js 文件:
const grpc = require('grpc');
const protoLoader = require('@grpc/proto-loader');
// 加载proto文件
const packageDefinition = protoLoader.loadSync('example.proto', {});
const exampleProto = grpc.loadPackageDefinition(packageDefinition).example;
// 创建客户端
const client = new exampleProto.Greeter('localhost:50051', grpc.credentials.createInsecure());
// 调用远程方法
client.sayHello({ name: 'World' }, (error, response) => {
if (!error) {
console.log('服务器响应:', response.message);
} else {
console.error('错误:', error);
}
});
在Hapydev 中调试 gRPC 接口
作为一款专业的接口调试工具,Hapydev 全面支持所有主流接口类型,并独家提供 gRPC 反射功能(截至目前,国内仅此一家 API 工具具备此特性)。
- 点击左侧的 + 按钮,轻点“新建 gRPC 接口”选项。
- 选择服务定义页签,选择服务类型“导入proto”, 导入定义 gRPC 接口所使用的服务、方法和消息的 .proto 文件。
- 支持通过服务反射加载方法列表
-
选择要发送的消息
您可以在请求区域内,点击使用示例数据,Hapydev 会根据您的 proto 描述信息自动生成符合规则的示例参数
-
调用 gRPC 服务
-
查看 gRPC 响应消息
响应窗格显示 gRPC 响应的消息列表,包括传入消息、传出消息和网络消息。