NodeJS GPRC 多个 .proto 文件

1. 安装依赖

首先,确保你已经安装了 grpc-toolsgrpc_tools_node_protoc_ts

npm install grpc-tools grpc_tools_node_protoc_ts --save-dev

2. 定义 .proto 文件

假设我们有两个 .proto 文件:service_a.protoservice_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 目录中生成以下文件:

  1. service_a_pb.jsservice_b_pb.js

    • 包含 Protocol Buffers 消息的定义和序列化/反序列化逻辑。
    • 定义了 .proto 文件中声明的消息类型,并提供了相应的 getter 和 setter 方法。
  2. service_a_grpc_pb.jsservice_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

猜你喜欢

转载自blog.csdn.net/canduecho/article/details/142924162