目录
为什么要使用分布式Session
在系统采用分布式后,各服务之间需要通信,例如登录服务将用户登录的信息保存到Tomcat01的Session中,而查看我的购物车服务是在Tomcat02上,需要获取Tomcat01的Session中的用户信息,此时就出现Session不一致问题,所以此时就需要使用分布式Session。
分布式Session的几种解决方案以及优缺点
Session复制
优点
无需修改代码,只需修改Tomcat配置
缺点
Session同步传输占用内网
多台Tomcat同步性能指数下降
Session占用内存,无法有效水平扩展
前端存储
优点
不占用服务端内存
缺点
存在安全风险
数据大小受Cookie限制
占用外网宽带
Session粘滞
优点
无需修改代码
服务端可以水平扩展缺点
增加新机器,会重新Hash,导致重新登录
应用重启,需重新登录
后端集中存储
优点
安全
容易水平扩展缺点
增加复杂度
需修改代码
测试Spring Session
首先创建一个Maven空项目SessionTest作为父项目然后创建两个服务,分别是Test8087和Test8088
SessionTest配置文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.shao</groupId>
<artifactId>SessionTest</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>Test8087</module>
<module>Test8088</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<!--SpringBoot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.6.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
Test8087
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>SessionTest</artifactId>
<groupId>com.shao</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>Test8087</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency&g