N个 多个Tomcat之间实现Session共享的demo

本文介绍如何通过配置实现Tomcat集群及解决session共享问题,包括环境搭建、配置修改等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文章中有些问题在此已经更新,出处:http://blog.youkuaiyun.com/wlwlwlwl015/article/details/48160433


对于高访问量、高并发量的网站或web应用来说,目前最常见的解决方案应该就是利用负载均衡进行server集群,例如比较流行的nginx+memcache+tomcat。集群之后比如我们有N个Tomcat,用户在访问我们的网站时有可能第一次请求分发到tomcat1下,而第二次请求又分发到了tomcat2下,有过web开发经验的朋友都知道这时session不一致会导致怎样的后果,所以我们需要解决一下多个tomcat之间session共享的问题。


环境准备


首先我们需要下载tomcat,这里我们选择tomcat7 或者tomcat8 的解压缩版:https://tomcat.apache.org/download-70.cgi


下载完成后我们新建一个目录叫tomcat_cluster(tomcat集群的意思),直接解压下载好的tomcat,并重命名为tomcat1,可以看到目录结构如下:


准备一个最简单的web项目(在IDE中创建部署,拷贝出来即可),并修改index.jsp的内容如下:

[html]  view plain  copy
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.   
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  8. <html>  
  9.   <head>  
  10.     <base href="<%=basePath%>">  
  11.       
  12.     <title>My JSP 'index.jsp' starting page</title>  
  13.     <meta http-equiv="pragma" content="no-cache">  
  14.     <meta http-equiv="cache-control" content="no-cache">  
  15.     <meta http-equiv="expires" content="0">      
  16.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  17.     <meta http-equiv="description" content="This is my page">  
  18.     <!-- 
  19.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  20.     -->  
  21.   </head>  
  22.     
  23.   <body>  
  24.       
  25.         SessionID:<%=session.getId()%>  
  26.         <BR>  
  27.         SessionIP:<%=request.getServerName()%>  
  28.         <BR>  
  29.         SessionPort:<%=request.getServerPort()%>  
  30.         <%  
  31.         out.println("This is Tomcat Server 11111");  
  32.         %>  
  33.   </body>  
  34. </html>  

这样基本工作就做完了,下面需要修改tomcat的配置文件,我们打开conf下的server.xml文件,找到下面这一行:

[html]  view plain  copy
  1. <Engine name="Catalina" defaultHost="localhost">  


不需要做任何修改,在下面加一行,或者把这一行的下面注释掉的这一行代码取消注释:


<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>


这个就是tomcat自带的集群配置了,我们可以在tomcat官方文档中的https://tomcat.apache.org/tomcat-8.0-doc/cluster-howto.html中看到相关注意事项,其中有一条需要注意一下:

Make sure your web.xml has the <distributable/> element

很明显是说我们的web项目的web.xml文件中需要有<distributable/>这个元素,所以在我们刚才引入的web项目中做如上的修改。

这样我们的基本配置就完成了,因为是集群,所以在tomcat_cluster目录下拷贝一份tomcat1,并重命名成tomcat2。



注意一下需要修改的地方:

1、首先肯定是端口号,所有port字样的配置都修改一下保证两个不重复,我这里将tomcat1的8080端口修改为7080,tomcat2的8080,8005,8009端口修改为9080,9005,9009

2、修改webapps下的项目中的index.jsp文件,因为要测试session共享所以有必要区分一下,在jsp中加入一行静态文本即可,我这里是用“This is Tomcat Server 111111”和“This is Tomcat Server 22222”来进行区分的,下面分别启动两个tomcat进行测试,我们分别运行bin目录下的startup.bat,发现第一个tomcat启动之后,第二个无法启动,这是因为启动脚本(startup.bat)没有修改,引用同样的CATALINA_HOME必然会报错,所以请注意下面的第三点。

3、为我们的这两个tomcat添加两个环境变量——CATALINA_HOME2、CATALINA_HOME3分别指向这两个tomcat的安装目录,末尾不要加分号


然后分别修改两个tomcat中bin目录下的两个脚本:startup.bat和catalina.bat,把tomcat1中的这两个文件中的%CATALINA_HOME%替换为%CATALINA_HOME2%,"%CATALINA_BASE:;=%" 要换成"%CATALINA_BASE2:;=%",把tomcat2中的这两个文件中的%CATALINA_HOME%替换为%CATALINA_HOME3%"%CATALINA_BASE:;=%" 要换成"%CATALINA_BASE3:;=%",注意批量替换时catalina.bat中"%CATALINA_BASE:;=%"替换不到 ,所以特别说明一下。现在再启动tomcat,会发现两个tomcat都可以正常启动了,解压版的tomcat需要这样配置一下。在浏览器中检测一下tomcat是否可以成功访问:



OK,再访问一下我们的测试项目,看看session是否一致:


可以发现我们两个tomcat下的这两个项目Session完全一致,刷新也不会变,到此为止我们就算成功实现了Session共享,也就是说我们tomcat已经成功完成了任务,剩余的交给nginx就OK了。最后再强调一下,这两个testdemo的web.xml中需要加这么元素:

    <!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  
<distributable/>
</web-app>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值