正常情况下,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)