基于Nginx+Eureka+Apollo+Jenkins+SpringBoot Web系统分布式部署方案
一、方案概述
1.1 技术栈说明
本分布式部署方案完全贴合现有技术栈,无额外中间件侵入,轻量、稳定、适配中小型至中大型Web业务集群,组件职责清晰:
- SpringBoot:业务微服务/单体集群核心应用,提供Restful业务接口与Web能力
- Eureka:服务注册与发现中心,实现服务集群化、自动容错、负载均衡
- Apollo:分布式统一配置中心,实现配置热更新、环境隔离、动态参数管理
- Nginx:反向代理、静态资源托管、接入层负载均衡、限流、SSL终止
- Jenkins:持续集成、持续部署,自动化打包、测试、发布、回滚
1.2 方案目标
- 实现Web系统分布式集群高可用部署,消除单点故障
- 实现流量负载均衡、弹性扩容、故障自动剔除
- 实现配置统一管理、动态热更新、环境隔离
- 搭建标准化CI/CD流水线,实现自动化发布、快速迭代、一键回滚
- 适配生产、测试、开发多环境统一部署规范
1.3 架构分层模型
用户请求 → Nginx接入层 → SpringBoot服务集群 → Eureka服务治理 → Apollo配置中心 → 底层数据库/缓存
整体分为四层:接入层、业务服务层、服务治理层、配置运维层
二、整体分布式架构设计
2.1 架构拓扑
接入层:Nginx(单主/双主高可用)负责请求转发、负载均衡、静态资源、限流、黑白名单
业务层:多实例SpringBoot集群部署,无状态设计,支持横向无限扩容
服务注册中心:Eureka高可用集群,统一管理所有服务实例上下线、健康检测
配置中心:Apollo集群统一管理所有SpringBoot应用配置,支持动态推送、灰度配置
持续交付层:Jenkins实现代码拉取、编译、打包、部署、重启、回滚全自动化
2.2 核心组件部署模式
|------------|-------------|--------------------------|---------------------|
| 组件 | 部署模式 | 高可用方案 | 核心能力 |
| Nginx | 单机/双机主备 | Keepalived 双主热备,自动故障切换 | 反向代理、请求负载、SSL、限流、缓存 |
| Eureka | 集群部署(2-3节点) | 节点互相注册,同步服务注册表 | 服务注册、发现、健康检查、故障剔除 |
| Apollo | 集群部署 | ConfigService集群+Admin高可用 | 统一配置、热更新、环境隔离、权限管控 |
| SpringBoot | 多实例无状态集群 | 横向扩容,故障节点自动下线 | 承载Web业务、接口服务 |
| Jenkins | 单机稳定部署 | 定时备份任务与脚本 | 自动化CI/CD、发布回滚 |
三、各组件详细部署方案
3.1 Nginx 接入层部署方案
3.1.1 核心作用
- 统一入口,对外隐藏后端服务集群地址
- 实现请求负载均衡,分发流量至多实例SpringBoot
- 静态资源直接托管,减轻后端服务压力
- 配置SSL证书、请求限流、超时控制、防刷、跨域
3.1.2 负载均衡策略
采用 ip_hash + 轮询 混合策略:会话粘连保证用户体验,均匀分发流量。
3.1.3 核心配置示例
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| nginx upstream web-service-cluster { server 192.168.1.101:8080; server 192.168.1.102:8080; server 192.168.1.103:8080; ip_hash; keepalive 64; } server { listen 80; server_name web.xxx.com; # 静态资源 location ~* \.(js|css|png|jpg|svg) { root /data/static; expires 7d; } # 动态请求转发后端集群 location / { proxy_pass http://web-service-cluster; proxy_set_header Host host; proxy_set_header X-Real-IP remote_addr; proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for; } } |
3.2 Eureka 服务注册中心部署方案
3.2.1 部署架构
生产环境采用双节点集群部署,互相注册,保证注册中心高可用,杜绝单点故障。
3.2.2 核心特性
- SpringBoot服务启动自动注册自身实例
- Eureka主动心跳检测,失联服务自动剔除
- 支持自我保护机制,防止网络抖动误删服务
- 服务消费者自动拉取服务列表,本地负载调用
3.2.3 关键配置(application.yml)
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| yaml server: port: 8761 eureka: client: registerWithEureka: true fetchRegistry: true serviceUrl: defaultZone: http://eureka2:8761/eureka/ server: enable-self-preservation: true eviction-interval-timer-in-ms: 60000 |
3.3 Apollo 配置中心部署方案
3.3.1 部署价值
替代传统本地yml配置,所有SpringBoot应用配置统一托管,支持不停机热更新、环境隔离、灰度发布、权限管控。
3.3.2 环境隔离规范
- DEV:开发环境
- TEST:测试环境
- UAT:预发环境
- PROD:生产环境
3.3.3 SpringBoot接入Apollo配置
|---------------------------------------------------------------------------------------------------------------|
| yaml app: id: web-service apollo: meta: http://apollo-config-server:8080 bootstrap: enabled: true eager: true |
支持数据库参数、线程池、超时时间、业务开关动态修改,无需重启服务。
3.4 SpringBoot 分布式集群部署规范
3.4.1 无状态约束(核心)
所有SpringBoot Web服务必须无状态:Session、用户缓存、业务状态全部抽离至Redis/数据库,保证任意实例可随时上下线。
3.4.2 集群扩容规则
- 单实例CPU负载持续>70%、QPS瓶颈时横向新增节点
- 所有实例配置统一由Apollo下发,无需逐个改配置
- 启动自动注册Eureka,自动接入Nginx负载集群
3.5 Jenkins CI/CD自动化部署方案
3.5.1 流水线整体流程
Git代码提交 → Jenkins拉取代码 → Maven/Gradle编译打包 → 单元测试 → 停止旧服务 → 部署新包 → 启动服务 → 健康检查 → 上线完成
3.5.2 核心流水线能力
- 分环境部署:开发/测试/生产一键切换
- 支持灰度发布、分批部署
- 支持一键回滚至上一个稳定版本
- 部署失败自动告警、终止流程
3.5.3 部署脚本规范
统一脚本实现:优雅停机(等待请求处理完毕)→ 备份旧包 → 替换新包 → 启动服务 → 端口与接口健康检测,避免启动失败。
四、分布式高可用保障方案
4.1 接入层高可用
Nginx+Keepalived 双机热备,虚拟IP漂移,单台Nginx宕机秒级切换,用户无感知。
4.2 服务注册高可用
Eureka集群部署,节点数据互相同步,单节点挂掉不影响整体服务注册与发现。
4.3 业务服务高可用
SpringBoot多实例集群,单实例宕机后:Eureka自动剔除、Nginx自动摘除故障节点,流量自动分发至正常节点。
4.4 配置中心高可用
Apollo Config服务集群,保证配置推送不中断,服务启动可正常拉取配置。
五、分布式核心能力落地
5.1 统一配置动态管理
所有环境参数、业务开关、线程池、超时、限流参数全部托管Apollo,实现一处修改、全局生效、热更新。
5.2 服务自动治理
服务上下线自动感知、故障自动隔离,无需人工干预运维。
5.3 流量负载均衡
接入层Nginx实现全局流量分发,后端服务集群压力均匀,避免单点过载。
5.4 标准化自动化交付
Jenkins消除人工部署差异,所有环境发布流程统一,版本可追溯、可回滚。
六、生产环境部署规范
- 禁止单实例生产运行:核心Web服务至少2实例起步
- 配置全部上Apollo:杜绝本地硬编码、本地配置文件
- 全部服务注册Eureka:统一服务治理
- 所有发布走Jenkins流水线:禁止手动上传包部署
- Nginx统一入口:生产禁止直接暴露后端服务端口
七、风险与优化方案
|------------|-------------------------------|
| 风险点 | 优化解决方案 |
| 单Nginx单点故障 | 部署双机Keepalived热备,实现IP自动漂移 |
| 配置修改出错全局影响 | Apollo开启配置审核、灰度发布、版本回滚记录 |
| 服务宕机流量异常 | Eureka健康检测+Nginx失败重试,自动摘除异常节点 |
| 发布上线故障 | Jenkins分批发布、先测后全量,支持一键回滚 |
| 服务状态不一致 | 统一Apollo配置,保证所有集群实例参数一致 |
八、方案总结
本方案基于现有Nginx+Eureka+Apollo+Jenkins+SpringBoot技术栈,构建了一套完整、轻量、生产可用的分布式Web部署体系。实现了请求接入、负载均衡、服务治理、配置动态管理、自动化CI/CD、高可用容错全套能力,无技术栈冲突、无需引入新中间件,可直接落地部署,支撑Web系统集群化、稳定化、持续迭代运维。