单体项目时代,session管理比较简单,往往直接存储在内存中即可满足要求,但是随着项目体量不断变大,项目访问量不断增多,往往会选择多节点部署和服务化拆分,带来便利的同时,session管理也带来了问题,最典型的问题,比如请求上一个节点登录成功,但在访问下一个节点的时候会又让你再次登录。
那么今天就来聊聊这种情况下如何做session的管理,比较常见的解决方案大概就是以下几种。
- sticky session
会话粘滞,就是请求发起IP相同的会打到同一台服务器上,原理通常就是对IP求hash值,然后对服务器节点数进行取模,下标就是要访问的服务器节点。通常项目节点前置一般会放置负载均衡器,比如nginx,对nginx做一点配置即可支持会话粘滞功能。
upstream backend{
ip_hash;
// 此处配置服务节点
server 192.168.128.1:8080
server 192.168.128.2:8080
server 192.168.128.3:8080
}
server {
listen 8081;
server_name localhost;
location / {
proxy_pass http://backend;
}
}
- session replication
会话复制,就是会话会在服务器节点之间复制,每个服务器节点上都会存在全量的会话信息,我们常用的tomcat就支持会话复制功能。
参考官方文档:
https://tomcat.apache.org/tomcat-9.0-doc/cluster-howto.html - 集中式会话
说白了,就是会话信息放在一个地方进行统一管理,现在比较常见的作法就是使用nosql数据库来管理session,比如redis或者mongodb。小编使用redis管理session,做法也很简单,springboot项目中直接引入相关依赖,启动类上加上@EnableRedisHttpSession注解即可开启使用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>
session管理大概就是这几种,后续有空详细论述一下spring session之redis管理的相关原理。