Tomcat 集群搭建
参考资料
环境准备
- 确保本地已安装 JDK 1.8
- 下载 apache-tomcat-8.5.61并解压到本地
- web 应用(提供修改和查看 session 内容的服务)
搭建步骤
服务器资源有限,Tomcat 集群的 3 个实例搭建在本地。
1 web 应用
准备一个普通的 Spring Web MVC 应用即可。需要着重改造的点有:
- 添加 Controller 操作 HttpSession
- src/main/webapp/WEB-INF/web.xml 添加
<distributable/>
标签
Controller
提供 2 个接口用于通过浏览器操作 HttpSession:
/session/{key}/{value}
: 设置 session 属性 {key} 的值为/session/{key}
: 获取 session 属性
@Controller
@RequestMapping("/session")
public class SessionReplicaController {
@GetMapping("/{key}")
public void getSession(@PathVariable("key") String key, HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession();
String attributeValue = (String)session.getAttribute(key);
try {
response.getWriter().write("get attribute [" + key + "] from session ,value: " + attributeValue);
response.getWriter().flush();
response.getWriter().close();
} catch (IOException e) {
e.printStackTrace();
}
}
@GetMapping("/{key}/{value}")
public void setSession(@PathVariable("key") String key, @PathVariable("value") String value, HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession();
session.setAttribute(key, value);
try {
response.getWriter().write("setSession - key: " + key + ", value: " + value);
response.getWriter().flush();
response.getWriter().close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
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>
...
<distributable/>
...
</web-app>
2 Tomcat 集群
集群示意图
2.1 Tomcat 实例1
本地 Tomcat 安装目录:C:\work\soft\apache-tomcat-8.5.61
2.1.1 创建实例目录
创建目录 C:\work\soft\apache-tomcat-8-1
用于存放 tomcat 实例1 内容。
2.1.2 拷贝配置文件到实例目录
将 Tomcat 安装目录下的 conf 文件夹拷贝到 实例目录下:
即 C:\work\soft\apache-tomcat-8.5.61\conf
拷贝到C:\work\soft\apache-tomcat-8-1\conf
2.1.3 调整实例配置文件
主要是调整 conf/server.xml 文件中占用端口、应用上下文和集群配置。
调整占用端口
- 调整 Server 实例关闭端口为 9005
<Server port="9005" shutdown="SHUTDOWN">
...
</Server>
- 调整 Connector 端口为 9081
<Connector port="9081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
添加应用上下文
<Host>
...
<!-- 定义应哟目录 api 和应用上下文 '/api' -->
<Context docBase="api" path="/api"></Context>
...
</Host>
添加集群配置
<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">
<!-- 指定组播地址 228.0.0.4:45564 -->
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<!-- 监听 4000~4100 任一端口,接收组播消息 -->
<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.MessageDispatchInterceptor"/>
</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.ClusterSessionListener"/>
</Cluster>
...
</Engine>
2.1.4 部署 web 应用
将 《1 web 应用》打包成 api.war 放于 tomcat 实例 1 目录(C:\work\soft\apache-tomcat-8-1\webapps)下。
2.1.5 启动 tomcat 实例 1
cd C:\work\soft\apache-tomcat-8.5.61
set CATALINA_BASE=C:\work\soft\apache-tomcat-8-1
bin\startup.bat
2.2 Tomcat 实例2
和实例 1 配置步骤一致,但是需要调整占用的端口,避免启动时报端口冲突。
2.2.1 创建实例目录
创建目录 C:\work\soft\apache-tomcat-8-2
用于存放 tomcat 实例2 内容。
2.2.2 拷贝实例1 的配置文件到实例 2 目录
将 Tomcat 实例 1 下的 conf 文件夹拷贝到 实例目录下:
即 C:\work\soft\apache-tomcat-8-1\conf
拷贝到C:\work\soft\apache-tomcat-8-2\conf
2.2.3 调整实例配置文件
主要是调整 conf/server.xml 文件中占用端口、应用上下文和集群配置。
调整占用端口
- 调整 Server 实例关闭端口为 9006
<Server port="9006" shutdown="SHUTDOWN">
...
</Server>
- 调整 Connector 端口为 9082
<Connector port="9082" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
添加应用上下文(如已配置可跳过)
<Host>
...
<!-- 定义应哟目录 api 和应用上下文 '/api' -->
<Context docBase="api" path="/api"></Context>
...
</Host>
调整集群端口
<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">
<!-- 指定组播地址 228.0.0.4:45564 -->
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<!-- 监听 4200~4300 任一端口,接收组播消息 -->
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4200"
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.MessageDispatchInterceptor"/>
</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.ClusterSessionListener"/>
</Cluster>
...
</Engine>
2.2.4 部署 web 应用
将 《1 web 应用》打包成 api.war 放于 tomcat 实例 2 目录(C:\work\soft\apache-tomcat-8-2\webapps)下。
2.1.5 启动 tomcat 实例 2
cd C:\work\soft\apache-tomcat-8.5.61
set CATALINA_BASE=C:\work\soft\apache-tomcat-8-2
bin\startup.bat
控制台打印:
01-Sep-2023 08:26:06.706 信息 [main] org.apache.catalina.ha.tcp.SimpleTcpCluster.startInternal 群集即将启动
01-Sep-2023 08:26:06.723 信息 [main] org.apache.catalina.tribes.transport.ReceiverBase.bind 服务器套接字接收器绑定到:[/192.168.1.3:4200]
01-Sep-2023 08:26:06.731 信息 [main] org.apache.catalina.tribes.membership.McastServiceImpl.setupSocket 设置集群多播超时时间:[500]
01-Sep-2023 08:26:06.733 信息 [main] org.apache.catalina.tribes.membership.McastServiceImpl.waitForMembers 休眠[1000]毫秒后启动连接集群,启动登记:[4]
01-Sep-2023 08:26:07.211 信息 [Membership-MemberAdded.] org.apache.catalina.ha.tcp.SimpleTcpCluster.memberAdded 添加同步成员:[org.apache.catalina.tribes.membership.MemberImpl[tcp://{192, 168, 1, 3}:4000,{192, 168, 1, 3},4000, alive=797912, securePort=-1, UDP Port=-1, id={-118 86 -88 -8 -75 91 79 99 -77 114 104 -107 124 -35 -123 64 }, payload={}, command={}, domain={}]]
01-Sep-2023 08:26:07.735 信息 [main] org.apache.catalina.tribes.membership.McastServiceImpl.waitForMembers 休眠完毕,成员已连接,启动等级:[4]
01-Sep-2023 08:26:08.879 信息 [main] org.apache.catalina.tribes.membership.McastServiceImpl.waitForMembers 休眠[1000]毫秒后启动连接集群,启动登记:[8]
01-Sep-2023 08:26:08.888 信息 [Tribes-Task-Receiver[Catalina-Channel]-1] org.apache.catalina.tribes.io.BufferPool.getBufferPool 已创建缓冲池,最大大小为:[104857600]字节,类型为:[org.apache.catalina.tribes.io.BufferPool15Impl]
01-Sep-2023 08:26:09.887 信息 [main] org.apache.catalina.tribes.membership.McastServiceImpl.waitForMembers 休眠完毕,成员已连接,启动等级:[8]
01-Sep-2023 08:26:09.890 严重 [main] org.apache.catalina.ha.deploy.FarmWarDeployer.start FarmWarDeployer 只有做为 host cluster 的子元素是才生效
2.3 Tomcat 实例3
和实例 1 配置步骤一致,但是需要调整占用的端口,避免启动时报端口冲突。
2.3.1 创建实例目录
创建目录 C:\work\soft\apache-tomcat-8-3
用于存放 tomcat 实例3 内容。
2.3.2 拷贝实例1 的配置文件到实例 2 目录
将 Tomcat 实例 1 下的 conf 文件夹拷贝到 实例目录下:
即 C:\work\soft\apache-tomcat-8-1\conf
拷贝到C:\work\soft\apache-tomcat-8-3\conf
2.3.3 调整实例配置文件
主要是调整 conf/server.xml 文件中占用端口、应用上下文和集群配置。
调整占用端口
- 调整 Server 实例关闭端口为 9007
<Server port="9007" shutdown="SHUTDOWN">
...
</Server>
- 调整 Connector 端口为 9083
<Connector port="9083" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
添加应用上下文(如已配置可跳过)
<Host>
...
<!-- 定义应哟目录 api 和应用上下文 '/api' -->
<Context docBase="api" path="/api"></Context>
...
</Host>
调整集群端口
<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">
<!-- 指定组播地址 228.0.0.4:45564 -->
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<!-- 监听 4300~4400 任一端口,接收组播消息 -->
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4200"
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.MessageDispatchInterceptor"/>
</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.ClusterSessionListener"/>
</Cluster>
...
</Engine>
2.3.4 部署 web 应用
将 《1 web 应用》打包成 api.war 放于 tomcat 实例 3 目录(C:\work\soft\apache-tomcat-8-3\webapps)下。
2.3.5 启动 tomcat 实例 3
cd C:\work\soft\apache-tomcat-8.5.61
set CATALINA_BASE=C:\work\soft\apache-tomcat-8-3
bin\startup.bat
控制台打印:
01-Sep-2023 08:34:55.031 信息 [main] org.apache.catalina.ha.tcp.SimpleTcpCluster.startInternal 群集即将启动
01-Sep-2023 08:34:55.050 信息 [main] org.apache.catalina.tribes.transport.ReceiverBase.bind 服务器套接字接收器绑定到:[/192.168.1.3:4300]
01-Sep-2023 08:34:55.058 信息 [main] org.apache.catalina.tribes.membership.McastServiceImpl.setupSocket 设置集群多播超时时间:[500]
01-Sep-2023 08:34:55.060 信息 [main] org.apache.catalina.tribes.membership.McastServiceImpl.waitForMembers 休眠[1000]毫秒后启动连接集群,启动登记:[4]
01-Sep-2023 08:34:55.473 信息 [Membership-MemberAdded.] org.apache.catalina.ha.tcp.SimpleTcpCluster.memberAdded 添加同步成员:[org.apache.catalina.tribes.membership.MemberImpl[tcp://{192, 168, 1, 3}:4200,{192, 168, 1, 3},4200, alive=528738, securePort=-1, UDP Port=-1, id={13 -55 -106 -62 -3 -93 64 -108 -108 -68 -18 19 -25 60 46 -46 }, payload={}, command={}, domain={}]]
01-Sep-2023 08:34:55.483 信息 [Membership-MemberAdded.] org.apache.catalina.ha.tcp.SimpleTcpCluster.memberAdded 添加同步成员:[org.apache.catalina.tribes.membership.MemberImpl[tcp://{192, 168, 1, 3}:4000,{192, 168, 1, 3},4000, alive=1326191, securePort=-1, UDP Port=-1, id={-118 86 -88 -8 -75 91 79 99 -77 114 104 -107 124 -35 -123 64 }, payload={}, command={}, domain={}]]
01-Sep-2023 08:34:56.060 信息 [main] org.apache.catalina.tribes.membership.McastServiceImpl.waitForMembers 休眠完毕,成员已连接,启动等级:[4]
01-Sep-2023 08:34:56.062 信息 [main] org.apache.catalina.tribes.membership.McastServiceImpl.waitForMembers 休眠[1000]毫秒后启动连接集群,启动登记:[8]
01-Sep-2023 08:34:56.067 信息 [Tribes-Task-Receiver[Catalina-Channel]-1] org.apache.catalina.tribes.io.BufferPool.getBufferPool 已创建缓冲池,最大大小为:[104857600]字节,类型为:[org.apache.catalina.tribes.io.BufferPool15Impl]
01-Sep-2023 08:34:57.078 信息 [main] org.apache.catalina.tribes.membership.McastServiceImpl.waitForMembers 休眠完毕,成员已连接,启动等级:[8]
3 验证
3.1 方案
- 实例1 用于设置 session 的值
- 实例 2、实例 3 用于获取 session 的值
3.2 实例 1 设置 name = black
访问:http://localhost:9081/api/session/name/black
3.3 实例 2 获取 session 中 name 属性的值
访问:http://localhost:9082/api/session/name
3.4 实例 3 获取 session 中 name 属性的值
访问:http://localhost:9083/api/session/name
至此,验证结束。
本文来自博客园,作者:不安分的黑娃,转载请注明原文链接:https://www.cnblogs.com/lihw-study/p/17670889.html