NodeJS GRPC 多个 .proto 文件的处理步骤

 更新时间:2024年10月16日 10:04:53   作者:田猿笔记  
本文教程详细介绍了在NodeJS环境中如何使用gRPC框架处理多个.proto文件,步骤包括安装依赖、定义.proto文件、生成gRPC代码、实现服务器和客户端以及运行,适用于开发者在构建分布式应用时进行接口定义和服务实现

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 目录中生成以下文件:

service_a_pb.jsservice_b_pb.js

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

到此这篇关于NodeJS GRPC 多个 .proto 文件的文章就介绍到这了,更多相关NodeJS GRPC .proto 文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • node.js中的buffer.Buffer.isEncoding方法使用说明

    node.js中的buffer.Buffer.isEncoding方法使用说明

    这篇文章主要介绍了node.js中的buffer.Buffer.isEncoding方法使用说明,本文介绍了buffer.Buffer.isEncoding的方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下
    2014-12-12
  • 详解利用 Express 托管静态文件的方法

    详解利用 Express 托管静态文件的方法

    本篇文章主要介绍了详解利用 Express 托管静态文件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • pnpm的安装及其使用教程(汇总)

    pnpm的安装及其使用教程(汇总)

    pnpm是 Node.js 的替代包管理器,它是 npm 的直接替代品,速度更快、效率更高,它由 npm/yarn 衍生而来,但却解决了 npm/yarn 内部潜在的 bug,并且极大了地优化了性能,本文给大家介绍pnpm的安装及其使用,感兴趣的朋友一起看看吧
    2023-12-12
  • Node.js通过配置 strict-ssl=false解决npm安装卡住问题

    Node.js通过配置 strict-ssl=false解决npm安装卡住问题

    使用npm安装依赖包是常见的任务之一,有时会遇到安装卡住的问题,本文就来介绍一下通过配置 strict-ssl=false解决npm安装卡住问题,感兴趣的可以了解一下
    2024-12-12
  • Node.js(安装,启动,测试)

    Node.js(安装,启动,测试)

    这里主要介绍基于windows平台上最简单方便的安装方式,启动以及简单测试
    2014-06-06
  • 详解Node.js包的工程目录与NPM包管理器的使用

    详解Node.js包的工程目录与NPM包管理器的使用

    这篇文章主要介绍了Node.js包的工程目录与NPM包管理器的使用,可以帮助编程者更好地组织Node.js代码文件,需要的朋友可以参考下
    2016-02-02
  • 使用Node.js实现一个简单的命令行工具

    使用Node.js实现一个简单的命令行工具

    这篇文章主要为大家详细介绍了如何用 Node.js 实现一个简单的命令行工具,模仿常用的 ls 命令,包括其 -a 和 -l 参数的功能,感兴趣的可以了解下
    2024-11-11
  • nodejs使用express获取get和post传值及session验证的方法

    nodejs使用express获取get和post传值及session验证的方法

    这篇文章主要介绍了nodejs使用express获取get和post传值及session验证的方法,结合实例形式分析了nodejs使用express实现获取get和post传值及session验证功能的具体操作步骤与注意事项,需要的朋友可以参考下
    2017-11-11
  • node封装一个控制台进度条插件​​​​​​​详情

    node封装一个控制台进度条插件​​​​​​​详情

    这篇文章主要介绍了node封装一个控制台进度条插件​​​​​​​详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • node.js中fs.stat与fs.fstat的区别详解

    node.js中fs.stat与fs.fstat的区别详解

    fs.stat和fs.fstat他们都是用来获取文件的状态信息,下面这篇文章主要给大家介绍了关于node.js中fs.stat与fs.fstat区别的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06

最新评论