微服务中的会话管理
Session Management in microservices
我们有以下设置。
- STM(Stingrey 流量管理器)做负载均衡+会话粘性
- Weblogic 'cluster'
- 由第三方工具处理的授权
因此,我不必担心有关水平缩放的会话/运行 应用程序的多个实例。 STM/Weblogic 集群确保后续请求到达同一托管服务器。
我们目前拥有的是单体应用程序,我们正在尝试转向微服务。我们也不想离开当前的基础设施(即 STM/Weblogic 集群/Auth 工具)。我们的计划是:
- 网关 WAR 将请求路由到其他微服务
- N x 每个功能子域的微服务 (WAR)
- 只有API网关接收用户请求,其他微服务无法从外部访问
所以我的问题是
- API 网关应该是全状态的,而其他微服务是无状态的吗?
- 如果是这样,用户会话数据应该如何在 API 网关和微服务之间共享?
请提出更好的替代方案,并 resources/links。谢谢。
让我谈谈我的看法。
首先,如果你能让你的应用程序保持无状态,一定要这样做:)
这将是性能和可扩展性方面的最佳解决方案。
现在,如果不可能,那么您应该维护一些分布式会话管理层。
负责身份验证的网关可以生成一些唯一的会话标识符,以后可以将其用作密钥。
此密钥可以传播到所有微服务,并成为 API 或其他内容的一部分。
为了访问会话,微服务可以 'get' 键值并使用它。
在实施方面:我会看一下 NoSQL 解决方案。其中一些可以满足您的需要是:
- Redis。看看那里的“'hset'”
- Hazelcast。它更像是一个内存网格,但如果解决方案只是 java,您还可以实现所需的功能
- Memcache.d。它会给你一张旧的好地图,刚刚分发:)
我相信还有其他解决方案。
现在,性能在这里至关重要,否则整个解决方案将太慢。所以根据我的理解,在这里使用 RDBMS 并不好,而且可能更难扩展它。
希望对您有所帮助
1)API网关应该是state-full而其他微服务是无状态的吗?
是的,如 12 Factor App guide lines 所有服务都应该是无状态的。
2)如果是这样,用户会话数据应该如何在API网关和微服务之间共享?
您的 API 应该是无状态的,因此不要将会话状态共享给微服务。推荐的方法是设置 Redis 缓存来存储会话数据。
我们有以下设置。
- STM(Stingrey 流量管理器)做负载均衡+会话粘性
- Weblogic 'cluster'
- 由第三方工具处理的授权
因此,我不必担心有关水平缩放的会话/运行 应用程序的多个实例。 STM/Weblogic 集群确保后续请求到达同一托管服务器。
我们目前拥有的是单体应用程序,我们正在尝试转向微服务。我们也不想离开当前的基础设施(即 STM/Weblogic 集群/Auth 工具)。我们的计划是:
- 网关 WAR 将请求路由到其他微服务
- N x 每个功能子域的微服务 (WAR)
- 只有API网关接收用户请求,其他微服务无法从外部访问
所以我的问题是
- API 网关应该是全状态的,而其他微服务是无状态的吗?
- 如果是这样,用户会话数据应该如何在 API 网关和微服务之间共享?
请提出更好的替代方案,并 resources/links。谢谢。
让我谈谈我的看法。
首先,如果你能让你的应用程序保持无状态,一定要这样做:) 这将是性能和可扩展性方面的最佳解决方案。
现在,如果不可能,那么您应该维护一些分布式会话管理层。
负责身份验证的网关可以生成一些唯一的会话标识符,以后可以将其用作密钥。 此密钥可以传播到所有微服务,并成为 API 或其他内容的一部分。
为了访问会话,微服务可以 'get' 键值并使用它。
在实施方面:我会看一下 NoSQL 解决方案。其中一些可以满足您的需要是:
- Redis。看看那里的“'hset'”
- Hazelcast。它更像是一个内存网格,但如果解决方案只是 java,您还可以实现所需的功能
- Memcache.d。它会给你一张旧的好地图,刚刚分发:)
我相信还有其他解决方案。
现在,性能在这里至关重要,否则整个解决方案将太慢。所以根据我的理解,在这里使用 RDBMS 并不好,而且可能更难扩展它。
希望对您有所帮助
1)API网关应该是state-full而其他微服务是无状态的吗?
是的,如 12 Factor App guide lines 所有服务都应该是无状态的。
2)如果是这样,用户会话数据应该如何在API网关和微服务之间共享?
您的 API 应该是无状态的,因此不要将会话状态共享给微服务。推荐的方法是设置 Redis 缓存来存储会话数据。