问题标签 [grpc-node]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
microservices - grpc-node:如何进行服务内请求&有没有服务内请求的例子?
假设您有 2 项服务:书籍和客户。假设客户想要收藏一本书。因此客户可能会向下一个服务发出 gRPC 请求。您如何准确地从一个服务到另一个服务进行 RPC 调用。
这是网络上唯一的例子。似乎表明了这一点,但问题是他们使用 golang 来进行服务内请求(作为客户端),并使用 grpc-node 作为服务器。是否有 grpc-node 从另一个服务对 grpc-node 服务器进行客户端 RPC 调用的示例?
结帐服务文件: https ://github.com/GoogleCloudPlatform/microservices-demo/blob/master/src/checkoutservice/main.go 原始文件: https ://github.com/GoogleCloudPlatform/microservices-demo/blob/master/ pb/demo.proto
目前,我假设在一个共享的 proto 文件中会有 2 个服务,并且在客户端文件中,客户端会使用另一个服务的组件调用 RPC 调用。
node.js - 无法将 GRPC 微服务与客户端连接 - 在 k8s 上嵌套 JS 节点
我目前坚持在 kubernetes 中连接 clusterIp 服务。主要目标是使用 grpc 连接一个 pod(微服务)和使用 node 连接另一个 pod(客户端)。我正在使用服务名称来公开并连接到微服务产品-微服务,但是在尝试调用客户端上的微服务时出现此错误。
我查看了我创建的 docker 映像,它指向此地址 url:'0.0.0.0:50051'
但无法正常工作,因为本文建议https://kubernetes.io/blog/2018/11/07/grpc-load-balancing-on-kubernetes-without -tears/
到目前为止,我只有一个用于产品的微服务,其中包含管理产品的逻辑,并且是使用 node-js 和 grpc 开发的(本地运行完美)。xxx-microservice-products-deployment
我在 k8s 中命名并包含它们的定义如下所示:
然后为了连接到它们,我们创建了一个带有 a 的服务,clusterIp
它暴露了50051
,它们在 k8s 中的定义如下所示:
现在,我们也在节点中创建了一个客户端,其中包含在 (get,post)
后台与微服务建立连接的 api 方法。我命名了客户端xxx-api-main-app-deployment
,它们在 k8s 中的定义如下所示:
另外,我创建了一个服务来导出 api,它们的 k8s 定义如下所示:
直到这里,一切看起来都很好。因此,我尝试与服务建立连接,但出现此错误
我没有发现任何有用的东西让它工作。有人有任何线索吗?
因此,在深入研究了该问题的解决方案后,我发现 kubernetes 团队建议使用linkerd
将连接从字面上转换为 http,因为 k8s 在这种情况下不起作用。所以我跟着这篇文章https://kubernetes.io/blog/2018/11/07/grpc-load-balancing-on-kubernetes-without-tears/,然后我去linkerd
指南并按照安装步骤。现在我能够看到linkeird
仪表板,但无法与客户端进行微服务通信。因此,我尝试检查端口是否在客户端 pod 中公开,因此,我使用以下命令进行验证:
这是输出:
如您所见,存在包含服务端口的 env 变量,因为这是有效的。我没有使用 IP 直接,因为当我扩展部署以拥有更多资源时它不会工作。然后,我验证我的微服务正在使用:
这是输出:
一切看起来都不错。然后我重新验证我在代码上使用的端口:
- 微服务
- 客户:
然后,我决定检查linkerd
为客户端运行的 pod 内的日志。
kubectl logs pod/xxx-api-main-app-deployment-5fb5d4bf9f-ttwn5 -c linkerd-init
输出是这样的:
docker - Dockerizing gRPC 服务器(节点)问题:[错误:无法加载 gRPC 二进制模块,因为它不是为当前系统安装的]
每当我运行我的 docker 映像时,我都会收到关于节点的系统/架构之间不兼容的错误...
我试过这个命令:
但是问题依然存在...
这是我的文件以获取更多上下文:
完全错误在我尝试运行我的 docker 映像后
Dockerfile(运行我的 gRPC 节点服务器)
Booksserver.js (GRPC 服务器)
docker - Docker:如何从给定容器访问另一个容器中的文件?
基本上我有一个主目录和书籍目录(一般文件结构,还有更多,但这些是重要的部分)。因此,当我从 main 向 booksServer 发出请求时,它不起作用,因为缺少节点模块。
这是因为节点模块位于特定路径的 docker 容器内: '/usr/src/app'
我怎样才能让 main.js 看到书籍(服务/容器)在这个特定路径中确实有正确的节点包?
我想我可以使用 docker-compose,但我想在没有 docker-compose 的情况下单独测试它。
在 - 的里面
错误:
书籍 Dockerfile
主 DockerFile
docker - gRPC-Node 错误:位置 0 处 JSON 中的意外令牌 u
所以我不断收到这个“位置 0 的 JSON 中的意外令牌 u”错误。我目前正在从向客户 gRPC 服务器发出 gRPC 请求的主要发起方发出请求。
当我不将我的文件容器化并在每个目录中手动 npm install 包时,它可以顺利运行。但是,由于某种原因,当我将文件容器化时,它会出现这个问题。
通常这个问题发生在异步请求中(gRPC 是异步的,所以很有意义),我认为他们正在竞相完成,但永远不会这样做。但是 dockerFile 实际上是在做我正在手动做的事情(这有效......)
我现在只是不知道为什么会这样。
错误
文件结构
Docker 文件(全部)
docker - gRPC-node:当 *Dockerizing* 服务时,请求不通过服务的服务器?[包括截图]
我创建了一个非常简单的书店,其中包含书籍、客户和主要服务。这个特殊的问题涉及到 main 和 books 服务。
我目前正在发出一个名为“createBook”的 gRPC 请求,它会在我们的数据库中创建一本书,以及控制台日志。
在没有 docker 的情况下运行 gRPC 服务器(booksServer)时,该过程运行顺利。
但是一旦我使用 docker,gRPC 请求似乎没有进入 gRPC 服务器......
“使用 docker”是指使用 docker 来运行 booksServer。(如下所示)
结果:没有 Docker
让我运行 booksServer(使用 docker)
(下面的Dockerfile)
这是书根
这是 gRPC 服务器文件(带有绑定的端口)。
horus.js(定制的简单追踪工具),抓取追踪抓取某个请求的旅程并将其作为元数据发送回 gRPC 客户端
main.js(发起 gRPC 客户端请求)
我认为是什么问题。
grpc - 将文件从 file_pb.js 编译为 file.proto
我知道如何从编译file.proto
到file_pb.js
使用此命令:
但是,我如何转换file_pb.js
为file.proto
protocol-buffers - nodejs + grpc-node 服务器比 REST 慢得多
我已经实现了 2 个服务 A 和 B,其中 A 可以通过 gRPC(在 Mali 中使用 grpc-node)和纯 HTTP REST 调用与 B 对话。
请求大小可以忽略不计。
响应大小为 1000 个项目,如下所示:
A 和 B 都作为服务部署在 GKE 中,它们使用 kube-proxy 通过内部网络进行通信。
我发现 REST 版本比 gRPC 快很多。REST 调用的 p99 小于 1 秒,而 gRPC 的 p99 可以超过 30 秒。
细节
节点版本和操作系统:node:14.7.0-alpine3.12
依赖项:
我什至通过设置 gRPC 选项创建了客户端 TCP 池grpc.use_local_subchannel_pool=1
,但这似乎没有帮助。
问题似乎出在服务器端,正如我从日志中看到的那样,grpc lib 的call.startBatch
调用花费了很多秒来发送大小约为 51kb 的数据。这比 REST 版本慢得多。
我还检查了服务的 CPU 和网络是否健康。REST 版本可以发送 > 2mbps,而 gRPC 版本仅管理 ~150kbps。
在服务 B 上运行netstat
(在 gRPC 中)显示了许多 ESTABLISHED TCP 连接(正如预期的那样,因为 TCP 池)。
我怀疑 grpc-core C++ 代码在某种程度上不如 REST 最佳,但我没有证据。
有什么想法我接下来应该看看吗?感谢您的帮助
更新 1
以下是一些基准:
设置
Blazemeter --REST--> services A --gRPC/REST--> service B
- 请求正文(两个滞后)可以忽略不计
service A
是节点服务+Koaservice B
有3个选项:grpc-node
: 带有 grpc-node 的节点gRPC + Go
: 同一个 gRPC 服务的 Go 实现REST + Koa
: 带有 Koa 的节点
Blazemeter --> service A
:响应负载可以忽略不计,所有测试都相同serivce A --> service B
:gRPC/REST 响应负载为 1000 个ProductPrice
:
这些服务在 GCP 中部署到 Kubernetes,
- 实例类型:
n1-highcpu-4
- 每个服务 5 个 pod
- 2 个 CPU,每个 pod 1 GB 内存
- kube-proxy 使用集群 IP(不通过互联网)(我也测试了 headless with
clusterIP: None
,得到了类似的结果)
加载
50rps
结果
使用 grpc-node 的服务 B
使用 Go gRPC 的服务 B
使用 REST 和 Koa 的服务 B
网络 IO
观察
gRPC + Go
REST
与(我认为 gRPC 会更快)大致相当grpc-node
比慢 4 倍REST
- 网络不是瓶颈
javascript - proto-loader 无法加载具有依赖项的 .proto 文件
我正在尝试加载来自arduino-cli存储库的 .proto 文件。更具体地说,我正在加载commands.proto,它依赖于同一目录中的一些其他 .proto 文件。
在提供给 proto-loader 的加载选项中,我指定了所有这些 .proto 依赖项的路径,但会弹出一个错误,指出未定义在这些依赖项之一中定义的 proto 消息。
这是我的代码:
最后一行导致此错误:
BoardDetailsReq
导致错误的消息在board.proto中定义,它包含includeDirs
在我的options
结构中。这不正确吗?如果发生此错误,我一定是做错了什么。
node.js - 动态codegen和静态codegen的包导入路径不同
这是src
我的项目目录的结构:
share/user.proto
:
topic/topic.proto
:
如您所见,我尝试导入share
包并UserBase
在消息类型中使用消息Topic
类型。当我尝试启动服务器时,出现错误:
Type .topic.Topic 中没有这样的 Type 或 Enum 'share.UserBase'
但是当我将包导入路径更改为相对路径时import "../share/user.proto";
。它工作正常并获得服务器日志:Server is listening on http://localhost:3000
.
以上是动态codegen的用法。
现在,我切换到使用静态代码生成,这是生成代码的 shell 脚本:
似乎协议缓冲区编译器不支持相对路径,出现错误:
而且,我将包导入路径改回import "share/user.proto";
. 它正确生成了代码,但是当我尝试启动服务器时,出现了同样的错误:
Type .topic.Topic 中没有这样的 Type 或 Enum 'share.UserBase'
有点奇怪。
软件包版本:
更新: