引言
通常情况下,生产环境的web应用为了解决单点故障,都会多台部署,这样就会存在一个问题,当我们登录后,会将登录信息存储到session中,如果依赖原生的web容器中的session,当负载均衡到不同服务器会出现不同登录状态的情况,如下图:
当用户首次访问服务时,假设被Nginx代理到Server A,用户填写账户信息进行登录,此时,会在Server A上创建一个session保存登录信息,当用户继续访问服务时,可能会被Nginx代理到Server B,但Server B上没有找到这个session,此时又会引导用户去登录,显然这种处理是不能满足需求的。通常情况下,我们不会直接使用web容器的session,会将登录信息存储到第三方存储中(如redis),这时架构会演变成下面这样:
这种架构在实际开发中也是比较常用的,今天我们来介绍另外一种比较常用的实现——spring session + redis。
一. 环境搭建
1. 在spring boot web环境基础上,添加以下配置
pom.xml
<!-- spring session -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
application.yml
server:
port: 8080
servlet:
session:
# Session ti