我们有以下设置 .
-
STM(Stingrey Traffic Manager)确实加载 balancer 会话粘性
-
Weblogic 'cluster'
-
由第三方工具处理的身份验证
因此,我不必担心有关水平扩展/运行应用程序的多个实例的会话 . STM / Weblogic集群确保后续请求来到同一个受管服务器 .
我们目前拥有的是单片应用程序,我们正在努力转向微服务 . 此外,我们不想离开当前的基础设施(即STM / Weblogic集群/ Auth工具) . 我们计划的是:
-
将WAR请求路由到其他微服务的Gateway WAR
-
N x每个功能子域的微服务(WAR)
-
只有API网关接收用户请求,并且无法从外部访问其他微服务
所以我的问题是
-
API网关应该是状态满的,而其他微服务是无状态的吗?
-
如果是这样,应该如何在API网关和微服务之间共享用户会话数据?
请建议任何更好的替代方案和资源/链接 . 谢谢 .
1 回答
让我分享一下我的看法 .
首先,如果你可以保持你的应用程序无状态,那么一定要这样做:)它将是性能和可扩展性方面的最佳解决方案 .
现在,如果它不可能,那么你应该维护一些分布式会话管理层 .
负责身份验证的网关可以生成一些唯一的会话标识符,以后可以将其用作密钥 . 此密钥可以传播到所有微服务,并成为API的一部分或其他东西 .
为了访问会话,微服务可以通过密钥“获取”值并使用它 .
在实现方面:我将看看NoSQL解决方案 . 其中一些可以满足您需求的是:
Redis . 在那里看看''hset''
Hazelcast . 它更像是一个内存网格,但如果解决方案只是java,你也可以实现所需的功能
Memcache.d . 它会给你一张旧的好 Map ,只是分发:)
我相信还有其他解决方案 .
现在,性能在这里至关重要,否则整个解决方案将会太慢 . 所以在我的理解中,使用RDBMS在这里并不好,而且可能更难以扩展它 .
希望这可以帮助