分布式 Session 问题之前的代码在我们之后一台应用系统,所有操作都在一台 Tomcat 上,没有什么问题。当我们部署多台系统,配合Nginx 的时候会出现用户登录的问题原因:由于 Nginx 使用默认负载均衡策略( 轮询 ),请求将会按照时间顺序逐一分发到后端应用上。也就是说刚开始我们在 Tomcat1 登录之后,用户信息放在 Tomcat1 的 Session 里。过了一会,请求又被 Nginx分发到了 Tomcat2 上,这时 Tomcat2 上 Session 里还没有用户信息,于是又要登录。
所以需要将我们的session存储在redis缓存里面,引入pom依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- commons-pool2 对象池依赖 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
application.yml文件:
spring:
redis:
#超时时间
timeout: 10000ms
#服务器地址
host: 192.168.10.100
#服务器端口
port: 6379
#数据库
database: 0
#密码
password: root
lettuce:
pool:
#最大连接数,默认8
max-active: 1024
#最大连接阻塞等待时间,默认-1
max-wait: 10000ms
#最大空闲连接
max-idle: 200
#最小空闲连接
min-idle: 5
在虚拟机(云服务器)通过docker安装redis:
docker pull redis
通过docker hub拉去redis的镜像,且是最新版
docker images
查看所有镜像,如果有显示redis,这说明下载redis镜像成功的了下一步就是使用run命令创建并启动镜像,但在启动镜像之前,我们需要去官网下载redis的配置文件redis.conf文件。注意不同版本的redis配置文件内容不一样,要下载对应版本的redis配置文件,这里举例。
sudo mkdir -p /root/docker/redis/data
sudo mkdir -p /root/docker/redis/conf
然后,
sudo mkdir -p /mydata/redis/conf
sudo touch /mydata/redis/conf/redis.conf
接下来,创建配置文件
sudo vim redis.conf
内容:
#方便学习,注释掉该行。可以使所有ip访问redis
#bind 127.0.0.1
#关闭保护模式
protected-mode no
#后台启动
daemonize yes
#添加访问认证
requirepass root
接下来,启动容器:
docker run \
-p 6379:6379 \
--name redis \
-v /docker/redis/redis.conf:/etc/redis/redis.conf \
-v /docker/redis/data:/data \
--restart=always \
-d \
redis:7.0.4 \
redis-server /etc/redis/redis.conf
名词解释: - p 宿主机端口号:虚拟机(云服务器)端口号 映射
-- name 创建一个名字为 redis的容器
-v /docker/redis/redis.conf:/etc/redis/redis.conf \ 挂载redis.conf文件
-v /docker/redis/data:/data \ 挂载redis的持久化数据
--restart=always \ 设置redis容器随docker启动而自启动
-d \后台运行并返回容器id
redis:7.0.4 \
redis-server /etc/redis/redis.conf \ 指定redis在docker中的配置文件路径,后台启动redis
如果临时修改了redis.conf文件需要重新加载以下配置文件使用如下命令:
systemctl restart network && systemctl restart docker
redis,启动!
sudo docker exec -it redis redis-cli
注意:-it后面的redis是容器名称!!
此时,我们登录springboot的项目!
登录成功!
接下来看看redis!!!
登陆后存的就是我们的uuid!!