【问题标题】:How to send json messages between Node.js services inside a docker compose如何在 docker compose 内的 Node.js 服务之间发送 json 消息
【发布时间】:2020-11-17 14:26:45
【问题描述】:

假设我有两个 Node.js 服务在 docker compose 中运行。服务 A 监听 4000 端口,服务 B 监听 5000 端口。如何将 json 消息从服务 A 发送到 B(反之亦然)(使用 Express)?

【问题讨论】:

  • 至少有 1000 种可能的方法来做到这一点。这取决于你最喜欢什么。 redis、rabbitmq、主/从消息传递、tcp 广播、websocket 广播、udp 多播、udp 任播。所以……
  • 感谢您的这些建议。有没有使用 Express 的方法?

标签: javascript node.js express docker-compose


【解决方案1】:

通过一个简单的 docker-compose 文件,这两个服务可以使用它们的服务名称相互访问。这是由services: 下的顶级键定义的。在这个简单的示例中,服务one 可以与服务two 对话,只需将其寻址为http://two:5000。假设进程在内部侦听这些端口号,则使用http://one:4000 的另一个方向相同。两个容器也可以在内部侦听同一端口,因为它们具有不同的网络接口。确保不要在此处与本地主机(4444 和 5555)的端口映射混淆。

version: "3.8"
services:
  one:
    image: yourname/yourimage-one
    ports:
      - "4444:4000"
  two:
    image: yourname/yourimage-two
    ports:
      - "5555:5000"

更多高级设置,请参考docker-compose docs on networking。

我假设您在谈论使用 JSON 作为数据格式的 REST API。有很多方法可以做到这一点。 Express 本身用于构建服务器端,而不是客户端。您可以使用 shown in the nodejs docs 等标准 API 或多个第三方库之一来执行请求。例如,Axios 是一个非常流行的 http 请求库。也见one example for axios in the node docs。

在大多数情况下,双向使用 http 请求进行循环连接并不是一个好主意。也许两者中的一个可以充当生产服务,而另一个更像是消费服务?

【讨论】:

  • 这实际上是我想要的。我的场景如下:服务 A 收到来自客户端的消息,例如请求用户信息。由于服务 B 负责用户实体,服务 A 通过发送 id 请求 B 获取数据。服务 B 收到 id 并将请求的数据发送回 A。之后,A 将用户数据发送给客户端。所以A和B之间必须有一个循环。我需要A将带有id的json发送到url:port_from_B和B将用户数据作为json发送回url:port_from_A。 Axios 看起来像正确的库。谢谢!
  • 是的。这是从服务 A 到服务 B 的简单请求-响应,完全没问题。我指的是一种场景,除此之外,服务 B 还会主动向服务 A 请求。一种方法很好,也很常见。
猜你喜欢
  • 2019-10-10
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 2022-11-13
  • 2013-09-26
  • 1970-01-01
相关资源
最近更新 更多