前言
【可跳过,比较简单】
- 由于以前的项目配置了多个tomcat服务使用了nginx代理,但是关闭某个tomcat的时候登录用户信息丢失,用户得重新登录,这就让人体验不好了;
- 我们可以复制各个tomcat服务的session来实现的session共享,但是单单tomcat之间共享就会产生许多问题,比如:tomcat的数量多时session之间的共享也对性能有消耗,会有一定的延迟;当用户很多时,每台机器用于保存Session数据的内容占用会很严重。
- 所以我们可以将session的数据放到redis中,让所有tomcat去连接redis实现共享。
实现
准备
使用到的服务和中间件如下
版本:tomcat8.0.53、Redis-x64-3.2.100、nginx-1.18.0、tomcat-cluster-redis-session-manager-2.0.4
下载:
- tomcat 下载:https://archive.apache.org/dist/tomcat/tomcat-8/
- nginx下载:http://nginx.org/en/download.html
- tomcat-redis-session-manager
GitHub下载1:https://github.com/mzd123/session_manager
GitHub下载2:https://github.com/ran-jit/tomcat-cluster-redis-session-manager/wiki
网盘下载:https://pan.baidu.com/s/1un2_noV4VOonczUcpEUUJQ 提取码: jxgv - 准备两个tomcat
- tomcat我分别改成端口8080、8081
- 安装redis
- 解压安装nginx
- 解压tomcat-redis-session-manager
步骤
第一步
解压tomcat-redis-session-manager后,将lib下的jar包复制到“tomcat下的lib包下”
第二步
将redis-data-cache.properties复制到两个tomcat的conf目录下
并修改文件,将redis连接配置填充
第三步
编辑tomcat下面的context.xml,添加两行代码
className会根据tomcat-cluster-redis-session-manager-2.0.4.jar的版本变动,使用class反编译可看到
<!-- 连接redis实现session 共享 -->
<Valve className="tomcat.request.session.redis.SessionHandlerValve" />
<Manager className="tomcat.request.session.redis.SessionManager" />
如下
反编译tomcat-redis-session-manager.jar可以看到文件路径名称这些,对应上面引入
第四步
修改nginx的conf下的nginx.conf配置文件(只是本地测试不用nginx也可测试)
第五步
tomcat下的jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
session.setAttribute("mzd", "123");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>test</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<style type="text/css">
body {
margin: 0px;
padding: 0px;
overflow: hidden;
}
.bg{
width: 100%;
height: 50%;
background: #78cd77;
position: absolute;
text-align: center;
}
</style>
</head>
<body style="background: white;">
<div class="bg">
<br>
<br>
SessionID:<%=session.getId()%>
<br>
<br>
mzd的值为:<%=session.getAttribute("mzd")%>
<br>
<br>
tomcat2
</div>
</body>
</html>
第六步
1、启动redis。
2、启动两个Tomcat【启动时注意端口是否被占用而报错】。
3、启动nginx。(只启动两个Tomcat也可以测试出效果)
4、打开网页测试输入:http://localhost:8080/ 和 http://localhost:8081/
效果
同浏览器不断刷新测试
nginx转发tomcat1后
nginx转发tomcat2后
更多方式参考:https://blog.csdn.net/tuesdayma/article/details/81387862
问题
存储session中的对象必须序列化,如果序列化的对象内有对象也是如此。