默认情况下,session是保存在TOMCAT服务器内存中的,如果我们有两个TOMCAT,它们的session是没有共享的。我们这回要做的就是把session保存在redis中,这样两个TOMCAT就可以共享session了。其实这货的详细原理还是很复杂的,不过大家只要记住一点:TOMCAT要作集群就必须实现session共享。还好,这个功能实现起来比较简单,下面我们来实现它。
GitHub: https://github.com/Dengxd/JavaCluster 所有源码都在这里,GitHub经常连不上,要多刷新几次
安装Redis
Windows Redis下载地址: Releases · zkteco-home/redis-windows · GitHub github经常连不上,多试几次
点击这个Source code(zip)就行,这家伙也是搞笑,这边写着源代码,我下载下来却发现没有源代码,就是EXE文件,也好,省得编译了。
解压文件,直接双击运行redis-server.exe,出现这个界面:
好,redis安装完成。
安装配置nginx
安装NGINX可以参考上一篇文章《Java集群:单体架构升级到集群架构(一)使用NGINX建立集群》,不过今天我们不使用三台服务器,就用一台服务器,如下图:
TOMCAT、NGINX在同一台服务器里面,那么在配置NGINX的时候,IP就要改成127.0.0.1
修改nginx.conf 文件,把:
upstream mytomcat {
server 192.168.1.200:8000;
server 192.168.1.201:8001;
}
改成
upstream mytomcat {
server 127.0.0.1:8000;
server 127.0.0.1:8001;
}
如果你已经启动了nginx,要另外开一个cmd窗口,用命令 nginx -s reload 来刷新配置:
写一个登录网页
这个登录网页和普通的网站登录功能差不多,也有点区别:就是在验证用户名密码之前,先看一下session里面有没有用户名,如果有的话,说明已经登录过了,就不再登录了。另外,就是把端口号也传到页面显示出来。
String loginUser=(String)session.getAttribute("user");
request.setAttribute("port",MainApplication.port);
if(loginUser!=null){
return "hello";
}
咱们简单一点不读数据库了,用户名用abc, 密码用123
if(user.equals("abc") && password.equals("123")) {
session.setAttribute("user",user);
return "hello";
}
pom.xml文件中要加上:
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
applicatioin.properties文件要加上redis和session的配置
spring.redis.host=localhost
spring.redis.port=6379
# spring.redis.password=123456
spring.redis.timeout=1000
spring.redis.jedis.pool.min-idle=5
spring.redis.jedis.pool.max-active=10
spring.redis.jedis.pool.max-idle=10
spring.redis.jedis.pool.max-wait=2000
# session存到redis中(最重要的就是这一行)
spring.session.store-type=redis
# session失效时间
spring.session.timeout=1800
server.servlet.session.cookie.max-age=1800
测试
首先,启动登录网页程序,打开两个cmd窗口,分别运行下面两个命令:
- java -jar login-0-SNAPSHOT.jar --server.port=8000
- java -jar login-1.0-SNAPSHOT.jar --server.port=8001
然后我们启动nginx
在浏览器中输入 http://localhost/login
输入用户名abc, 密码123,点击submit, 进入hello页面
可以看到是8000端口的tomcat在处理用户的登录
我们可以多开几个标签页,输入http://localhost/hello
如果看到8001端口,就说明成功了。
查看redis中保存的数据
双击运行redis-cli.exe ,输入 keys * , 回车,可以看到redis中保存的session数据:
session相关原理
如果您对session原理有兴趣,可以上网去搜索一下,这种文章还是很多的