微服务中的会话管理


问题内容

我们有以下设置。

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

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

我们目前拥有的是一个整体应用程序,并且我们正在尝试转向微服务。同样,我们也不会离开当前的基础架构(即STM / Weblogic集群/
Auth工具)。我们计划的是:

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

所以我的问题是

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

请提出任何更好的选择以及资源/链接。谢谢。


问题答案:

让我分享我的看法。

首先,如果您可以使应用程序保持无状态,则请务必采取以下措施:)就性能和可伸缩性而言,这将是最佳的解决方案。

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

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

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

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

  1. Redis。看看那里的“ hset”
  2. Hazelcast。它更像是一个内存网格,但是如果解决方案仅是Java,则还可以实现所需的功能
  3. Memcache.d。它会给你一张旧的好地图,只是散布的:)

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

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

希望这可以帮助