【发布时间】:2020-08-06 11:54:07
【问题描述】:
要点
我有一个在基于微服务的架构(在 Kubernetes 上)上运行的应用程序。与应用程序外部的所有通信都通过 API 网关进行。
这只是意味着来自我的前端的请求不会直接发送到服务,而是必须通过网关。
动机
现在我需要实现一个需要在前端和内部服务之间进行实时通信的功能。但由于内部服务不对外暴露,我需要一种通过网关“路由”实时数据的方法。
我所有的服务都在 Node.js 上运行,这就是我想使用Socket.IO 来实现实时通信的原因。
问题
但是如何实现草图中的紫色双箭头呢?
所以通常前端客户端会连接到运行 Socket.IO 的服务器。但是在我的例子中,这个服务器(实时功能服务器)不能从客户端访问(而且永远不应该),这意味着客户端必须连接到网关。因此网关需要实现一些机制来将所有传入的消息路由到实时服务,反之亦然。
想法
(1) 让第二个 HTTP 服务器监听网关上的事件并将这些事件发送到实时服务器。在另一个方向上,实时服务器将向网关发送事件,然后网关将它们发送到前端。我认为这种方法肯定会奏效,但是将所有内容都发出两次似乎是多余的。而且肯定会影响性能?
(2) 使用 Socket.IO 适配器到“pass event between nodes”,这似乎是正确的方法,因为它用于“在进程或计算机之间传递消息”。但是由于缺乏文档/示例,我在入门时遇到了问题。我也没有使用Redis(是否需要使用适配器?)
(3) 使用 socket.io-emitter 包,这似乎不是一个好的选择,因为上次提交是在 3 年前。
(4) 别的?
【问题讨论】:
-
so 您必须使用 API 网关来重定向流量吗?我们在浇注应用程序中实现了 socket.io,但该服务已部署在单独的服务(pod)中。使用
ingress-controllerk8s 将socket流量发送到足球服务。 -
@GiorgioCerruti 不,我没有有使用网关,但这是我计划我的应用程序工作的方式。所以你会建议通过 Ingress 暴露我的“内部服务”?
-
我使用
nginx作为入口控制器。如果您愿意,也可以使用 haproxy。您将拥有 2 个服务(部署),1 个用于管理 HTTP(s) 请求,1 个用于管理套接字请求。使用入口,您可以公开路径并将流量重定向到正确的服务,例如每个命中/socket的请求都将被重定向到socket-service应用程序。 -
好吧,这听起来像是在尝试,因为我已经使用了 nginx Ingress。如果您可以发布一个展示如何实现它的答案,那就太棒了(这是我目前使用的入口配置:github.com/flolu/centsideas/blob/…)
标签: node.js sockets kubernetes socket.io microservices