Spring Boot Session共享

Laughing
2021-06-09 / 0 评论 / 1,043 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年05月31日,已超过232天没有更新,若内容或图片失效,请留言反馈。

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

通过80808081两个端口运行

配置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,也就是说,请求平均分配到80808081端口。

测试

我们通过postman,调用save方法,保存session信息。

然后再次通过postman,调用get方法,

可以看到,系统正确的获取到8080端口保存的session信息。

再次打开redis,查看session信息

可以看到,session信息正确保存到了我们配置的redis数据库中。

1

评论 (0)

取消