在 Web 应用程序中,用户会话管理对于管理用户状态非常重要。 在本文中,我们将了解在集群环境中我们一直遵循的管理用户会话的方法是什么,以及我们如何使用 Spring Session 以更简单、更具可扩展性的方式实现它。
通常在生产环境中,我们会有多个服务器节点,在它们前面有一个负载均衡器,所有客户端流量都将通过负载均衡器到达其中一个服务器节点。 因此,我们需要一些机制来使集群环境中的每个客户端都可以使用用户会话数据。
传统上,我们一直使用以下技术来管理会话:
- Single Node Server
- Multi-Node Server with Load Balancer and Sticky sessions
- Multi-Node Server with Load Balancer and Session Replication
- Multi-Node Server with Load Balancer and Session Data in a Persistent DataStore
让我们简要地看一下这些方法。
1. Single Node Server
如果您的应用程序对您的业务来说不是关键服务,不会有太多并发用户并且可以接受一些停机时间,那么我们可以进行单节点服务器部署,如下所示:
在此模型中,对于每个浏览器客户端,在服务器上创建一个会话对象(在 Java 的情况下为 HttpSession),并且 SESSION_ID 将设置为浏览器上的 cookie 以标识会话对象。 但是对于大多数应用程序来说,这种单服务器节点部署是不可接受的,因为如果服务器出现故障,服务将完全停止。
2. Multi-Node Server with Sticky Sessions
为了使我们的应用程序具有高可用性并满足更多用户的需求,我们可以在负载均衡器后面设置多个服务器节点。 在 Sticky Sessions 方法中,我们将负载均衡器配置为将来自同一客户端的所有请求路由到同一节点。
在此模型中,用户会话将在任何一个服务器节点上创建,并且来自该客户端的所有进一步请求将被发送到同一节点。 但这种方法的问题是,如果服务器节点出现故障,则该服务器上的所有用户会话都将消失。
3. Multi-Node Server with Session Replication
在此模型中,用户会话数据将在所有服务器节点上复制,以便任何请求都可以路由到任何服务器节点。 即使一个节点出现故障,客户端请求也可以由另一个节点提供服务。
但是 Session Replication 需要更好的硬件支持,并且涉及一些特定于服务器的配置。
4. Multi-Node Server with Session Data in a Persistent DataStore
在此模型中,用户会话数据不会保存在服务器的内存中,而是会持久保存到数据存储中并将其与 SESSION_ID 相关联。
该解决方案将独立于服务器,但我们可能需要编写自定义代码,以便在用户向他/她的会话中添加一些信息时透明地将会话数据存储在持久性数据存储中。 这就是 Spring Session 发挥作用的地方。
Spring Boot 使用 Session 管理登录状态和拦截请求
https://www.zhangbj.com/p/554.html
参考
https://www.sivalabs.in/session-management-using-spring-session-jdbc-datastore/