Tomcat的session(组播)复制共享

2019-01-11  本文已影响18人  宇宙小神特别萌

Window下同一台服务器部署多个tomcat服务

本文使用tomcat 8.0压缩版进行部署。

· 工具

apache-tomcat-8.0.30

1.安装tomcat步骤

​ 1. 下载apache-tomcat-8.0.30 ,下载下来的文件为apache-tomcat-8.0.30-windows-x64.zip

​ 2. 解压该压缩包到D:/目录下。

​ 3. 修改解压文件夹名字为:tomcat-8080

​ 4. 在D:/目录下创建该文件夹的两个副本,分别更名为:tomcat-8081、tomcat-8082

​ 5. 添加环境变量:右键单击我的电脑->选择属性->选择高级->选择环境变量:添加系统变量:
​ CATALINA_HOME_8080,其值为:D:\tomcat-8080;
​ CATALINA_HOME_8081,其值为:D:\tomcat-8081;
​ CATALINA_HOME_8082,其值为:D:\tomcat-8082;

​ 6. 修改启动端口和关闭端口:

​ 进入D:\tomcat-8081\conf\目录,打开server.xml文件,修改下面两个地方:

​ (1)<Server port="8006" shutdown="SHUTDOWN">
​ 修改这个port=”8006”,使得它的关闭端口和另一个关闭端口不发生冲突。

​ (2)<Connector port="8081" maxHttpHeaderSize="8192"
​ maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
​ enableLookups="false" redirectPort="8443" acceptCount="100"
​ connectionTimeout="20000" disableUploadTimeout="true" />

​ 修改port=”8081”,使得它的连接端口和另一个不冲突。

​ (3)<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
​ 修改这个port=”8010”,使得它的AJP端口和另一个不冲突。

​ 7. 修改startup.bat、shutdown.bat和catalina.bat文件内容:
​ (1) 打开D:\tomcat-8081\bin\startup.bat文件,把其中所有CATALINA_HOME替换为CATALINA_HOME_8081。
​ (2) 打开D:\tomcat-8081\bin\shutdown.bat文件,把其中所有CATALINA_HOME替换为CATALINA_HOME_8081。
​ (3) 打开D:\tomcat-8081\bin\catalina.bat文件,把其中所有CATALINA_HOME替换为CATALINA_HOME_8081。

​ 9.按照上述方法配置tomcat-8080 ,tomcat-8082。

​ 10.启动Tomcat,在命令行下分别进入三个不同的Tomcat安装目录下,执行startup.bat,分别启动三个Tomcat。然后在浏览器中输入以下内容,如果显示tomcat主页,则部署成功:
     http://localhost:8080
     http://localhost:8081
     http://localhost:8082

2.将tomcat配置成服务

​ 1.进入tomcat-8080/bin目录,修改 service.bat,找到以下内容,修改SERVICE_NAME为自定义的服务名

​ rem Set default Service name
​ set SERVICE_NAME=tomcat8080
​ set DISPLAYNAME=Apache Tomcat 8.0 %SERVICE_NAME%

​ 2.在service.bat中搜索CATALINA_HOME,并全部替换为CATALINA_HOME_8080(与环境变量名保持一致)

​ 3.在tomcat-8080/bin目录下,找到tomcat8.exe和tomcat8w.exe,重命名为SERVICE_NAME配置的名字一致,这里重命名为tomcat8080.exe和tomcat8080w.exe

​ 4.使用命令行进入tomcat-8080/bin,执行service.bat install

​ 5.使用win+r输入services.msc进入服务界面,找到DISPLAYNAME对应的服务名(即Apache Tomcat 8.0 tomcat8080),右键选择“属性”菜单,在“常规”选项卡选择“启动类型”为“自动”,或者进入tomcat-8080/bin目录 ,双击tomcat8080w.exe,在弹出的界面选中General选项卡,选择Startup type为Automatic,即开机自启动

tomcat服务启动

· 至此,我们已经在一台服务器上配置了三个Tomcat。

3.配置tomcat集群session复制共享

一般来说做nginx负载均衡,会用到。
现在用tomcat8081、8082做session复制:分别配置这两个tomcat的server.xml。

找到tomcat安装路径,打开conf文件夹下的server.xml
在此句下方<Engine name="Catalina" defaultHost="localhost">粘贴进去以下内容,内容一般不用修改


    <!--##################start配置tomcat集群8082、8083######################-->
    <!-- 用于Session复制 -->
    <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"/>
            <!--这里如果启动出现异常,则可以尝试把address中的"auto"改为"localhost"-->
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="localhost"
                      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>
        <!--address="228.0.0.4"  保留ip,用于广播-->
        <!--Receiver.port=4000  在一台电脑上部署两个tomcat做负载均衡,此端口不能相同 -->
        <!-- 第2步:在web.xml中添加如下节点 -->
        <!-- 用于Session复制 -->
        <!-- <distributable/> -->

<!--#########################end配置tomcat集群######################-->

4.创建一个spring的web项目

将这个项目放别放到tomcat8081、8082中

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()%>
<BR>
<h1>这是aaaaa</h1>
</body>
</html>

或者写个session创建的监听类

MySessionListener.java

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class MySessionListener implements HttpSessionListener {

    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
       //MySessionContext.AddSession(httpSessionEvent.getSession());
       //当有session创建就会打印
        System.out.println("sessionidall:===="+httpSessionEvent.getSession().getId());
    }

    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
//        HttpSession session = httpSessionEvent.getSession();
       // MySessionContext.DelSession(session);
    }
}

项目中web.xml里配置:<distributable/> 标签:session复制

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <distributable/>
    <listener>
        <listener-class>MySessionListener</listener-class>
    </listener>
</web-app>

将这个spring项目放在tomcat8081、8082中,分别启动tomcat8081和tomcat8082.
访问http://localhost:8081/sessiontest/index.jsphttp://localhost:8082/sessiontest/index.jsp
看到的sessionId是一样的就OK了。

上一篇 下一篇

猜你喜欢

热点阅读