【问题标题】:Websockets in microservices architecture微服务架构中的 Websocket
【发布时间】:2018-05-12 16:41:21
【问题描述】:

假设我们有一个通知服务,它从消息队列中读取一个事件并实时通知所有 Web 客户端。我知道 Web 套接字是如何工作的,但是当在两者之间有一个 API 网关时,我感到困惑,然后如何在客户端、API 网关和通知服务之间维护 Web 套接字连接。

请帮忙!谢谢

编辑: 建筑学:

【问题讨论】:

  • 我想您知道来自浏览器的传入 webSocket 连接需要连接到 webSocket 服务器。因此,如果您想向通过 webSocket 服务器连接的一个或多个客户端发送消息,那么您必须要求 webSocket 服务器代表您执行此操作。如果您的通知服务是其他一些微服务,那么它需要知道如何向 webSocket 服务器发送一条消息,使其发送您想要的通知。
  • 您将 API 网关这个术语视为标准术语,我们会确切地知道它是什么。不是,我们也不是。如果您需要更多帮助,那么您将不得不更详细地描述您的架构是如何工作的,您拥有哪些流程,请求如何通过各种流程,webSockets 的连接位置等等......
  • 感谢您的回复。但我指的 API 网关是在微服务架构的上下文中。 microservices.io/patterns/apigateway.html
  • 我很怀疑,当您仅引用此类通用术语而不显示您的特定架构时,人们能否为您提供帮助。您的通知服务需要联系维护 webSocket 连接的任何进程。如何做到这一点完全取决于您的特定架构。
  • 我用非常基本的架构编辑了问题。希望对你有帮助

标签: web-applications websocket microservices api-gateway


【解决方案1】:

网络套接字

客户端打开的 websocket 连接最终必须连接到 websocket 服务器。

API 网关

API 网关的工作是接受来自客户端的传入 websocket 连接并将其正确路由到 websocket 服务器。 API 网关将从客户端 websocket 发送的所有数据重定向到正确的后端服务,并将始终保持连接。

一切如何协同工作...

您的问题的根源是“如何让具有 websocket 连接的客户端从通知服务接收实时更新?”。最简单的答案是在通知服务上启动一个 websocket 服务器,让每个客户端连接到 API 网关,然后让 API 网关将流量路由到通知服务。

  • 客户端 API 网关 通知服务

更进一步...

如果客户对转换来自通知服务的数据有进一步的要求,那么您可以:

  1. 将该业务逻辑填充到通知服务中(不推荐)。
  2. 或者,添加另一个具有API网关和通知服务之间转换逻辑的服务,称为Backends for Frontends微服务设计模式(推荐):
    • 客户端 API 网关 通知服务器(转换逻辑) 通知服务。
  3. 或者,如果您选择的 API 网关旨在保存业务逻辑和转换数据;将转换逻辑直接放在 API 网关中。

【讨论】:

  • 如果 Api Gateway 不支持 websockets 路由怎么办?例如 Netflix Zuul
  • 看起来 Netflix Zuul 2 支持 websockets,但我不确定它是否是一个成熟的代理。如果您的 API 网关不支持 websocket,那么您可以将另一台服务器添加到支持的基础架构(例如 Nginx)。然而,这将大大增加复杂性。我建议您尝试找出 API 网关的本机功能以获取实时消息,或者选择支持您所需功能的其他 API 网关。
  • 这对许多微服务有什么作用?假设客户端需要接收由 5 个不同服务在内部处理的更新,这是否意味着客户端现在必须保持 5 个 Websocket 连接对 API 网关开放?每个微服务一个连接?
  • 如果客户端需要接收来自许多不同(内部)微服务的更新,那么如何构建它真的取决于您。您可以让客户端打开多个 websocket 连接,或者您可以组合 websockets(与内部的另一个微服务),以便客户端只打开一个连接。您个人需要权衡做出这些基础设施决策的权衡,否则在开发的某个点之后将变得困难或不可能继续前进。如果您无法考虑这些决定,那么只需选择一个,看看结果如何。
【解决方案2】:

您不应该混淆这些概念。 API 网关对您的客户端隐藏了您的基础设施。在“前端的后端”的意义上,它可以是许多服务的单个前端。它还可以负责许多其他事情,例如身份验证。

Web 套接字服务器可以与您的 API 网关并行运行。另一个域或另一个端口。假设您使用像http://nchan.io 这样的网络套接字服务器。来自您的应用程序的事件通过您的消息代理或您使用的任何消息传递集成模式。消费者可以获取这些事件并通过 Nchan 服务器发布它们。客户端(例如浏览器)连接到 Nchan 服务器并会收到有关事件的通知。

【讨论】:

  • 我的困惑是通知客户端将通过 API 网关或直接发送给客户端。据我了解,最初将通过 API 网关建立连接,然后所有通信将直接在通知服务器和客户端之间进行。
  • 如果客户想要在 API 网关后面请求您的服务,他们会通过您的 API 网关。客户端可以直接与您的 Web Socket 服务器对话。最初不需要调用 API 网关。用户在与 Web Socket 服务器通信之前是否应该进行身份验证?我们可能需要有关您当前设置以及您尝试过的内容的更多信息。
  • 所以对于一个应用程序,比如说一个游戏,你几乎完全通过 websockets 进行通信,websocket 服务器本质上是在扮演 API 网关的角色?因为您仍然有 websocket 服务器需要与之通信的微服务。
【解决方案3】:

2 年后遇到这个问题,我怀疑 OP 是否仍在解决这个问题,但对于我自己和未来的访问者,我建议:

API 网关是一个或多个客户端进入系统的主要入口点(如果使用后端换前端模式,则可以使用多个网关)。 WebSocket 客户端/服务器适用于这些客户端中的一个或多个,但独立于 API 网关。每个客户端都将保持与 WebSocket 服务器的单独连接。在您的应用程序及其服务中,每当一个事件发布到您的消息代理时,WebSocket 服务器将订阅所有需要通知的事件,并将这些消息转发回每个连接的客户端。由 WebSocket 服务器决定哪些客户端应该接收给定的通知,或者由 WebSocket 客户端决定它是否应该处理给定的通知或忽略它(或两者都取决于逻辑所在的位置)。

【讨论】:

    猜你喜欢
    • 2015-12-26
    • 2021-11-02
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 2016-11-23
    • 2018-03-29
    相关资源
    最近更新 更多