文章目录
1.为什么需要保证Session一致性?
http是无状态请求,通信需要进行三次握手,在分布式服务中,当用户第一次访问服务器进行登录,轮询A服务器,会在A服务器创建Session,在session中保存用户的JsessionId,然后返回浏览器客户端,在客户端会生成Cookie,在cookie中保存从服务器端返回的JsessionId,当用户再次访问服务时,带着jsessionID请求落在B上,但是B上没有JsessionID,所以会在B服务器上创建新的session,返回到客户端,所以一直登录页面。如下图:
2.如何保证session一致性?
保证session一致性有三种方式,分别为Session ip_hash,Session 复制,Session共享。下面分别介绍。
2.1session ip_hash
是什么?
是NGINX负载算法模式的一种,每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
怎么用
nginx配置
upstream balance{
ip hash
server 192.168.21.121:8080
server 192.168.21.158:80801
}
优缺点
优点:
配置简单,不入侵代码
易于水平扩展服务器
缺点:
单点故障问题
服务器重启session丢失
使用场景
2.2 session 复制:
是什么?
当用户访问一台tomcat 服务器上的应用时,同时会把session 复制到其他的服务上,这样当用户的访问请求落到其他服务器时,也能记录用户状态。
怎么用
springboot项目
优缺点
优点:
缺点:
使用场景
较小分布式环境首选,无入侵,健壮无单点故障问题
2.3 Session共享
是什么?
session一致性实现的一种方式,把session进行存储,所有服务器都可以共享。
怎么用
springboot项目
1.pom依赖
<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>
2.配置文件
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=L409IKNFJDKJJ
3.在启动类上添加@EnableRedisHttpSession
SSM项目配置
1.pom依赖
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
<dependency>