背景:
- 我们有多个由不同团队维护的微服务
- 大多数服务都是用Java编写的。但是有一个是用Node.js写的
- Node.js服务接口在
.proto
文件中定义,并与Node.js代码存储在同一个repo中
要求
- Node.js服务器现在需要调用另一个gRPC服务(定义为服务A(来获取一些值。为了进行gRPC调用,我需要首先加载服务定义
问题:
- 假设服务接口(
.proto
文件(是在服务A的repo中定义的,我应该如何将proto文件加载到我的Node.js应用程序中#Node.js#npm - 管理服务间通信的最佳方式是什么?我的Node.js服务器是否应该像客户端调用gRPC服务器一样调用其他服务
linux应答
1(既然服务接口(.proto文件(是在服务A的repo中定义的,我应该如何将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
然后您现在可以生成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服务器一样调用其他服务
答案是肯定的。这只是另一个微服务。