gRPC节点服务器:如何从其他Git存储库加载protobuf文件?

时间:2018-10-29 23:44:09

标签: node.js npm protocol-buffers grpc grpc-node

背景:

  • 我们有由不同团队维护的多种微服务
  • 大多数服务都是用Java编写的。但是有一个用Node.js编写的
  • Node.js服务接口在.proto文件中定义,并与Node.js代码存储在同一存储库中。

要求

  • Node.js服务器现在需要调用另一个gRPC服务(定义为服务A)以获取一些值。为了进行gRPC调用,我需要首先加载服务定义。

问题:

  • 鉴于服务接口(.proto文件)是在服务A的存储库中定义的,应如何将原型文件加载到Node.js应用程序中? #Node.js #npm
  • 管理服务间通信的最佳方法是什么?我的Node.js服务器应该像客户端调用gRPC服务器一样调用其他服务吗?

1 个答案:

答案 0 :(得分:1)

一个Linux答案

1)鉴于服务A的存储库中定义了服务接口(.proto文件),应如何将原型文件加载到我的Node.js应用中?

在开发环境中,指向protobuf文件夹中proto目录的符号链接就足够了。

让我给你一个例子。假设您在2个存储库和

中有protobuf文件

count.proto

syntax = "proto3";
package count.proto;
import "math/math.proto";
**Your proto code here**

math.proto

syntax = "proto3";
package math.proto
**Your proto code here this just contains messages no servies**

它们在各自的目录中。

<path_to_repo_a>/proto/math/math.proto
<path_to_repo_b>/proto/count/count.proto

现在,您可以做一个符号链接到nodejs应用程序的根目录(package.json在其中)。

ln -s <path_to_repo_a>/proto repo_a_proto
ln -s <path_to_repo_b>/proto repo_b_proto

然后,您现在可以生成原始文件。在您的根目录中运行

mkdir -p generated_proto/math
mkdir -p generated_proto/count
// This command below is just to generate messages
protoc --proto_path=./repo_a_proto/ --js_out=import_style=commonjs,binary:generated_proto ./repo_a_proto/math/math.proto
// This generate both the messages and services
protoc --proto_path=./repo_b_proto/ -I./repo_a_proto/  --js_out=import_style=commonjs,binary:proto_ts --grpc_out=generated_proto/ --plugin=protoc-gen-grpc=`which grpc_node_plugin`  ./repo_b_proto/count/count.proto

这只是翻译成插件binary的路径。 https://github.com/grpc/grpc-node

which grpc_node_plugin 

在生产环境中,这将是您使用诸如teamcity或jenkins之类的ci / cd工具注入文件夹的方式。现在您完成了。

管理服务间通信的最佳方法是什么?我的Node.js服务器应该像客户端调用gRPC服务器一样调用其他服务吗?

答案是肯定的。这只是另一个微服务。