我们有以下设置。
- STM(Stingrey 流量管理器)做负载平衡 + session 粘性
- Weblogic“集群”
- 由第三方工具处理的授权
因此,我不必担心与水平缩放/运行应用程序的多个实例有关的 session 。 STM/Weblogic 集群确保后续请求到达同一托管服务器。
我们目前拥有的是单体式应用程序,我们正在尝试转向微服务。我们也不想离开当前的基础设施(即 STM/Weblogic 集群/Auth 工具)。我们的计划是:
- 将请求路由到其他微服务的网关 WAR
- N x 每个功能子域的微服务 (WAR)
- 只有API网关接收用户请求,其他微服务无法从外部访问
所以我的问题是
- API 网关是否应该是全状态的,而其他微服务是无状态的?
- 如果是这样,用户 session 数据应如何在 API 网关和微服务之间共享?
请同时建议任何更好的替代方案和资源/链接。谢谢。
最佳答案
说说我的看法。
首先,如果您可以让您的应用程序保持无状态,请务必这样做 :) 就性能和可扩展性而言,这将是最佳解决方案。
现在,如果不可能,那么您应该维护一些分布式 session 管理层。
负责身份验证的网关可以生成一些唯一的 session 标识符,以后可以将其用作 key 。 这个 key 可以传播到所有微服务,并成为 API 或其他东西的一部分。
为了访问 session ,微服务可以通过键“获取”值并使用它。
在实现方面:我会看一下 NoSQL 解决方案。其中一些可以满足您的需要:
- Redis .看看那里的“hset”
- Hazelcast .它更像是一个内存网格,但如果解决方案仅是 java,您还可以实现所需的功能
- Memcache.d .它会给你一张旧的好 map ,刚刚分发:)
我相信还有其他解决方案。
现在,性能在这里至关重要,否则整个解决方案将太慢。因此,据我所知,在这里使用 RDBMS 并不好,而且可能更难将其扩展。
希望对你有帮助
关于java - 微服务中的 session 管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32741333/