SocketIO 与客户端和服务之间的网关通信?

flo*_*olu 10 sockets node.js socket.io kubernetes microservices

要旨

我有一个在基于微服务的架构(在 Kubernetes 上)上运行的应用程序。与应用程序外部的所有通信都通过API Gateway发生。

这只是意味着来自我前端的请求不会直接发送到服务,但它们必须通过网关。

动机

现在我需要实现一个需要在前端和内部服务之间进行实时通信的功能。但是由于内部服务没有对​​外公开,​​我需要一种通过网关“路由”实时数据的方法。

我所有的服务都在 Node.js 上运行,这就是我想使用Socket.IO来实现实时通信的原因。

建筑学

问题

但是如何从草图中实现紫色双箭头?

所以通常前端客户端会连接到运行 Socket.IO 的服务器。但在我的情况下,这个服务器(实时功能服务器)不能从客户端访问(并且永远不应该),这意味着客户端必须连接到网关。因此网关需要实现某种机制来将所有传入消息路由到实时服务,反之亦然。

想法

(1) 让第二个 HTTP 服务器侦听网关上的事件并将这些事件发送到实时服务器。在另一个方向,实时服务器将事件发送到网关,网关然后将它们发送到前端。我认为这种方法肯定会奏效,但是将所有内容发出两次似乎是多余的。它肯定会损害性能?

(2) 使用 Socket.IO 适配器“在节点之间传递事件”,这似乎是正确的方法,因为它用于“在进程或计算机之间传递消息”。但是由于缺乏文档/示例,我在入门时遇到了问题。我也没有使用 Redis(是否需要使用适配器?)

(3) 使用socket.io-emitter包,这似乎不是一个好的选择,因为上次提交是在 3 年前。

(4) 还有什么?

小智 0

由于内部服务不暴露于外部,因此我建议使用隧道。ngrok 是一个命令,用于通过任何 NAT 或防火墙向本地主机服务器提供即时且安全的 URL。如果您的服务器通过某个端口公开套接字服务,请使用ngrok创建一个反向代理来公开您可以连接到前端应用程序的世界。使用这个命令非常简单,下面是如何使用它的示例:

  1. 官网注册并下载ngrok文件
  2. 只需运行以下指令即可使其工作

    ./ngrok http 3000

  3. 要使其永久化,您必须创建一个服务并使用文件ngrok.yml以获得最佳配置。

这是官方文档这里