微服务中的会话管理

2022-09-01 15:45:12

我们有以下设置。

  1. STM(Stingrey Traffic Manager)执行负载平衡+会话粘性
  2. Weblogic 'cluster'
  3. 由第三方工具处理的身份验证

因此,我不必担心与水平扩展/运行应用程序的多个实例有关的会话。STM/ Weblogic 集群确保后续请求到达同一受控服务器。

我们目前拥有的是一个整体式应用程序,我们正试图迁移到微服务。此外,我们不想搬出当前的基础设施(即STM / Weblogic集群/ Auth工具)。我们的计划是:

  1. 将请求路由到其他微服务的网关 WAR
  2. N x 每个功能子域的微服务 (WAR)
  3. 只有 API 网关接收用户请求,其他微服务无法从外部访问

所以我的问题是

  1. API 网关是否应该处于状态,而其他微数据包是无状态的?
  2. 如果是这样,API 网关和微服务之间应如何共享用户会话数据?

请建议任何更好的替代方案和资源/链接。谢谢。


答案 1

让我分享我的意见。

首先,如果您可以保持应用程序无状态,请务必这样做:)在性能和可扩展性方面,这将是最佳解决方案。

现在,如果不可能,那么您应该维护一些分布式会话管理层。

负责身份验证的网关可以生成一些唯一的会话标识符,这些标识符以后可以用作密钥。此密钥可以传播到所有微服务,并成为 API 或其他内容的一部分。

为了访问会话,微服务可以按键“获取”值并使用它。

在实现方面:我会看看NoSQL解决方案。其中一些可以满足您的需求的是:

  1. 雷迪斯。看看那里的“hset”
  2. 黑兹尔卡斯特。它更像是一个内存网格,但如果解决方案只是java,你也可以实现所需的功能。
  3. 它会给你一个旧的好地图,只是分发:)

我相信还有其他解决方案。

现在,性能在这里至关重要,否则整个解决方案将太慢。因此,在我的理解中,使用RDBMS在这里并不好,而且可能更难扩展它。

希望这有帮助


答案 2

1)API网关应该是状态满的,而其他微服务是无状态的吗?

是的,与12因素应用程序指南中一样,所有服务都应该是无状态的。

2)如果是这样,API网关和微服务之间应该如何共享用户会话数据?

API 应该是无状态的,因此不要将会话状态共享给微服务。建议的方法是设置 Redis 缓存来存储会话数据。

enter image description here


推荐