微服务中的会话管理

Session Management in microservices

我们有以下设置。

  1. STM(Stingrey 流量管理器)做负载均衡+会话粘性
  2. Weblogic 'cluster'
  3. 由第三方工具处理的授权

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

我们目前拥有的是单体应用程序,我们正在尝试转向微服务。我们也不想离开当前的基础设施(即 STM/Weblogic 集群/Auth 工具)。我们的计划是:

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

所以我的问题是

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

请提出更好的替代方案,并 resources/links。谢谢。

让我谈谈我的看法。

首先,如果你能让你的应用程序保持无状态,一定要这样做:) 这将是性能和可扩展性方面的最佳解决方案。

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

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

为了访问会话,微服务可以 'get' 键值并使用它。

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

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

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

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

希望对您有所帮助

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

是的,如 12 Factor App guide lines 所有服务都应该是无状态的。

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

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