1. 安装依赖
首先,确保你已经安装了 grpc-tools
和 grpc_tools_node_protoc_ts
:
npm install grpc-tools grpc_tools_node_protoc_ts --save-dev
2. 定义 .proto
文件
假设我们有两个 .proto
文件:service_a.proto
和 service_b.proto
。
-
service_a.proto
:syntax = "proto3"; package myproject; service ServiceA { rpc Method1 (Request1) returns (Response1) {} rpc Method2 (Request2) returns (Response2) {} } message Request1 { string name = 1; } message Response1 { string message = 1; } message Request2 { string name = 1; } message Response2 { string message = 1; }
-
service_b.proto
:syntax = "proto3"; package myproject; service ServiceB { rpc Method3 (Request3) returns (Response3) {} rpc Method4 (Request4) returns (Response4) {} } message Request3 { string name = 1; } message Response3 { string message = 1; } message Request4 { string name = 1; } message Response4 { string message = 1; }
3. 生成 gRPC 代码
使用 npx grpc_tools_node_protoc
生成 gRPC 代码,并指定输出目录:
npx grpc_tools_node_protoc --js_out=import_style=commonjs,binary:./generated --grpc_out=grpc_js:./generated --proto_path=. service_a.proto
npx grpc_tools_node_protoc --js_out=import_style=commonjs,binary:./generated --grpc_out=grpc_js:./generated --proto_path=. service_b.proto
生成文件解释
运行上述命令后,将在 ./generated
目录中生成以下文件:
-
service_a_pb.js
和service_b_pb.js
:- 包含 Protocol Buffers 消息的定义和序列化/反序列化逻辑。
- 定义了
.proto
文件中声明的消息类型,并提供了相应的 getter 和 setter 方法。
-
service_a_grpc_pb.js
和service_b_grpc_pb.js
:- 包含 gRPC 服务的客户端和服务器端的接口定义。
- 定义了服务的方法,并提供了用于调用这些方法的客户端和服务器端的代码。
4. 实现服务器
创建 server.js
文件,包含服务的实现:
const grpc = require('@grpc/grpc-js');
const serviceAProto = require('./generated/service_a_grpc_pb');
const serviceAMessages = require('./generated/service_a_pb');
const serviceBProto = require('./generated/service_b_grpc_pb');
const serviceBMessages = require('./generated/service_b_pb');
function method1(call, callback) {
const reply = new serviceAMessages.Response1();
reply.setMessage('Response from Method1: ' + call.request.getName());
callback(null, reply);
}
function method2(call, callback) {
const reply = new serviceAMessages.Response2();
reply.setMessage('Response from Method2: ' + call.request.getName());
callback(null, reply);
}
function method3(call, callback) {
const reply = new serviceBMessages.Response3();
reply.setMessage('Response from Method3: ' + call.request.getName());
callback(null, reply);
}
function method4(call, callback) {
const reply = new serviceBMessages.Response4();
reply.setMessage('Response from Method4: ' + call.request.getName());
callback(null, reply);
}
function main() {
const server = new grpc.Server();
server.addService(serviceAProto.ServiceAService, {
method1: method1, method2: method2 });
server.addService(serviceBProto.ServiceBService, {
method3: method3, method4: method4 });
server.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => {
server.start();
});
}
main();
5. 实现客户端
创建 client.js
文件,包含客户端的实现:
const grpc = require('@grpc/grpc-js');
const serviceAProto = require('./generated/service_a_grpc_pb');
const serviceAMessages = require('./generated/service_a_pb');
const serviceBProto = require('./generated/service_b_grpc_pb');
const serviceBMessages = require('./generated/service_b_pb');
function main() {
const clientA = new serviceAProto.ServiceAClient('localhost:50051', grpc.credentials.createInsecure());
const clientB = new serviceBProto.ServiceBClient('localhost:50051', grpc.credentials.createInsecure());
const request1 = new serviceAMessages.Request1();
request1.setName('World');
clientA.method1(request1, (err, response) => {
if (err) console.error(err);
else console.log('Response from Method1:', response.getMessage());
});
const request3 = new serviceBMessages.Request3();
request3.setName('World');
clientB.method3(request3, (err, response) => {
if (err) console.error(err);
else console.log('Response from Method3:', response.getMessage());
});
}
main();
6. 运行服务器和客户端
确保你已经安装了所有必要的依赖:
npm install @grpc/grpc-js
然后,分别运行服务器和客户端:
node server.js
node client.js