正常情况下,HttpSession是通过Servlet容器创建并进行管理的。创建成功之后都是保存在内存中的。如果开发者需要对项目进行横向扩展搭建集群,那么可以利用一些硬件或者软件工具来做负载均衡,此时,来自同一个用户的HTTP请求就有可能被分发到不同的实例上去,如何保证各个实例之间Session的同步就成为了一个必须要解决的问题。
Spring Boot提供了自动化的Session共享配置,它结合Redis可以非常方便的解决这个问题。使用Redis解决Session共享问题的原理非常简单,就是把原本存储在不同服务器上的Session拿出来放到一个独立的服务器上。
添加依赖
<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>配置redis
修改配置文件,增加redis配置
spring.redis.database=0
spring.redis.host=localhost
spring.redis.port=6379创建controller测试
@RestController
public class RedidSessionController {
@Value("${server.port}")
public String port;
@PostMapping("/save")
public String saveName(String name, HttpSession session) {
session.setAttribute("name", name);
return "hello," + name + ":" + port;
}
@PostMapping("/get")
public String getName(HttpSession session) {
session.getAttribute("name");
return "hello," + session.getAttribute("name") + ":" + port;
}
}打包jar包
通过mvn clean package打包成jar包。
分别执行
java -jar demo-0.0.1-SNAPSHOT.jar --server.port=8080
java -jar demo-0.0.1-SNAPSHOT.jar --server.port=8081通过8080、8081两个端口运行
配置nginx负载均衡
主要配置内容如下
upstream test.com{
server localhost:8080 weight=1;
server localhost:8081 weight=1;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://test.com;
root html;
index index.html index.htm;
}
}
配置文件中首先配置上游服务器,即两个real server,权重都是1,也就是说,请求平均分配到8080及8081端口。
测试
我们通过postman,调用save方法,保存session信息。
然后再次通过postman,调用get方法,
可以看到,系统正确的获取到8080端口保存的session信息。
再次打开redis,查看session信息
可以看到,session信息正确保存到了我们配置的redis数据库中。
评论 (0)