笔记说明:本文档旨在系统性地梳理Java Web应用服务器Tomcat的核心概念、它与前后端技术栈的关系、从单体到微服务的架构演进,并提供基础安装、与Nginx整合以及Session共享高可用等关键实验步骤,作为学习和配置的参考手册。
第一部分:核心概念与架构
1.1 Web技术基础与演进
理解Tomcat的作用,需要先了解它所在的Web技术栈。
-
B/S模式:浏览器/服务器模式,基于HTTP协议,是当前主流。
-
前端三大核心技术
-
HTML:网页的结构骨架。
-
CSS:网页的样式美化(版本1.0/2.0/3.0)。
-
JavaScript:网页的行为引擎,Node.js的出现使其成为前后端通用语言。
-
-
同步与异步交互(Ajax)
-
同步:请求后页面阻塞等待,需整体刷新。
-
异步(Ajax) :基于
XMLHttpRequest对象,实现页面局部更新,不阻塞用户操作。
-
1.2 后台应用架构演进
Tomcat是部署Java后台应用的传统容器,其部署方式随架构演进。
-
单体架构
-
定义:所有功能模块(订单、支付、用户等)整合在一个工程中,打包为WAR包,部署在单一服务器进程(如Tomcat)中。
-
优点:开发测试简单,技术栈统一,适合小型项目。
-
缺点:模块耦合度高,一个小修改需整体重启,水平扩展时需复制整个应用。
-
代表:部署在Tomcat、Jetty等Web应用服务器。
-
-
微服务架构
-
定义:按业务边界拆分为多个独立服务,每个服务可独立开发、部署和运行。
-
核心特征:服务松耦合、独立技术栈、独立扩展、轻量级通信(通常为HTTP/RESTful)。
-
代表框架:
-
Dubbo:Java RPC框架,常配合Zookeeper,高性能。
-
Spring Cloud:微服务全家桶,基于HTTP/RESTful通信,生态丰富。
-
-
第二部分:Tomcat基础实验
2.1 Tomcat安装部署
环境准备:需要先安装JDK。
-
下载与基础部署
bash
# 安装JDK yum install java-1.8.0-openjdk.x86_64 -y # 下载并解压Tomcat 9 wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.115/bin/apache-tomcat-9.0.115.tar.gz tar zxf apache-tomcat-9.0.115.tar.gz -C /usr/local cd /usr/local && mv apache-tomcat-9.0.115 tomcat # 启动测试 /usr/local/tomcat/bin/startup.sh netstat -antlupe | grep 8080 # 验证8080端口监听 -
Systemd服务化配置(便于管理)
bash
# 创建tomcat用户并授权 useradd -s /sbin/nologin -M tomcat chown tomcat.tomcat /usr/local/tomcat -R # 创建环境变量文件 vim /usr/local/tomcat/conf/tomcat.conf JAVA_HOME=/etc/alternatives/jre # 创建systemd服务文件 vim /lib/systemd/system/tomcat.service [Unit] Description=Tomcat After=syslog.target network.target [Service] Type=forking EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf ExecStart=/usr/local/tomcat/bin/startup.sh ExecStop=/usr/local/tomcat/bin/shutdown.sh PrivateTmp=true User=tomcat Group=tomcat [Install] WantedBy=multi-user.target systemctl daemon-reload && systemctl enable --now tomcat netstat -antlupe | grep java # 验证服务启动(8005/8080端口)
第三部分:Nginx+Tomcat整合实验
3.1 单体架构整合
使用Nginx作为反向代理,将动态请求(如JSP)转发给后端的Tomcat处理。
-
Nginx配置
nginx
# 在 /usr/local/nginx/conf/conf.d/ 下创建vhosts.conf server { listen 80; server_name app.timinglee.org; location ~* \.jsp$ { proxy_pass http://172.25.254.10:8080; # 转发到Tomcat } } -
准备测试页面并验证
bash
# 在Tomcat的ROOT目录下创建测试页面 echo 'test page' > /usr/local/tomcat/webapps/ROOT/test.jsp nginx -s reload # 浏览器访问 http://app.timinglee.org/test.jsp
3.2 Tomcat负载均衡配置
当有多个Tomcat实例时,可以通过Nginx进行负载分发。
-
Nginx配置upstream
nginx
upstream tomcat { # hash $cookie_JSESSIONID; # 可选:基于Cookie的会话保持 server 172.25.254.10:8080; server 172.25.254.20:8080; } server { listen 80; server_name app.timinglee.org; location ~* \.jsp$ { proxy_pass http://tomcat; # 转发到upstream组 } } -
同步测试页面 :将
test.jsp同步到另一台Tomcat的相应目录。 -
验证:重载Nginx,用不同浏览器或工具访问,观察请求是否被分发到不同Tomcat。
第四部分:Session共享高可用实验
在负载均衡环境下,必须解决Session共享问题,确保用户请求切换到不同Tomcat时,登录状态不丢失。本实验使用Memcached作为集中式Session存储。
4.1 环境准备
-
在所有Tomcat节点安装Memcached
bash
dnf install memcached -y vim /etc/sysconfig/memcached OPTIONS="-l 0.0.0.0,::1" # 监听所有接口 systemctl enable --now memcached netstat -antlupe | grep 11211 # 验证端口 -
部署Memcached-Session-Manager jar包
-
该管理器用于将Tomcat的Session数据存储到Memcached。
-
需要将
memcached-session-manager、kryo等相关jar包复制到所有Tomcat的lib目录下。
bash
# 假设jar包已下载到当前目录 cp *.jar /usr/local/tomcat/lib/ scp *.jar root@172.25.254.20:/usr/local/tomcat/lib/ # 同步到另一节点 -
4.2 配置Tomcat会话管理器
编辑每个Tomcat的 conf/context.xml 文件,添加Manager配置。
-
RS1(172.25.254.10)配置
xml
<Context> ... <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211" failoverNodes="n1" <!-- 本机故障时,Session备份到n2 --> requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" /> </Context> -
RS2(172.25.254.20)配置
xml
<Context> ... <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcappedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211" failoverNodes="n2" <!-- 本机故障时,Session备份到n1 --> requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" /> </Context>
4.3 验证会话共享
-
重启所有Tomcat服务:
systemctl restart tomcat。 -
测试逻辑:
-
通过Nginx访问应用(如部署了一个有登录功能的Web应用),登录后产生Session。
-
模拟故障,停止当前处理请求的Tomcat节点。
-
刷新页面,请求会被Nginx转发到另一个Tomcat节点。
-
验证:登录状态应依然保持,说明Session未丢失,成功从Memcached中恢复。
-
总结
Tomcat作为经典的Java Web容器,是理解从单体应用 部署到微服务 架构演进的重要基础。在实际生产环境中,它通常位于Nginx 等反向代理之后,处理动态内容。解决负载均衡下的Session共享问题(如使用Memcached或Redis)是实现应用高可用的关键一步。