本文将说明如何在NodeJS应用程序的GRPC中使用流。
什么是gRPC中的流
gRPC中的流可帮助我们在单个RPC调用中发送消息流。
gRPC 的流式,分为三种类型:
- server-side streaming RPC:服务器端流式 RPC
- Client-side streaming RPC:客户端流式 RPC
- Bidirectional streaming RPC:双向流式 RPC
gRPC中的流使用场景
- 大规模数据包
- 实时场景
在本文中,我们将重点关注以下流:
- Server Streaming GRPC:在这种情况下,客户端向服务器发出单个请求,服务器将消息流发送回客户端。
- Client Streaming GRPC:在这种情况下,客户端将消息流发送到服务器。然后,服务器处理流并将单个响应发送回客户端。
Server Streaming gRPC
现在让我们为服务器流gRPC创建服务器和客户端代码。
创建 .proto 文件
创建一个名为proto的文件夹。在该文件夹中创建一个名为employee.proto的文件。将以下内容复制到employee.proto中:
syntax = "proto3";
package employee;
service Employee {
rpc paySalary (EmployeeRequest) returns (stream EmployeeResponse) {}
}
message EmployeeRequest {
repeated int32 employeeIdList = 1;
}
message EmployeeResponse{
string message = 1;
}
请参阅我的grpc基础文章,以了解有关.proto文件和协议缓冲区的更多信息。
在这里,我们创建一个名为paySalary的rpc,它接受EmployeeRequest作为请求并发送EmployeeResponse流作为响应。我们使用关键字流来指示服务器将发送消息流。
上面也定义了EmployeeRequest和EmployeeResponse。 repeate关键字表示将发送数据列表。
在此示例中,paySalary的请求将是员工ID的列表。服务器将通过一条消息流做出响应,告知是否已向员工支付薪水。
为服务器创建虚拟数据
创建一个名为data.js的文件,并将以下代码复制到其中。
//Hardcode some data for employees
let employees = [{
id: 1,
email: "abcd@abcd.com",
firstName: "First1",
lastName: "Last1"
},
{
id: 2,
email: "xyz@xyz.com",
firstName: "First2",
lastName: "Last2"
},
{
id: 3,
email: "temp@temp.com",
firstName: "First3",
lastName: "Last3"
},
];
exports.employees = employees;
我们将其用作服务器的数据源。
创建Server
创建一个名为server.js的文件。将以下代码复制到server.js中
const PROTO_PATH = __dirname + '/proto/employee.proto';
const grpc = require('grpc');
const protoLoader = require('@grpc/proto-loader');
let packageDefinition = protoLoader.loadSync(
PROTO_PATH,
{
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true
});
let employee_proto = grpc.loadPackageDefinition(packageDefinition)
接下来,将以下代码片段添加到server.js中
let { paySalary } = require('./pay_salary.js');
function main() {
let server = new grpc.Server();
server.addService(employee_proto.Employee.service,
{ paySalary: paySalary }
);
server.bind('0.0.0.0:4500', grpc.ServerCredentials.createInsecure());
server.start();
}
main();
在上面的脚本中,我们将启动GRPC Server并将Employee Service和paySalary实现一起添加到其中。
但是paySalary函数在pay