N个tomcat之间实现Session共享(写的不错,转来的)
以下文章写的比较不错,转来的。
tomcat的session共享设置如此简单为什么很少人去用。这个我说的重点。
1.自身的session如果服务器不在同一个网段会有session失效(本人使用的是阿里云的ecs,集群下的各个节点由于不在一个网段。。所以没法用了。。)
2.消耗更多内存和带宽,tomcat官方推荐在集群比较小时采用此方案。
前言
对于高访问量、高并发量的网站或web应用来说,目前最常见的解决方案应该就是利用负载均衡进行server集群,例如比较流行的nginx+memcache+tomcat。集群之后比如我们有N个Tomcat,用户在访问我们的网站时有可能第一次请求分发到tomcat1下,而第二次请求又分发到了tomcat2下,有过web开发经验的朋友都知道这时session不一致会导致怎样的后果,所以我们需要解决一下多个tomcat之间session共享的问题。
环境准备
首先我们需要下载tomcat,这里我们选择tomcat7的解压缩版:
下载完成后我们新建一个目录叫tomcat_cluster(tomcat集群的意思),直接解压下载好的tomcat,并重命名为tomcat1,可以看到目录结构如下:
准备一个最简单的web项目(在IDE中创建部署,拷贝出来即可),并修改index.jsp的内容如下:
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <base href="<%=basePath%>">
- <title>My JSP 'index.jsp' starting page</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">
- <!--
- <link rel="stylesheet" type="text/css" href="styles.css">
- -->
- </head>
- <body>
- SessionID:<%=session.getId()%>
- <BR>
- SessionIP:<%=request.getServerName()%>
- <BR>
- SessionPort:<%=request.getServerPort()%>
- <%
- out.println("This is Tomcat Server 11111");
- %>
- </body>
- </html>
这样基本工作就做完了,下面需要修改tomcat的配置文件,我们打开conf下的server.xml文件,找到下面这一行:
- <Engine name="Catalina" defaultHost="localhost">
不需要做任何修改,在这一行的下面加入如下代码:
- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
- channelSendOptions="8">
- <Manager className="org.apache.catalina.ha.session.DeltaManager"
- expireSessionsOnShutdown="false"
- notifyListenersOnReplication="true"/>
- <Channel className="org.apache.catalina.tribes.group.GroupChannel">
- <Membership className="org.apache.catalina.tribes.membership.McastService"
- address="228.0.0.4"
- port="45564"
- frequency="500"
- dropTime="3000"/>
- <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
- address="auto"
- port="4000"
- autoBind="100"
- selectorTimeout="5000"
- maxThreads="6"/>
- <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
- <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
- </Sender>
- <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
- <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
- </Channel>
- <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
- filter=""/>
- <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
- <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
- tempDir="/tmp/war-temp/"
- deployDir="/tmp/war-deploy/"
- watchDir="/tmp/war-listen/"
- watchEnabled="false"/>
- <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
- <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
- </Cluster>
这个就是tomcat自带的集群配置了,我们可以在tomcat官方文档中的cluster-howto.html中看到相关注意事项,其中有一条需要注意一下:
Make sure your web.xml has the <distributable/> element
很明显是说我们的web项目的web.xml文件中需要有<distributable/>这个元素,所以在我们刚才引入的web项目中做如上的修改。
这样我们的基本配置就完成了,因为是集群,所以在tomcat_cluster目录下拷贝一份tomcat1,并重命名成tomcat2。
注意一下需要修改的地方:
1、首先肯定是端口号,所有port字样的配置都修改一下保证两个不重复,我这里将tomcat1的端口修改为7080,tomcat2的端口修改为9080。
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%,把tomcat2中的这两个文件中的%CATALINA_HOME%替换为%CATALINA_HOME3%,现在再启动tomcat,会发现两个tomcat都可以正常启动了,解压版的tomcat需要这样配置一下。在浏览器中检测一下tomcat是否可以成功访问:
OK,再访问一下我们的测试项目,看看session是否一致:
可以发现我们两个tomcat下的这两个项目Session完全一致,刷新也不会变,到此为止我们就算成功实现了Session共享,也就是说我们tomcat已经成功完成了任务,剩余的交给nginx就OK了。最后再强调一下,这两个testdemo的web.xml中需要加这么元素:
总结
N个tomcat之间实现Session共享(写的不错,转来的)的更多相关文章
- 多个Tomcat之间实现Session共享
对于高访问量.高并发量的网站或web应用来说,目前最常见的解决方案应该就是利用负载均衡进行server集群,例如比较流行的nginx+memcache+tomcat.集群之后比如我们有N个Tomcat ...
- 跨服务器之间的session共享
跨服务器之间的Session共享方案需求变得迫切起来,最终催生了多种解决方案,下面列举4种较为可行的方案进行对比探讨: 1. 基于NFS的Session共享 NFS是Net FileSystem的简称 ...
- 分布式Session共享(二):tomcat+memcached实现session共享
一.前言 本文主要测试memcached实现session共享的实现方式,不讨论如何让nginx参与实现负载均衡等. 二.环境配置 本测试在Window下进行 name version port To ...
- 分布式Session共享(一):tomcat+redis实现session共享
一.前言 本文主要测试redis实现session共享的实现方式,不讨论如何让nginx参与实现负载均衡等. 二.环境配置 本测试在Window下进行 name version port Tomcat ...
- JEECG & JEESite Tomcat集群 Session共享
多台tomcat服务的session共享 memcached与redis - JEECG开源社区 - CSDN博客https://blog.csdn.net/zhangdaiscott/article ...
- 【Tomcat】Tomcat + Memcached 实现session共享
概述 web项目中,Tomcat的访问量总是有限的,这时候就需要用到Tomcat集群,多个Tomcat的时候就要考虑Session共享的问题,这里介绍一种使用Memcached做Session共享的解 ...
- Nginx+tomcat+redis实现session共享
Nginx+tomcat+redis实现session共享 1,安装nginx,使用yum -y install nginx 这是epel源中的,需要安装epel源. 2,配置nginx. 在ngin ...
- Nginx+Tomcat集群+session共享
Nginx+Tomcat集群+session共享 1)安装Nginx 2)配置多个Tomcat,在server.xml中修改端口(端口不出现冲突即可) 3)在nginx.conf文件中配置负载均衡池, ...
- Nginx+Tomcat+Memcache 实现session共享
Nginx + Tomcat + Memcache 实现session共享 1. Nginx 部署 1.上传源码包到服务器,解压安装 下载地址:http://nginx.org/en/download ...
随机推荐
- Android/AndroidStudio/idea使用教程之git使用(详细)(码云)
已经安装好了AndroidStudio,安装教程 本教程是作者自己摸索出来的,有不足之处还请大家海涵.多多拍砖,互相学习. 第一步:下载git,安装git客户端 直接百度git,下载git 安装g ...
- 浅入深出Vue:代码整洁之去重
在开始本篇的主题之前,让我们把上次遗留下来的问题都清理一下: 将其他组件中 axios 请求的地方封装起来. 这里就不把代码放在开头了,相关代码都放在文末,有兴趣了解的童鞋可以先往下翻. 好了, 我们 ...
- Netty中的策略者模式
策略者模式的特点 在设计类的继承体系时,我们会刻意的把公共的部分都提取到基类中 比如先设计Person类,把人类都具有的行为放到这个Person,特有的行为设计成抽象方法,让子类具体去实现, 这样后续 ...
- Unity AR Foundation 和 CoreML: 实现手部的检测和追踪
0x00 前言 Unity的AR Foundation通过上层抽象,对ARKit和ARCore这些底层接口进行了封装,从而实现了AR项目的跨平台开发能力. 而苹果的CoreML是一个可以用来将机器学习 ...
- TP框架基础(三)
[系统常量信息] 获取系统常量信息: 如果加参数true,会分组显示: >系统常量信息里经常用到的是user里的路径 > APP_PATH =>string'./shop/' 项目路 ...
- python课堂整理20----生产者消费者模型
一.实现功能:店铺生产包子,消费者来吃 import time def producter(): ret = [] for i in range(10): time.sleep(0.1) ret.ap ...
- 关于keil警告/错误问题的解释和修正
- 版权声明:本文为博主 **乔勇刚-** 一字一句敲出来的原创作品,未经博主允许不得转载,多谢支持.- 本系列博客仅做经验交流分享,不能用作任何商业用途.本文中如有不足之处,请您留言,本人将及时更改 ...
- [ PyQt入门教程 ] Qt Designer工具的使用
Qt Designer是PyQt程序UI界面的实现工具,Qt Designer工具使用简单,可以通过拖拽和点击完成复杂界面设计,并且设计完成的.ui程序可以转换成.py文件供python程序调用.本文 ...
- C# StackTrace
StackTrace trace = new StackTrace(); //获取是哪个类来调用的 Type type = trace.GetFrame().GetMethod().Declaring ...
- Linux基础文件打包
一.打包与解压 (一).打包压缩 [root@linux ~]# tar -czf etc1.tar.gz /etc //-z 调用gzip [root@linux ~]# tar -cjf etc2 ...