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 Express安装与使用教程

    Node.js Express安装与使用教程

    Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,这篇文章主要介绍了Node.js Express安装与使用教程,非常具有实用价值,需要的朋友可以参考下
    2018-05-05
  • 最流行的Node.js精简型和全栈型开发框架介绍

    最流行的Node.js精简型和全栈型开发框架介绍

    这篇文章主要介绍了最流行的Node.js精简型和全栈型开发框架介绍,本文讲解了Express.js、KOA、Total.js、Sails.js、Meteor、Mean.IO等框架,需要的朋友可以参考下
    2015-02-02
  • nvm mac 环境搭建过程

    nvm mac 环境搭建过程

    这篇文章主要为大家介绍了nvm mac 环境搭建过程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • 解决Mac下安装nmp的淘宝镜像失败问题

    解决Mac下安装nmp的淘宝镜像失败问题

    今天小编就为大家分享一篇解决Mac下安装nmp的淘宝镜像失败问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • npm install常见错误类型及对应的解决方案

    npm install常见错误类型及对应的解决方案

    在前端开发中,npm是最常用的包管理工具,通过 npm install 命令,开发者可以轻松地安装项目所需的依赖包,然而,在实际使用过程中,npm install 可能会因为各种原因而报错,本文将详细介绍一些常见的 npm install 错误类型、发生原因及其对应的解决方案,需要的朋友可以参考下
    2025-03-03
  • 浅析 NodeJs 的几种文件路径

    浅析 NodeJs 的几种文件路径

    本篇文章主要介绍了浅析 NodeJs 的几种文件路径,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 如何解决安装websocket还是报错Cannot find module'ws'问题

    如何解决安装websocket还是报错Cannot find module'ws&apos

    这篇文章主要介绍了如何解决安装websocket还是报Cannot find module'ws'问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • 使用Node.js配合Nginx实现高负载网络

    使用Node.js配合Nginx实现高负载网络

    这篇文章主要介绍了使用Node.js配合Nginx实现高负载网络,Node的异步加上Nginx的反向代理在性能上实在是给力!需要的朋友可以参考下
    2015-06-06
  • Node.js使用Playwright自动化测试页面性能

    Node.js使用Playwright自动化测试页面性能

    对于现在的网站而言,性能的重要性不言而喻,本文将使用Playwright自动化测试页面性能,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-11-11
  • Node.js实现一个HTTP服务器的方法示例

    Node.js实现一个HTTP服务器的方法示例

    这篇文章主要介绍了Node.js实现一个HTTP服务器的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05

最新评论