• 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的内容如下:

    [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">  

    不需要做任何修改,在这一行的下面加入如下代码:

    [html] view plain copy
     
    1. <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"  
    2.                 channelSendOptions="8">  
    3.   
    4.          <Manager className="org.apache.catalina.ha.session.DeltaManager"  
    5.                   expireSessionsOnShutdown="false"  
    6.                   notifyListenersOnReplication="true"/>  
    7.   
    8.          <Channel className="org.apache.catalina.tribes.group.GroupChannel">  
    9.            <Membership className="org.apache.catalina.tribes.membership.McastService"  
    10.                        address="228.0.0.4"  
    11.                        port="45564"  
    12.                        frequency="500"  
    13.                        dropTime="3000"/>  
    14.            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"  
    15.                      address="auto"  
    16.                      port="4000"  
    17.                      autoBind="100"  
    18.                      selectorTimeout="5000"  
    19.                      maxThreads="6"/>  
    20.   
    21.            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">  
    22.            <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>  
    23.            </Sender>  
    24.            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>  
    25.            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>  
    26.          </Channel>  
    27.   
    28.          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"  
    29.                 filter=""/>  
    30.          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>  
    31.   
    32.          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"  
    33.                    tempDir="/tmp/war-temp/"  
    34.                    deployDir="/tmp/war-deploy/"  
    35.                    watchDir="/tmp/war-listen/"  
    36.                    watchEnabled="false"/>  
    37.   
    38.          <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>  
    39.          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>  
    40.        </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中需要加这么元素:

    总结

  • 相关阅读:
    php-浅谈php底层机制
    Apache-三种工作模式(prefork/ worker/Event)
    java入门了解01
    webserivce通过httppost方式调用
    sqlserver 打开 database diagrams 报错:error code 0x54b
    redhat7,redhat6 替换yum
    虚拟机网络配置的一点总结
    搭建sqlserver AlwaysOn
    NSSM-将服务变为window service
    JavaMelody-监控jvm性能
  • 原文地址:https://www.cnblogs.com/taiyanhong/p/6951162.html
Copyright © 2020-2023  润新知