问题标签 [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.

0 投票
1 回答
357 浏览

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 调用。

0 投票
1 回答
1643 浏览

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 输出是这样的:

0 投票
0 回答
437 浏览

docker - Dockerizing gRPC 服务器(节点)问题:[错误:无法加载 gRPC 二进制模块,因为它不是为当前系统安装的]

每当我运行我的 docker 映像时,我都会收到关于节点的系统/架构之间不兼容的错误...

我试过这个命令:

但是问题依然存在...

这是我的文件以获取更多上下文:

完全错误在我尝试运行我的 docker 映像后

Dockerfile(运行我的 gRPC 节点服务器)

Booksserver.js (GRPC 服务器)

0 投票
1 回答
513 浏览

docker - Docker:如何从给定容器访问另一个容器中的文件?

基本上我有一个主目录和书籍目录(一般文件结构,还有更多,但这些是重要的部分)。因此,当我从 main 向 booksServer 发出请求时,它不起作用,因为缺少节点模块。

这是因为节点模块位于特定路径的 docker 容器内: '/usr/src/app'

我怎样才能让 main.js 看到书籍(服务/容器)在这个特定路径中确实有正确的节点包?

我想我可以使用 docker-compose,但我想在没有 docker-compose 的情况下单独测试它。

在 - 的里面

错误:

书籍 Dockerfile

主 DockerFile

0 投票
1 回答
399 浏览

docker - gRPC-Node 错误:位置 0 处 JSON 中的意外令牌 u

所以我不断收到这个“位置 0 的 JSON 中的意外令牌 u”错误。我目前正在从向客户 gRPC 服务器发出 gRPC 请求的主要发起方发出请求。

当我不将我的文件容器化并在每个目录中手动 npm install 包时,它可以顺利运行。但是,由于某种原因,当我将文件容器化时,它会出现这个问题。

通常这个问题发生在异步请求中(gRPC 是异步的,所以很有意义),我认为他们正在竞相完成,但永远不会这样做。但是 dockerFile 实际上是在做我正在手动做的事情(这有效......)

我现在只是不知道为什么会这样。

错误

文件结构

Docker 文件(全部)

0 投票
1 回答
625 浏览

docker - gRPC-node:当 *Dockerizing* 服务时,请求不通过服务的服务器?[包括截图]

我创建了一个非常简单的书店,其中包含书籍、客户和主要服务。这个特殊的问题涉及到 main 和 books 服务。

我目前正在发出一个名为“createBook”的 gRPC 请求,它会在我们的数据库中创建一本书,以及控制台日志。

在没有 docker 的情况下运行 gRPC 服务器(booksServer)时,该过程运行顺利。

但是一旦我使用 docker,gRPC 请求似乎没有进入 gRPC 服务器......

“使用 docker”是指使用 docker 来运行 booksServer。(如下所示)

结果:没有 Docker

在此处输入图像描述

图书服务器(没有 docker) 在此处输入图像描述

让我运行 booksServer(使用 docker)

(下面的Dockerfile)

在此处输入图像描述 在此处输入图像描述

这就是 booksServer.js 文件的样子 在此处输入图像描述

这是书根

这是 gRPC 服务器文件(带有绑定的端口)。

horus.js(定制的简单追踪工具),抓取追踪抓取某个请求的旅程并将其作为元数据发送回 gRPC 客户端

main.js(发起 gRPC 客户端请求)

我认为是什么问题。

0 投票
1 回答
47 浏览

grpc - 将文件从 file_pb.js 编译为 file.proto

我知道如何从编译file.protofile_pb.js使用此命令:

但是,我如何转换file_pb.jsfile.proto

0 投票
0 回答
649 浏览

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是节点服务+Koa
  • service 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 + GoREST与(我认为 gRPC 会更快)大致相当
  • grpc-node比慢 4 倍REST
  • 网络不是瓶颈
0 投票
1 回答
1646 浏览

javascript - proto-loader 无法加载具有依赖项的 .proto 文件

我正在尝试加载来自arduino-cli存储库的 .proto 文件。更具体地说,我正在加载commands.proto,它依赖于同一目录中的一些其他 .proto 文件。

在提供给 proto-loader 的加载选项中,我指定了所有这些 .proto 依赖项的路径,但会弹出一个错误,指出未定义在这些依赖项之一中定义的 proto 消息。

这是我的代码:

最后一行导致此错误:

BoardDetailsReq导致错误的消息在board.proto中定义,它包含includeDirs在我的options结构中。这不正确吗?如果发生此错误,我一定是做错了什么。

0 投票
1 回答
269 浏览

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'

有点奇怪。

软件包版本:

更新:

回购:https ://github.com/mrdulin/nodejs-grpc/tree/master/src