使用Spring Session与JDBC DataStore进行会话管理

295 阅读3分钟

在Web应用程序中,用户会话管理对于管理用户状态非常重要。在本文中,我们将了解我们在集群环境中管理用户会话的方法是什么,以及如何使用Spring Session以更简单,更可扩展的方式实现它。

通常在生产环境中,我们将有多个服务器节点,其前面有一个负载平衡器,所有客户端流量将通过负载平衡器到达其中一个服务器节点。因此,我们需要一些机制来使用户会话数据可用于群集环境中的每个客户端。

传统上,我们一直使用以下技术来管理会话:

单节点服务器

1.具有负载均衡器和粘滞会话的多节点服务器

2.具有负载均衡器和会话复制的多节点服务器

3.具有负载均衡器和持久数据存储中的会话数据的多节点服务器

4.让我们简要地看一下这些方法。

一.单节点服务器:

大致如图:

在此模型中,对于每个浏览器客户端,在服务器上创建会话对象(在Java的情况下为HttpSession),并且将在浏览器上将SESSION_ID设置为cookie以标识会话对象。但是,对于大多数应用程序来说,这种单服务器节点部署是不可接受的,因为如果服务器出现故障,服务将完全停止。

2.具有粘滞会话的多节点服务器

为了使我们的应用程序高度可用并满足更多用户,我们可以在负载均衡器后面有多个服务器节点。在Sticky Sessions方法中,我们将负载均衡器配置为将来自同一客户端的所有请求路由到同一节点。

在此模型中,将在任何一个服务器节点上创建用户会话,并且来自该客户端的所有其他请求将被发送到该同一节点。但是这种方法的问题是如果服务器节点出现故障,那么该服务器上的所有用户会话都将消失。 3.具有会话复制的多节点服务器

在此模型中,将在所有服务器节点上复制用户会话数据,以便可以将任何请求路由到任何服务器节点。即使一个节点发生故障,客户端请求也可以由另一个节点提供服务。

4.持久数据存储中具有会话数据的多节点服务器

在此模型中,用户会话数据不会保存在服务器的内存中,而是将其持久保存到数据存储中并将其与SESSION_ID关联。

此解决方案将独立于服务器,但是每当用户向他/她的会话添加一些信息时,我们可能需要编写自定义代码以将会话数据透明地存储在Persistent数据存储区中。

Spring Session是方法4的实现,它将会话数据存储在持久数据存储中。Spring Session支持多个数据存储,如RDBMS,Redis,HazelCast,MongoDB等,可以透明地保存使用会话数据。像往常一样,使用Spring Session和Spring Boot就像添加依赖项和配置一些属性一样简单。让我们看看如何在Spring Boot应用程序中使用带有JDBC后端存储的Spring Session。

您可以在https://github.com/sivaprasadreddy/spring-session-samples找到本文的源代码。