微服务中的会话管理
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/…以上是关于微服务中的会话管理的主要内容,如果未能解决你的问题,请参考以下文章