SpringBoot如何用Session共享实现分布式部署?

在单体项目中,我们将用户信息存在 session 中,那么在该 session 过期之前,我们都可以从 session 中获取到用户信息,通过登录拦截,进行操作
但是分布式部署的时候,我们请求的服务器可能不是同一台服务器,那么我们就必须要面对 session 共享的问题,下面介绍的是在 SpringBoot 实现 session 共享的方式
一、创建项目创建 SpringBoot 项目,选择 Maven 依赖

SpringBoot如何用Session共享实现分布式部署?

文章插图
 

SpringBoot如何用Session共享实现分布式部署?

文章插图
 
最终 pom.xml 文件如下:
<!-- redis的依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- web的依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- session共享的依赖 --><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency>二、配置 Redis我们需要借助 redis 实现 session 共享,所以我们需要在配置文件中配置 redis 的信息
server:port: 8080spring:redis:host: 127.0.0.1port: 6379database: 0password:我们配置了该项目的端口,以及 redis 的连接信息
三、写接口package com.zyxx.session.controller;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.GetMApping;import org.springframework.web.bind.annotation.RestController;import JAVAx.servlet.http.HttpSession;@RestControllerpublic class DemoController {/*** 获取项目端口*/@Value("${server.port}")private String port;/*** 将信息存放在session中*/@GetMapping("set")public String set(HttpSession session) {session.setAttribute("user", "hello world~~~");return port;}/*** 从session中获取信息*/@GetMapping("get")public String get(HttpSession session) {return session.getAttribute("user") + " : " + port;}}我们写了一个 set,一个 get 方法,将信息存放在 session 中,从 session 中取出信息
四、打包测试
SpringBoot如何用Session共享实现分布式部署?

文章插图
 
启动项目,分别启动在两个端口:
java -jar .session-0.0.1-SNAPSHOT.jar --server.port=8080java -jar .session-0.0.1-SNAPSHOT.jar --server.port=8081分别启动在 8080,8081端口
访问:http://localhost:8080/set
SpringBoot如何用Session共享实现分布式部署?

文章插图
 
我们从 8080 端口,将信息保存在 session 中
我们访问:http://localhost:8081/get
SpringBoot如何用Session共享实现分布式部署?

文章插图
 
我们在 8081 端口的项目中从 session 中取出了内容:hello world~~~
由此证明,我们的 session 共享已经成功
五、分布式部署下面我们借助 Nginx 代理转发访问这两个项目
1、配置转发nginx 配置文件如下:
SpringBoot如何用Session共享实现分布式部署?

文章插图
 
主要配置内容:
upstream helloworld{ server 127.0.0.1:8080 weight=1; server 127.0.0.1:8081 weight=2;}这里配置转发到 8080,8081 端口,并配置了权重
location / { proxy_pass http://helloworld;#roothtml;#indexindex.html index.htm;}拦截本地的所有请求,默认端口为 80
2、启动 nginxnginx -s reload3、访问测试我们先删除 redis 里面刚刚测试保存的信息
SpringBoot如何用Session共享实现分布式部署?

文章插图
 
然后我们访问:
http://localhost/set
SpringBoot如何用Session共享实现分布式部署?

文章插图
 
这里我们可以看出,由 8080 端口的服务器完成了 set 请求,多次访问,nginx 将会根据什么配置的权重参数分配服务器来完成操作
下面我们访问:
http://localhost/get
SpringBoot如何用Session共享实现分布式部署?

文章插图
 
可以看出,由 8081 端口的服务器完成了 get 请求,并成功取到了存在 session 中的数据,实现了 session 共享
六、总结1、以前我们在 SSM 架构的项目中实现 session 共享,需要配置三个地方 ,一个是 web.xml 配置代理过滤器,然后在 Spring 容器中配置 Redis,最后再配置 Spring Session,相比 SpringBoot,稍有复杂


推荐阅读