一、 分布式下session丢失场景
问题原因:Http协议是无状态的协议
解决办法:两种用于保持Http状态的技术,那就是Cookie(客户端)和Session(服务器端)
二、 解决Session一致性方案
Nginx的 IP_Hash 策略(可以使用)
同一个客户端IP的请求都会被路由到同一个目标服务器,也叫做会话粘滞
优点:
配置简单,不入侵应用,不需要额外修改代码
缺点:
服务器重启Session丢失
存在单点负载高的⻛险
单点故障问题Session复制(不推荐)
多个tomcat之间通过修改配置文件,达到Session之间的复制
优点:
不入侵应用
便于服务器水平扩展
能适应各种负载均衡策略
服务器重启或者宕机不会造成Session丢失
缺点:
性能低
内存消耗
不能存储太多数据,否则数据越多越影响性能
延迟性
- Session共享,Session集中存储(推荐)
Session的本质就是缓存,交给专业的缓存中间件 比如Redis
优点:
能适应各种负载均衡策略
服务器重启或者宕机不会造成Session丢失
扩展能力强
适合大集群数量使用
缺点:
对应用有入侵,引入了和Redis的交互代码
Spring Session基于Redis的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
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
-
添加注解
测试
原理示意
说明:
请求通过tomcat到达servlet容器的时候,redis生成的过滤器对请求做了封装,如果没有这个过滤器,servlet就会从tomcat中获取session
有了过滤器之后,取出来的session就是Redis中的Session,有就从Redis中获取,没有就创建并提交到Redis中.