2

背景:

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

要求

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

问题:

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

1 回答 1

3

一个linux的答案

1)鉴于服务接口(.proto 文件)是在服务 A 的 repo 中定义的,我应该如何将 proto 文件加载到我的 Node.js 应用程序中?

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

让我给你举个例子。假设您在 2 个存储库中有 protobuf 文件,并且

计数.proto

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

数学.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

然后您现在可以生成 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

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

which grpc_node_plugin 

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

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

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

于 2018-10-30T05:53:43.260 回答