前言
单机环境下我们session是存储在应用服务的内存中,但是在分布式环境 下,这种存储在应用服务器内存的方案显然不能实现session共享。本次我们将介绍SpringBoot+Redis实现分布式环境下Session共享方案。
实现步骤
- 首先引入依赖
<!--redis的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>5.1.1.RELEASE</version>
</dependency>
spring-session-data-redis 依赖的作用是将session保存到redis的工具类。
2. 添加Session配置类
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = -1)
public class SessionConfig {}
maxInactiveIntervalInSeconds 属性表示Session失效的时间,单位是毫秒,-1表示永不失效。
3. 配置redis
spring.redis.host=192.168.226.111
spring.redis.database=0
spring.redis.port=6379
测试步骤
将应用分别部署到两台服务上,然后通过nginx 实现负载均衡,如下,我将应用配置在了192.168.226.111和192.168.226.112服务器上,然后配置nginx 做转发,配置如下:
upstream bootDemo {
server 192.168.226.111:8080;
server 192.168.226.112:8080;
}
server {
listen 80;
server_name shoptest.jss.com.cn;
location /spring-boot-session/ {
proxy_pass http://bootDemo/spring-boot-session/;
}
}
然后,调用登录接口,接口请求的是192.168.226.112服务器,当前会话的sessionId是4cebb851-b9b2-488e-9569-9ace9298bb67存储的用户信息是{“password”:“123123”,“userName”:“ceshi”}
然后,我们我们通过 keys "*session*"
指令可以找到 当前存入的用户如下图所示:
相关key的说明如下:
//存储 Session 数据,数据类型hash,可以使用type查看
Key:spring:session:sessions:4cebb851-b9b2-488e-9569-9ace9298bb67
//Redis TTL触发Session 过期。(Redis 本身功能),数据类型:String
Key:spring:session:sessions:expires:4cebb851-b9b2-488e-9569-9ace9298bb67
//执行 TTL key ,可以查看剩余生存时间
//定时Job程序触发Session 过期。(spring-session 功能),数据类型:Set
Key:spring:session:expirations:133337740000
然后,我们请求获取用户信息接口,接口请求到了192.168.226.112服务器,可以获取到登录用户信息。
源代码地址:
https://github.com/XWxiaowei/spring-boot-session-demo