目录大纲
Part01-基础概念与理论知识
1.1 企业级应用部署基本概念
企业级应用部署是指将企业级应用部署到生产环境的过程,主要特点包括:
- 高可用性:确保应用的高可用性
- 高性能:确保应用的高性能
- 可扩展性:支持应用的扩展
- 安全性:确保应用的安全性
- 可维护性:便于应用的维护
企业级应用部署的原则包括:
- 标准化:使用标准化的部署流程
- 自动化:使用自动化工具
- 监控:监控应用运行状态
- 备份:定期备份应用和数据
- 文档:完善部署文档
更多视频教程www.fgedu.net.cn
1.2 Tomcat企业级应用部署
Tomcat企业级应用部署包括以下方面:
- 集群部署:使用Tomcat集群提高可用性
- 负载均衡:使用负载均衡器分发请求
- 会话复制:使用会话复制保持会话一致性
- 缓存优化:使用缓存提高性能
- 安全加固:加固Tomcat安全性
Tomcat企业级应用部署的特点:
- 高可用:支持高可用部署
- 高性能:支持高性能配置
- 可扩展:支持水平扩展
- 安全:支持安全加固
- 易管理:便于管理和维护
1.3 面试要点
Tomcat面试的要点包括:
- 基础概念:Tomcat的基本概念和架构
- 配置管理:Tomcat的配置和管理
- 性能优化:Tomcat的性能优化
- 集群部署:Tomcat的集群部署
- 故障处理:Tomcat的故障处理
面试准备的建议:
- 理论实践结合:理论知识和实践经验结合
- 案例分析:准备实际案例分析
- 问题解决:准备问题解决思路
- 沟通表达:提高沟通表达能力
- 持续学习:持续学习新技术
1.4 企业级应用架构
企业级应用架构包括以下组件:
- 负载均衡器:分发请求到多个服务器
- 应用服务器:运行应用的服务器
- 数据库服务器:存储数据的服务器
- 缓存服务器:缓存数据的服务器
- 监控服务器:监控应用的服务器
企业级应用架构的设计原则:
- 分层架构:使用分层架构
- 服务化:使用服务化架构
- 微服务:使用微服务架构
- 容器化:使用容器化部署
- 自动化:使用自动化运维
风哥提示:企业级应用部署是Tomcat运维的重要工作,合理的企业级应用部署可以显著提高应用的可用性和性能
Part02-生产环境规划与建议
2.1 企业级应用部署建议
在生产环境中,企业级应用部署的建议:
- 使用集群:使用Tomcat集群提高可用性
- 配置负载均衡:配置负载均衡器
- 配置会话复制:配置会话复制
- 配置缓存:配置缓存提高性能
- 配置监控:配置监控和告警
2.2 面试准备建议
面试准备的建议:
- 准备案例:准备实际案例
- 准备问题:准备常见问题
- 准备答案:准备问题答案
- 模拟面试:进行模拟面试
- 总结经验:总结面试经验
2.3 运维管理建议
运维管理的建议:
- 定期巡检:定期巡检系统
- 定期备份:定期备份配置和数据
- 定期更新:定期更新系统和软件
- 定期演练:定期进行故障演练
- 定期总结:定期总结运维经验
学习交流加群风哥QQ113257174
Part03-生产环境项目实施方案
3.1 企业级应用部署步骤
企业级应用部署的步骤如下:
- 需求分析:分析应用需求
- 架构设计:设计应用架构
- 环境准备:准备部署环境
- 应用部署:部署应用
- 测试验证:测试和验证
3.2 面试演练步骤
面试演练的步骤:
- 自我介绍:准备自我介绍
- 技术问题:准备技术问题
- 案例分析:准备案例分析
- 问题解决:准备问题解决
- 总结提问:准备总结和提问
3.3 部署验证与测试
部署完成后,需要进行以下验证和测试:
- 功能测试:测试应用功能
- 性能测试:测试应用性能
- 安全测试:测试应用安全性
- 压力测试:测试应用稳定性
- 故障测试:测试故障处理
Part04-生产案例与实战讲解
4.1 企业级应用部署实战
以下是企业级应用部署的实战案例:
# 安装Tomcat(参考Tomcat-002和Tomcat-003)
# 配置集群(参考Tomcat-019)
# 配置负载均衡(参考Tomcat-020)
# 2. 创建应用
mkdir -p /Tomcat/app/webapps/fgedu_enterprise
cd /Tomcat/app/webapps/fgedu_enterprise
# 3. 创建企业级应用
cat > index.html << EOF
FGEDU Enterprise Application
This is an enterprise-level application running on Tomcat cluster
Cluster Status: Active
Load Balancer: Active
Session Replication: Active
EOF
# 4. 配置Tomcat集群
# 在server.xml中配置集群(参考Tomcat-019)
cat > /Tomcat/app/conf/server.xml << EOF
EOF
# 5. 配置负载均衡器
# 使用Nginx作为负载均衡器
cat > /etc/nginx/conf.d/fgedu_tomcat.conf << EOF
upstream fgedu_tomcat {
server 192.168.1.11:8080 weight=1 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 weight=1 max_fails=3 fail_timeout=30s;
server 192.168.1.13:8080 weight=1 max_fails=3 fail_timeout=30s;
keepalive 32;
}
server {
listen 80;
server_name fgedu.net.cn;
location / {
proxy_pass http://fgedu_tomcat;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_busy_buffers_size 8k;
}
}
EOF
# 6. 重启Tomcat服务
/Tomcat/app/bin/shutdown.sh
/Tomcat/app/bin/startup.sh
# 7. 重启Nginx服务
systemctl restart nginx
# 8. 查看Tomcat日志
tail -f /Tomcat/app/logs/catalina.out
# 输出示例:
21-Jul-2024 11:00:00.000 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name: Apache Tomcat/11.0.9
21-Jul-2024 11:00:00.000 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Jul 21 2024 10:00:00 UTC
21-Jul-2024 11:00:00.000 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server number: 11.0.9.0
21-Jul-2024 11:00:00.000 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Linux
21-Jul-2024 11:00:00.000 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version: 5.15.0-105-generic
21-Jul-2024 11:00:00.000 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture: amd64
21-Jul-2024 11:00:00.000 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version: 17.0.8+7
21-Jul-2024 11:00:00.000 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor: Eclipse Adoptium
21-Jul-2024 11:00:00.000 INFO [main] org.apache.catalina.tribes.transport.ReplicationTransmitter.start ReplicationTransmitter started
21-Jul-2024 11:00:00.000 INFO [main] org.apache.catalina.tribes.group.interceptors.TcpFailureDetector.start TcpFailureDetector started
21-Jul-2024 11:00:00.000 INFO [main] org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor.start MessageDispatch15Interceptor started
21-Jul-2024 11:00:00.000 INFO [main] org.apache.catalina.tribes.group.GroupChannel.start GroupChannel started
21-Jul-2024 11:00:00.000 INFO [main] org.apache.catalina.ha.tcp.SimpleTcpCluster.start Cluster is now active
# 9. 测试应用
curl http://fgedu.net.cn/fgedu_enterprise/
# 输出示例:
FGEDU Enterprise Application
This is an enterprise-level application running on Tomcat cluster
Cluster Status: Active
Load Balancer: Active
Session Replication: Active
# 10. 测试负载均衡
for i in {1..10}; do curl http://fgedu.net.cn/fgedu_enterprise/ | grep “Server ID”; done
# 输出示例:
4.2 面试演练实战
以下是面试演练的实战案例:
# 答案:
# Tomcat的架构主要包括以下几个核心组件:
# 1. Server:代表整个Tomcat容器,包含一个或多个Service
# 2. Service:包含一个Connector和一个Engine
# 3. Connector:负责处理客户端的连接和请求
# 4. Engine:处理请求的容器,包含一个或多个Host
# 5. Host:代表一个虚拟主机,包含一个或多个Context
# 6. Context:代表一个Web应用
# 7. Valve:拦截器,用于处理请求和响应
# 8. Realm:用于用户认证和授权
# 面试问题2:如何优化Tomcat的性能?
# 答案:
# Tomcat性能优化可以从以下几个方面入手:
# 1. JVM优化:调整JVM参数,如-Xms、-Xmx、-XX:NewSize等
# 2. 连接器优化:调整Connector参数,如maxThreads、acceptCount等
# 3. 线程池优化:调整线程池参数,如minSpareThreads、maxSpareThreads等
# 4. 缓存优化:启用缓存,如静态资源缓存、JSP编译缓存等
# 5. APR优化:使用APR提高IO性能
# 6. NIO优化:使用NIO连接器提高并发性能
# 7. 数据库优化:优化数据库连接池,如maxActive、maxIdle等
# 8. 应用优化:优化应用代码,减少不必要的请求和计算
# 面试问题3:如何配置Tomcat集群?
# 答案:
# Tomcat集群配置主要包括以下几个步骤:
# 1. 配置Cluster:在server.xml中配置Cluster元素
# 2. 配置Manager:配置会话管理器,如DeltaManager
# 3. 配置Channel:配置集群通信通道
# 4. 配置Membership:配置集群成员发现
# 5. 配置Receiver:配置集群消息接收器
# 6. 配置Sender:配置集群消息发送器
# 7. 配置Valve:配置集群拦截器
# 8. 配置Deployer:配置集群部署器
# 9. 配置ClusterListener:配置集群监听器
# 10. 配置负载均衡器:配置负载均衡器分发请求
# 面试问题4:如何处理Tomcat的内存溢出?
# 答案:
# Tomcat内存溢出处理方法:
# 1. 分析内存溢出原因:使用jmap、jstack等工具分析
# 2. 调整JVM参数:增加堆内存,如-Xmx
# 3. 优化应用代码:减少内存使用,避免内存泄漏
# 4. 配置内存监控:使用JMX监控内存使用情况
# 5. 配置内存告警:配置内存使用告警
# 6. 配置自动重启:配置OOM自动重启
# 7. 配置内存分析:配置内存dump分析
# 8. 配置内存优化:配置内存优化策略
# 面试问题5:如何配置Tomcat的SSL/TLS?
# 答案:
# Tomcat SSL/TLS配置方法:
# 1. 生成证书:使用keytool或openssl生成证书
# 2. 配置HTTPS连接器:在server.xml中配置HTTPS连接器
# 3. 配置SSL参数:配置SSL协议、加密套件等
# 4. 配置证书:配置证书路径和密码
# 5. 配置客户端认证:配置客户端认证(可选)
# 6. 配置SSL重定向:配置HTTP到HTTPS重定向
# 7. 配置SSL日志:配置SSL访问日志
# 8. 测试SSL配置:使用openssl或浏览器测试
# 面试问题6:如何监控Tomcat的运行状态?
# 答案:
# Tomcat监控方法:
# 1. 使用JMX:启用JMX,使用JConsole或VisualVM监控
# 2. 使用Tomcat Manager:使用Tomcat Manager应用监控
# 3. 使用日志分析:分析Tomcat日志文件
# 4. 使用第三方工具:使用Nagios、Zabbix等监控工具
# 5. 使用APM工具:使用New Relic、AppDynamics等APM工具
# 6. 配置监控指标:监控CPU、内存、线程、连接等指标
# 7. 配置告警:配置监控告警
# 8. 配置报表:配置监控报表
# 面试问题7:如何部署Tomcat应用?
# 答案:
# Tomcat应用部署方法:
# 1. WAR包部署:将WAR包放到webapps目录
# 2. 目录部署:将应用目录放到webapps目录
# 3. Manager部署:使用Tomcat Manager应用部署
# 4. 静态部署:在server.xml中配置Context
# 5. 自动部署:配置autoDeploy自动部署
# 6. 滚动部署:使用滚动部署减少停机时间
# 7. 蓝绿部署:使用蓝绿部署实现零停机
# 8. 金丝雀部署:使用金丝雀部署降低风险
# 面试问题8:如何处理Tomcat的故障?
# 答案:
# Tomcat故障处理方法:
# 1. 分析日志:分析Tomcat日志文件
# 2. 检查配置:检查Tomcat配置文件
# 3. 检查资源:检查CPU、内存、磁盘等资源
# 4. 检查网络:检查网络连接和防火墙
# 5. 重启服务:尝试重启Tomcat服务
# 6. 回滚版本:回滚到上一个稳定版本
# 7. 切换节点:切换到其他集群节点
# 8. 联系支持:联系技术支持
4.3 运维管理实战
以下是运维管理的实战案例:
cat > /Tomcat/app/bin/ops_check.sh << 'EOF' #!/bin/bash # ops_check.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn # Tomcat运维检查脚本 # 定义变量 TOMCAT_HOME="/Tomcat/app" LOG_DIR="/Tomcat/fgdata/logs" ALERT_EMAIL="admin@fgedu.net.cn" # 检查Tomcat进程 check_tomcat_process() { echo "Checking Tomcat process..." if pgrep -f "catalina" > /dev/null; then
echo “Tomcat process is running”
else
echo “ERROR: Tomcat process is not running”
echo “Tomcat process is not running” | mail -s “Tomcat Alert” $ALERT_EMAIL
fi
}
# 检查Tomcat端口
check_tomcat_port() {
echo “Checking Tomcat port…”
if netstat -tuln | grep “:8080” > /dev/null; then
echo “Tomcat port 8080 is listening”
else
echo “ERROR: Tomcat port 8080 is not listening”
echo “Tomcat port 8080 is not listening” | mail -s “Tomcat Alert” $ALERT_EMAIL
fi
}
# 检查Tomcat日志
check_tomcat_log() {
echo “Checking Tomcat log…”
if grep -i “ERROR” $LOG_DIR/catalina.out | tail -20; then
echo “WARNING: Found errors in Tomcat log”
echo “Found errors in Tomcat log” | mail -s “Tomcat Alert” $ALERT_EMAIL
else
echo “No errors found in Tomcat log”
fi
}
# 检查磁盘空间
check_disk_space() {
echo “Checking disk space…”
DISK_USAGE=$(df -h $TOMCAT_HOME | tail -1 | awk ‘{print $5}’ | sed ‘s/%//’)
if [ $DISK_USAGE -gt 80 ]; then
echo “WARNING: Disk usage is ${DISK_USAGE}%”
echo “Disk usage is ${DISK_USAGE}%” | mail -s “Tomcat Alert” $ALERT_EMAIL
else
echo “Disk usage is ${DISK_USAGE}%”
fi
}
# 检查内存使用
check_memory_usage() {
echo “Checking memory usage…”
MEM_USAGE=$(free | grep Mem | awk ‘{printf “%.0f”, $3/$2 * 100.0}’)
if [ $MEM_USAGE -gt 80 ]; then
echo “WARNING: Memory usage is ${MEM_USAGE}%”
echo “Memory usage is ${MEM_USAGE}%” | mail -s “Tomcat Alert” $ALERT_EMAIL
else
echo “Memory usage is ${MEM_USAGE}%”
fi
}
# 检查CPU使用
check_cpu_usage() {
echo “Checking CPU usage…”
CPU_USAGE=$(top -bn1 | grep “Cpu(s)” | awk ‘{print $2}’ | sed ‘s/%us,//’)
if (( $(echo “$CPU_USAGE > 80” | bc -l) )); then
echo “WARNING: CPU usage is ${CPU_USAGE}%”
echo “CPU usage is ${CPU_USAGE}%” | mail -s “Tomcat Alert” $ALERT_EMAIL
else
echo “CPU usage is ${CPU_USAGE}%”
fi
}
# 主函数
main() {
echo “=========================================”
echo “Tomcat Operations Check”
echo “Date: $(date)”
echo “=========================================”
check_tomcat_process
check_tomcat_port
check_tomcat_log
check_disk_space
check_memory_usage
check_cpu_usage
echo “=========================================”
echo “Check completed”
echo “=========================================”
}
# 执行主函数
main
EOF
# 2. 设置脚本权限
chmod +x /Tomcat/app/bin/ops_check.sh
# 3. 执行运维检查
/Tomcat/app/bin/ops_check.sh
# 输出示例:
=========================================
Tomcat Operations Check
Date: Sun Jul 21 11:00:00 CST 2024
=========================================
Checking Tomcat process…
Tomcat process is running
Checking Tomcat port…
Tomcat port 8080 is listening
Checking Tomcat log…
No errors found in Tomcat log
Checking disk space…
Disk usage is 45%
Checking memory usage…
Memory usage is 65%
Checking CPU usage…
CPU usage is 25%
=========================================
Check completed
=========================================
# 4. 配置定时任务
crontab -e
# 添加以下内容:
# 每天早上8点执行运维检查
0 8 * * * /Tomcat/app/bin/ops_check.sh >> /Tomcat/fgdata/logs/ops_check.log 2>&1
# 5. 创建备份脚本
cat > /Tomcat/app/bin/ops_backup.sh << 'EOF'
#!/bin/bash
# ops_backup.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# Tomcat运维备份脚本
# 定义变量
TOMCAT_HOME="/Tomcat/app"
BACKUP_DIR="/Tomcat/backup"
DATE=$(date +%Y%m%d_%H%M%S)
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份配置文件
echo "Backing up configuration files..."
tar czf $BACKUP_DIR/tomcat_conf_$DATE.tar.gz $TOMCAT_HOME/conf
# 备份应用
echo "Backing up applications..."
tar czf $BACKUP_DIR/tomcat_apps_$DATE.tar.gz $TOMCAT_HOME/webapps
# 备份日志
echo "Backing up logs..."
tar czf $BACKUP_DIR/tomcat_logs_$DATE.tar.gz $TOMCAT_HOME/logs
# 清理旧备份(保留7天)
echo "Cleaning old backups..."
find $BACKUP_DIR -name "tomcat_*.tar.gz" -mtime +7 -delete
echo "Backup completed: $DATE"
EOF
# 6. 设置脚本权限
chmod +x /Tomcat/app/bin/ops_backup.sh
# 7. 执行备份
/Tomcat/app/bin/ops_backup.sh
# 输出示例:
Backing up configuration files...
Backing up applications...
Backing up logs...
Cleaning old backups...
Backup completed: 20240721_110000
# 8. 配置定时备份
crontab -e
# 添加以下内容:
# 每天凌晨2点执行备份
0 2 * * * /Tomcat/app/bin/ops_backup.sh >> /Tomcat/fgdata/logs/ops_backup.log 2>&1
# 9. 查看备份文件
ls -lh /Tomcat/backup/
# 输出示例:
total 120M
-rw-r–r– 1 root root 45M Jul 21 02:00 tomcat_apps_20240721_020000.tar.gz
-rw-r–r– 1 root root 30M Jul 21 02:00 tomcat_conf_20240721_020000.tar.gz
-rw-r–r– 1 root root 45M Jul 21 02:00 tomcat_logs_20240721_020000.tar.gz
# 10. 创建监控脚本
cat > /Tomcat/app/bin/ops_monitor.sh << 'EOF'
#!/bin/bash
# ops_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# Tomcat运维监控脚本
# 定义变量
TOMCAT_HOME="/Tomcat/app"
LOG_DIR="/Tomcat/fgdata/logs"
PID_FILE="$TOMCAT_HOME/temp/tomcat.pid"
# 获取Tomcat PID
get_tomcat_pid() {
if [ -f $PID_FILE ]; then
cat $PID_FILE
else
pgrep -f "catalina" | head -1
fi
}
# 监控Tomcat进程
monitor_tomcat_process() {
local pid=$(get_tomcat_pid)
if [ -z "$pid" ]; then
echo "ERROR: Tomcat process not found"
return 1
fi
echo "Tomcat PID: $pid"
ps -p $pid -o pid,ppid,cmd,%cpu,%mem,etime
}
# 监控Tomcat线程
monitor_tomcat_threads() {
local pid=$(get_tomcat_pid)
if [ -z "$pid" ]; then
echo "ERROR: Tomcat process not found"
return 1
fi
echo "Tomcat threads:"
ps -eLf | grep $pid | wc -l
}
# 监控Tomcat连接
monitor_tomcat_connections() {
local pid=$(get_tomcat_pid)
if [ -z "$pid" ]; then
echo "ERROR: Tomcat process not found"
return 1
fi
echo "Tomcat connections:"
netstat -anp | grep $pid | grep ESTABLISHED | wc -l
}
# 监控Tomcat堆内存
monitor_tomcat_heap() {
local pid=$(get_tomcat_pid)
if [ -z "$pid" ]; then
echo "ERROR: Tomcat process not found"
return 1
fi
echo "Tomcat heap memory:"
jstat -gc $pid | tail -1
}
# 监控TomcatGC
monitor_tomcat_gc() {
local pid=$(get_tomcat_pid)
if [ -z "$pid" ]; then
echo "ERROR: Tomcat process not found"
return 1
fi
echo "Tomcat GC:"
jstat -gcutil $pid | tail -1
}
# 主函数
main() {
echo "========================================="
echo "Tomcat Operations Monitor"
echo "Date: $(date)"
echo "========================================="
monitor_tomcat_process
echo ""
monitor_tomcat_threads
echo ""
monitor_tomcat_connections
echo ""
monitor_tomcat_heap
echo ""
monitor_tomcat_gc
echo "========================================="
echo "Monitor completed"
echo "========================================="
}
# 执行主函数
main
EOF
# 11. 设置脚本权限
chmod +x /Tomcat/app/bin/ops_monitor.sh
# 12. 执行监控
/Tomcat/app/bin/ops_monitor.sh
# 输出示例:
=========================================
Tomcat Operations Monitor
Date: Sun Jul 21 11:00:00 CST 2024
=========================================
Tomcat PID: 12345
PID PPID CMD %CPU %MEM ELAPSED
12345 1 java -Xms512m -Xmx1024m ... 2.5 15.0 01:00:00
Tomcat threads:
150
Tomcat connections:
45
Tomcat heap:
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
102400.0 102400.0 51200.0 0.0 819200.0 655360.0 2048000.0 1024000.0 51200.0 49152.0 4608.0 25 2.345 1 0.567 2.912
Tomcat GC:
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
50.00 0.00 80.00 50.00 96.00 90.00 25 2.345 1 0.567 2.912
=========================================
Monitor completed
=========================================
更多学习教程公众号风哥教程itpux_com
Part05-风哥经验总结与分享
5.1 企业级应用部署常见问题与解决方案
在企业级应用部署中,常见的问题及解决方案如下:
- 集群配置错误:检查集群配置和网络连接
- 负载均衡不均:检查负载均衡器配置
- 会话丢失:检查会话复制配置
- 性能瓶颈:检查系统资源和配置
- 故障切换失败:检查故障切换配置
5.2 生产环境企业级应用部署最佳实践
在生产环境中,企业级应用部署的最佳实践包括:
- 使用集群:使用Tomcat集群提高可用性
- 配置负载均衡:配置负载均衡器
- 配置监控:配置监控和告警
- 配置备份:配置备份和恢复
- 配置文档:完善部署文档
5.3 面试经验分享
以下是一些面试经验分享:
- 准备充分:充分准备技术问题和案例
- 表达清晰:清晰表达思路和方案
- 结合实践:结合实际案例说明
- 展示能力:展示解决问题的能力
- 持续学习:展示持续学习的态度
风哥提示:企业级应用部署是Tomcat运维的重要工作,合理的企业级应用部署可以显著提高应用的可用性和性能
from Tomcat视频:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
