Redis作session共享
在大多数项目中,用户请求会经由负载均衡分发到不同的后端服务器上,如果不做session共享,那么用户的请求被打倒不同服务器上时就会发生session丢失。springboot提供了自动化的session共享配置,集成Redis可以很方便的实现session共享。
做了session共享的服务器在接收到请求后无论是存session还是取session,操作的都是Session服务器,而不再是自身web容器。选择Redis作session共享,是青睐其高并发性能。
代码
步骤一:
新建一个springboot项目,添加Redis依赖、web依赖和spring-session-data-redis依赖
pom文件
<!--Redis & Jedis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<!--spring-boot-starter-data-redis使用lettuce作为Redis的Java客户端,但博主更熟悉Jedis,可以像这样配置-->
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<!--web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Redis下session共享所需依赖-->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
步骤二:
编写application.yml配置文件
# 服务器端口,默认就是8080,在此配置只是为了在后面注入属性
server:
port: 8080
# redis连接配置
spring:
redis:
database: 0
host: 192.168.43.129
port: 6379
password: 981104
jedis:
pool:
max-active: 16
max-idle: 16
min-idle: 1
max-wait: -1ms
步骤三:
编写一个Controller
@RestController
public class TestController {
@Value("${server.port}")
private String port;
@PostMapping("login")
public String login(HttpSession session, String name) {
session.setAttribute("name", name);
return port;
}
@GetMapping("/check")
public String check(HttpSession session) {
String name = (String) session.getAttribute("name");
return port + "====" + name;
}
}
步骤四:
开启session共享支持,在入口类上添加@EnableRedisHttpSession
注解。
@SpringBootApplication
@EnableRedisHttpSession
public class Demo06SessionApplication {
public static void main(String[] args) {
SpringApplication.run(Demo06SessionApplication.class, args);
}
}
这个注解有一些属性,解释一下:
- maxInactiveIntervalInSeconds:session存活时间,默认1800秒;
- redisNamespace:Redis中的key名称,默认是“spring:session”;
- cleanupCron:清理过期session的定时任务Cron表达式,默认是"0 * * * * *"。
打包部署
点击右侧Maven工具栏中Lifecycle下的package进行打包
生成的jar包在当前项目的target目录下
接下来通过XFTP这种文件传输工具上传到虚拟机,执行如下命令,启动项目:
java -jar demo06_session-1.0.0.jar --server.port=8080 &
java -jar demo06_session-1.0.0.jar --server.port=8081 &
这样启动后一旦你的会话窗口关闭,项目也会随之挂起,可以使用如下命令让项目在窗口关闭后继续在后台运行
nohup java -jar demo06_session-1.0.0.jar --server.port=8080 &
nohup java -jar demo06_session-1.0.0.jar --server.port=8081 &
接下来配置Nginx做负载均衡,修改Nginx配置文件:
upstream www.jdq.com{
# 服务清单列表,配置目标服务的ip以及端口号
server 192.168.43.129:8080;
server 192.168.43.129:8081;
}
server {
listen 80;
server_name localhost;
# 配置一个地址路径拦截
location / {
# 配置代理,其中www.jdq.com 为自定义内容,但需要对应上面一个upstream
proxy_pass http://www.jdq.com;
proxy_redirect default;
}
启动Nginx,用Postman测试,结果如下: