1. 项目部署概述
作为《看潮企业管理软件》开发团队的技术负责人,我刚刚完成了这个项目的第22次部署工作。这次部署标志着我们历时3个月的开发周期正式进入生产环境阶段。不同于测试环境的简单发布,生产环境部署需要考虑更多实际因素:用户并发量、数据安全性、系统稳定性等关键指标。
这次部署的版本包含财务模块、人事管理、进销存三大核心功能,采用微服务架构设计,后端基于Spring Cloud框架,前端使用Vue3+TypeScript技术栈。整套系统需要部署在客户指定的阿里云ECS集群上,同时对接客户现有的Oracle数据库和Active Directory认证系统。
2. 部署环境准备
2.1 服务器资源配置
我们为客户规划的生产环境采用高可用架构:
- 应用服务器:4台8核16G的ECS实例
- 数据库服务器:2台16核64G的RDS实例(主从配置)
- 缓存服务器:2台4核8G的Redis集群
- 文件存储:NAS共享存储
提示:实际资源配置应根据预期用户量调整。我们按照500并发用户的标准进行配置,预留了30%的性能余量。
2.2 基础软件安装
所有服务器需要预先安装以下基础组件:
- JDK 17(要求使用Azul Zulu发行版)
- Nginx 1.20(作为反向代理和负载均衡)
- Docker 20.10(用于容器化部署)
- Node.js 16(前端构建依赖)
安装完成后需要执行以下验证命令:
# 验证Java环境 java -version # 验证Docker运行状态 systemctl status docker # 检查Nginx配置 nginx -t3. 后端服务部署
3.1 微服务打包与配置
我们的后端包含6个微服务模块:
- auth-service(认证服务)
- user-service(用户服务)
- finance-service(财务服务)
- hr-service(人事服务)
- inventory-service(库存服务)
- gateway-service(网关服务)
每个服务需要单独打包为Docker镜像。以finance-service为例,Dockerfile配置如下:
FROM azul/zulu-openjdk:17 WORKDIR /app COPY target/finance-service-1.0.0.jar app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","app.jar"]3.2 数据库连接配置
每个微服务需要配置独立的数据库连接池。在application-prod.yml中:
spring: datasource: url: jdbc:oracle:thin:@//db-prod:1521/ORCLPDB username: ${DB_USER} password: ${DB_PASSWORD} hikari: maximum-pool-size: 20 connection-timeout: 30000注意:密码等敏感信息应通过环境变量注入,不要直接写在配置文件中。
4. 前端部署方案
4.1 生产环境构建
前端项目使用Vue CLI进行生产环境构建:
npm run build -- --mode production构建完成后会生成dist目录,我们需要将其部署到Nginx上。Nginx配置示例:
server { listen 80; server_name erp.kanchao.com; location / { root /var/www/erp-web; try_files $uri $uri/ /index.html; } location /api { proxy_pass http://gateway-service:8080; proxy_set_header Host $host; } }4.2 CDN加速配置
为提高静态资源加载速度,我们配置了阿里云CDN:
- 将dist目录下的js/css文件上传到OSS
- 配置CDN域名指向OSS存储桶
- 在vue.config.js中设置publicPath为CDN地址
module.exports = { publicPath: process.env.NODE_ENV === 'production' ? 'https://cdn.kanchao.com/erp/' : '/' }5. 部署流程实施
5.1 自动化部署脚本
我们编写了基于Shell的部署脚本deploy.sh:
#!/bin/bash # 停止现有容器 docker-compose down # 清理旧镜像 docker image prune -f # 拉取最新镜像 docker-compose pull # 启动服务 docker-compose up -d # 健康检查 sleep 30 curl -s http://localhost:8080/actuator/health | grep UP || exit 15.2 蓝绿部署策略
为确保零停机部署,我们采用蓝绿部署方案:
- 准备两套完全相同的环境(蓝环境和绿环境)
- 当前生产流量指向蓝环境
- 将新版本部署到绿环境并进行验证
- 通过Nginx切换流量到绿环境
- 蓝环境作为备用或下一轮部署使用
6. 监控与日志配置
6.1 应用监控
我们集成了Prometheus+Grafana监控方案:
- 每个微服务暴露/metrics端点
- Prometheus定时采集指标数据
- Grafana配置业务看板
关键监控指标包括:
- JVM内存使用率
- 接口响应时间
- 数据库连接池使用率
- 系统CPU/内存负载
6.2 日志收集
使用ELK栈进行日志集中管理:
- Filebeat收集各节点日志
- Logstash进行日志过滤和处理
- Elasticsearch存储日志数据
- Kibana提供查询界面
日志配置文件示例(logback-spring.xml):
<appender name="ELK" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>logstash:5044</destination> <encoder class="net.logstash.logback.encoder.LogstashEncoder"/> </appender>7. 常见问题与解决方案
7.1 数据库连接泄露
症状:应用运行一段时间后出现数据库连接耗尽。
解决方案:
- 检查代码中是否有未关闭的Connection
- 配置合理的连接超时时间
- 添加Druid监控界面实时查看连接状态
7.2 内存泄漏问题
症状:JVM内存使用率持续升高直至OOM。
排查步骤:
- 使用jmap生成堆转储文件
- 通过MAT工具分析内存占用
- 检查缓存使用是否合理
7.3 跨域问题
症状:前端调用API时出现CORS错误。
解决方法:
- 在网关层统一配置CORS
- 对于Nginx代理,添加以下配置:
add_header 'Access-Control-Allow-Origin' '$http_origin'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,Content-Type';8. 安全加固措施
8.1 网络层安全
- 配置安全组规则,仅开放必要端口
- 启用VPC网络隔离
- 设置Nginx WAF防护规则
8.2 应用层安全
- 启用Spring Security防护
- 配置合理的权限控制
- 敏感数据加密存储
- 接口添加速率限制
8.3 数据安全
- 数据库定时备份
- 启用Binlog日志
- 敏感字段加密
- 操作日志审计
9. 性能优化实践
9.1 数据库优化
- 为高频查询字段添加索引
- 优化SQL语句,避免全表扫描
- 配置合理的连接池参数
- 使用读写分离架构
9.2 缓存策略
- 高频访问数据放入Redis
- 配置合理的缓存过期时间
- 使用多级缓存架构
- 缓存击穿防护
9.3 JVM调优
在启动参数中添加:
-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=45 -Xms4g -Xmx4g10. 回滚机制设计
10.1 快速回滚方案
- 保留最近3个版本的Docker镜像
- 维护版本发布清单
- 编写自动化回滚脚本
回滚命令示例:
docker tag erp-gateway:1.2.0 erp-gateway:current docker-compose up -d10.2 数据回滚策略
- 部署前执行数据库备份
- 使用Flyway管理数据库变更
- 准备数据修复脚本
重要:回滚时需要考虑数据兼容性问题,特别是数据库结构变更的情况。
在实际部署过程中,我们发现最大的挑战不是技术实现,而是如何平衡业务连续性和系统更新需求。经过多次部署经验积累,我们总结出一个原则:任何部署操作都必须有可验证的回退方案,并且要在非业务高峰期执行。