微服务中的会话管理

Posted

技术标签:

【中文标题】微服务中的会话管理【英文标题】:Session Management in microservices 【发布时间】:2015-12-20 21:00:06 【问题描述】:

我们有以下设置。

    STM(Stingrey 流量管理器)执行负载平衡 + 会话粘性 Weblogic“集群” 由第三方工具处理的身份验证

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

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

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

所以我的问题是

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

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

【问题讨论】:

您使用的是分布式缓存吗?这就是我目前管理类似场景的方式。缓存中的身份验证令牌 - 当然,您需要缓存条目的唯一 ID,任何需要进入缓存的微服务都知道。 感谢@Nio。我没有使用分布式缓存,但可以考虑。您如何生成身份验证令牌?您需要一个 OAuth 服务器吗?另外,您使用的分布式缓存是什么?如果您有任何链接,请分享链接以供我参考。 Fahim,我同时使用 memcached 和 Redis 进行缓存。如果您不确定哪个,我会选择 Redis。有很多方法可以管理 Auth 令牌。 OAuth 是一种标准化的方式,尽管它有一些学习曲线可以让您了解 Grant 流程,但在您的简历中添加它是值得的。有大量使用 Java 实现 OAuth 服务器的示例google.co.uk/… 【参考方案1】:

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

是的,就像12 Factor App guide lines 一样,所有服务都应该是无状态的。

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

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

【讨论】:

【参考方案2】:

让我谈谈我的看法。

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

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

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

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

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

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

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

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

希望对你有帮助

【讨论】:

谢谢。您能否分享任何链接以供参考? 好吧,我想我已经解释了机制,无论如何,快速谷歌搜索显示:blog.cloudmagic.com/2014/02/18/… 和这个:***.com/questions/10278683/…

以上是关于微服务中的会话管理的主要内容,如果未能解决你的问题,请参考以下文章

快速了解会话管理三剑客cookiesession和JWT

Next.js 中的会话管理

Java 会话管理的最佳选择

Zookeeper - 会话管理和事务处理

会话管理1-Token

JavaWeb基础—会话管理之Cookie