SpringCloud 微服务系统 云资源 / 本地资源全流程部署与运维实施方案
一、方案总体概述
1.1 部署架构说明
本方案针对 SpringCloud 微服务全套技术栈,提供本地机房物理资源部署和公有云资源部署两套完整实施流程,覆盖核心组件:Linux 服务器、MySQL 数据库、Redis 缓存、MQ 消息队列(RabbitMQ/RocketMQ)、OSS 对象存储、SpringCloud 微服务集群。 方案涵盖:环境初始化、依赖安装、组件配置、网络互通、日志集成、启停脚本、日常运维、故障排查、权限安全、备份恢复全流程,可直接用于项目上线、运维落地。
1.2 两套部署模式对比
表格
| 服务器 | CentOS7/CentOS8 物理机 / 本地虚拟机 | 云 ECS 服务器 |
| 数据库 | 本地自建 MySQL | 云 RDS MySQL |
| 缓存 | 本地自建 Redis | 云 Redis 数据库 |
| 消息队列 | 本地自建 MQ(RabbitMQ/RocketMQ) | 云消息队列服务 |
| 对象存储 | 本地自建 MinIO 替代 OSS | 云 OSS 对象存储 |
| 网络 | 内网局域网、防火墙手动放行 | VPC 私有网络、安全组管控 |
1.3 环境基础要求
- 操作系统:CentOS 7.9 / CentOS 8(统一 Linux 环境)
- 运行环境:JDK1.8+/Maven3.6+/Git
- 网络要求:服务器内网互通、外网可访问(用于拉取依赖、推送镜像)
- 权限要求:root 或具备 sudo 最高权限
- 时间要求:所有服务器统一时间、开启 NTP 时间同步
二、通用服务器 Linux 环境初始化(本地 / 云服务器通用)
本步骤为所有 Linux 服务器前置操作,本地物理机、云 ECS 均需执行。
2.1 系统基础优化
# 关闭防火墙(生产可保留,按需放行端口)
systemctl stop firewalld
systemctl disable firewalld
# 关闭SELinux
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
# 安装基础依赖
yum install -y wget curl net-tools vim lsof tree ntp gcc git
# 开启时间同步
systemctl start ntpd
systemctl enable ntpd
# 设置主机名(区分微服务节点)
hostnamectl set-hostname microservice-node01
# 重启生效
reboot
2.2 JDK 环境安装(微服务必备)
# 卸载系统自带openjdk
yum remove -y java*
# 上传jdk1.8压缩包至/usr/local/
tar -zxvf jdk-8u381-linux-x64.tar.gz -C /usr/local/
# 配置环境变量
vim /etc/profile
# 末尾添加
export JAVA_HOME=/usr/local/jdk1.8.0_381
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
# 生效配置
source /etc/profile
java -version
2.3 统一目录规划(标准化运维)
# 统一创建微服务目录结构
mkdir -p /usr/local/micro/{service,config,log,script,jar,backup}
目录说明:service 存放服务包、config 存放配置文件、log 统一日志目录、script 启停脚本、jar 部署包、backup 备份文件。
三、本地资源全套部署方案(自建 MySQL/Redis/MQ/MinIO)
3.1 本地 MySQL 8.0 安装配置
3.1.1 安装部署
# 卸载mariadb
yum remove -y mariadb*
# 下载安装MySQL8.0
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
rpm -ivh mysql80-community-release-el7-3.noarch.rpm
yum install -y mysql-community-server
# 启动开机自启
systemctl start mysqld
systemctl enable mysqld
3.1.2 初始化配置
# 查看初始密码
grep 'temporary password' /var/log/mysqld.log
# 登录修改密码
mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Root@123456';
# 开启远程访问
CREATE USER 'root'@'%' IDENTIFIED BY 'Root@123456';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
# 新建微服务专属数据库
CREATE DATABASE micro_service DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3.1.3 日志与备份配置
开启慢查询日志、二进制日志,配置定时备份。
vim /etc/my.cnf
# 添加配置
slow_query_log=1
slow_query_log_file=/usr/local/micro/log/mysql-slow.log
long_query_time=2
log_bin=/usr/local/micro/log/mysql-bin.log
# 重启生效
systemctl restart mysqld
3.2 本地 Redis 6.2 安装配置
3.2.1 编译安装
wget http://download.redis.io/releases/redis-6.2.10.tar.gz
tar -zxvf redis-6.2.10.tar.gz
cd redis-6.2.10
make && make install
3.2.2 核心配置
# 新建配置文件
vim /usr/local/micro/config/redis.conf
# 核心配置
port 6379
bind 0.0.0.0
protected-mode no
requirepass Redis@123456
daemonize yes
logfile "/usr/local/micro/log/redis.log"
dir /usr/local/micro/backup
3.2.3 启停与开机自启
# 启动
redis-server /usr/local/micro/config/redis.conf
# 停止
redis-cli -a Redis@123456 shutdown
3.3 本地 RabbitMQ 安装配置(微服务主流 MQ)
3.3.1 环境与安装
RabbitMQ 依赖 Erlang,统一版本适配。
yum install -y erlang socat
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.10.0/rabbitmq-server-3.10.0-1.el7.noarch.rpm
rpm -ivh rabbitmq-server-3.10.0-1.el7.noarch.rpm
# 启动自启
systemctl start rabbitmq-server
systemctl enable rabbitmq-server
3.3.2 控制台与用户配置
# 开启管理控制台
rabbitmq-plugins enable rabbitmq_management
# 创建微服务专属用户
rabbitmqctl add_user micro Mq@123456
rabbitmqctl set_permissions -p / micro ".*" ".*" ".*"
rabbitmqctl set_user_tags micro administrator
访问地址:http:// 服务器 IP:15672
3.4 本地 OSS 替代方案:MinIO 部署
无云 OSS 时,使用 MinIO 搭建本地对象存储,完全兼容 OSS 接口,SpringCloud 项目无缝切换。
# 下载MinIO
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
mv minio /usr/local/bin/
# 创建存储目录
mkdir -p /usr/local/micro/oss-data
# 配置账号密码
export MINIO_ROOT_USER=minio
export MINIO_ROOT_PASSWORD=Minio@123456
# 后台启动
nohup minio server /usr/local/micro/oss-data –console-address :9001 > /usr/local/micro/log/minio.log 2>&1 &
访问地址:http://IP:9001,支持创建存储桶、对接微服务文件上传下载。
四、云资源部署方案(RDS + 云 Redis + 云 MQ + 云 OSS)
云资源无需手动安装部署,核心为资源创建、网络配置、权限白名单、项目对接,大幅降低运维成本。
4.1 云 RDS MySQL 配置
项目配置地址:RDS 内网地址:3306,无需服务器本地安装 MySQL。
4.2 云 Redis 配置
项目直接对接内网 Redis 地址,无需本地部署维护。
4.3 云消息队列配置
4.4 云 OSS 对象存储配置
五、SpringCloud 微服务统一部署流程(本地 / 云环境通用)
5.1 项目打包
# 本地开发环境打包
mvn clean package -Dmaven.test.skip=true
获取各微服务 jar 包:网关、注册中心、配置中心、业务服务等。
5.2 微服务核心配置文件适配
5.2.1 本地资源配置示例
# application.yml 核心配置
spring:
datasource:
url: jdbc:mysql://本地MySQLIP:3306/micro_service?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: Root@123456
redis:
host: 本地RedisIP
port: 6379
password: Redis@123456
rabbitmq:
host: 本地MQIP
port: 5672
username: micro
password: Mq@123456
minio:
endpoint: http://本地MinIOIP:9000
access-key: minio
secret-key: Minio@123456
5.2.2 云资源配置示例
spring:
datasource:
url: jdbc:mysql://云RDS内网地址:3306/micro_service
username: 云数据库账号
password: 云数据库密码
redis:
host: 云Redis内网地址
port: 6379
password: 云Redis密码
rabbitmq:
host: 云MQ内网地址
port: 5672
username: 云MQ账号
password: 云MQ密码
oss:
endpoint: 云OSS内网地址
access-key-id: RAM账号AK
access-key-secret: RAM账号SK
bucket-name: 存储桶名称
5.3 统一日志配置(全服务标准化)
所有微服务统一使用 logback,日志输出至服务器统一目录 /usr/local/micro/log/服务名/,区分 INFO、ERROR 日志,保留 30 天日志。 核心配置:按天分割日志、错误日志单独存储、日志压缩归档、异常堆栈完整输出。
5.4 通用启停脚本(所有微服务复用)
创建统一运维脚本 micro.sh,实现一键启动、停止、重启、状态查看。
#!/bin/bash
# 微服务通用启停脚本
SERVICE_NAME=$1
JAR_PATH=/usr/local/micro/jar/${SERVICE_NAME}.jar
LOG_PATH=/usr/local/micro/log/${SERVICE_NAME}
mkdir -p ${LOG_PATH}
case $2 in
start)
nohup java -jar ${JAR_PATH} > ${LOG_PATH}/run.log 2>&1 &
echo "${SERVICE_NAME} 启动成功"
;;
stop)
PID=`ps -ef |grep ${SERVICE_NAME}.jar |grep -v grep |awk '{print $2}'`
kill -9 ${PID}
echo "${SERVICE_NAME} 停止成功"
;;
restart)
$0 ${SERVICE_NAME} stop
sleep 2
$0 ${SERVICE_NAME} start
echo "${SERVICE_NAME} 重启成功"
;;
status)
ps -ef |grep ${SERVICE_NAME}.jar |grep -v grep
;;
esac
授权使用:
chmod +x /usr/local/micro/script/micro.sh
# 使用示例
./micro.sh gateway start #启动网关
./micro.sh user-service restart #重启用户服务
六、网络配置方案(本地 / 云环境)
6.1 本地机房网络
- 所有服务器统一内网网段,确保互通
- 防火墙放行核心端口:3306、6379、5672、15672、9000、微服务端口 8080/8090 等
- 配置内网 DNS 或 hosts 映射,统一服务域名
6.2 云环境网络
- 所有资源统一 VPC、同一可用区,降低延迟
- 安全组最小权限原则:仅放行业务端口、限制 IP 访问
- 数据库、Redis、MQ 仅对内网 ECS 开放,禁止公网直接访问
- 网关服务开放公网端口,对外提供接口服务
七、日常运维完整方案
7.1 日常巡检项(每日)
- 服务器:CPU、内存、磁盘、负载、网络流量
- 微服务:服务运行状态、端口监听、日志报错、接口响应
- MySQL:连接数、慢查询、磁盘占用、备份状态
- Redis:内存使用率、key 过期、连接数、持久化状态
- MQ:队列堆积、消息重试、死信队列数量
- OSS/MinIO:存储空间、文件上传下载异常
7.2 定时备份策略
7.3 故障基础排查流程
7.4 权限安全运维规范
- 禁止 root 直接运行微服务,创建普通运维用户管理服务
- 所有组件密码定期更换,禁止弱密码
- 云资源 AK/SK 禁止明文存储,配置环境变量或配置中心加密
- 定期清理无效日志、冗余文件、释放磁盘空间
7.5 自动化备份 & 监控告警脚本
说明:
前置准备(所有服务器执行一次)
# 创建脚本日志目录
mkdir -p /usr/local/micro/script /usr/local/micro/log/script /usr/local/micro/backup
# 安装邮件告警依赖
yum install -y mailx
# 配置发件邮箱(示例163邮箱)
vim /etc/mail.rc
# 文件末尾追加如下内容
set from="xxx@163.com"
set smtp="smtp.163.com"
set smtp-auth-user="xxx@163.com"
set smtp-auth-password="邮箱授权码"
set smtp-auth=login
脚本 1:MySQL 自动备份脚本(本地自建 MySQL)
文件名:mysql_backup.sh
#!/bin/bash
# MySQL备份脚本
BACKUP_DIR="/usr/local/micro/backup/mysql"
LOG_FILE="/usr/local/micro/log/script/mysql_backup.log"
DB_NAME="micro_service"
DB_USER="root"
DB_PASS="Root@123456"
RETENTION_DAYS=7 #保留7天备份
# 创建目录
mkdir -p ${BACKUP_DIR}
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE=${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz
# 备份
echo "===== ${DATE} 开始mysql备份 =====" >> ${LOG_FILE}
mysqldump -u${DB_USER} -p${DB_PASS} ${DB_NAME} –single-transaction –quick –lock-tables=false | gzip > ${BACKUP_FILE}
# 判断备份结果
if [ $? -eq 0 ];then
echo "备份成功:${BACKUP_FILE}" >> ${LOG_FILE}
else
echo "MySQL备份失败!" >> ${LOG_FILE}
echo "【告警】MySQL数据库备份失败" | mail -s "【微服务告警】MySQL备份失败" 接收告警邮箱@shturl.
fi
# 删除7天前旧备份
find ${BACKUP_DIR} -name "*.sql.gz" -mtime +${RETENTION_DAYS} -delete
echo "===== 本次备份结束 =====" >> ${LOG_FILE}
授权命令:
chmod +x /usr/local/micro/script/mysql_backup.sh
云 RDS 说明:不需要 mysqldump 备份脚本,云实例自带自动备份,仅保留数据库配置备份。
脚本 2:Redis 持久化文件备份脚本(本地自建 Redis)
文件名:redis_backup.sh
#!/bin/bash
# Redis备份:拷贝rdb/aof持久化文件
BACKUP_DIR="/usr/local/micro/backup/redis"
LOG_FILE="/usr/local/micro/log/script/redis_backup.log"
RETENTION_DAYS=7
# redis rdb目录(必须和redis.conf dir配置保持一致)
REDIS_DATA="/usr/local/micro/backup"
mkdir -p ${BACKUP_DIR}
DATE=$(date +%Y%m%d_%H%M%S)
echo "===== ${DATE} Redis备份开始 =====" >> ${LOG_FILE}
cp ${REDIS_DATA}/dump.rdb ${BACKUP_DIR}/dump_${DATE}.rdb
if [ $? -eq 0 ];then
echo "Redis RDB备份成功" >> ${LOG_FILE}
else
echo "Redis备份失败" >> ${LOG_FILE}
echo "【告警】Redis备份失败" | mail -s "【微服务告警】Redis备份失败" 接收告警邮箱@shturl.
fi
find ${BACKUP_DIR} -name "*.rdb" -mtime +${RETENTION_DAYS} -delete
echo "===== Redis备份结束 =====" >> ${LOG_FILE}
授权命令:
chmod +x /usr/local/micro/script/redis_backup.sh
脚本 3:MinIO 本地对象存储备份脚本(本地自建 OSS)
MinIO 不推荐直接拷贝底层数据目录,使用 mc 客户端同步 bucket 文件名:minio_backup.sh
#!/bin/bash
BACKUP_DIR="/usr/local/micro/backup/minio"
LOG_FILE="/usr/local/micro/log/script/minio_backup.log"
RETENTION_DAYS=7
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p ${BACKUP_DIR}
# 提前执行mc客户端别名配置:mc alias set minio http://127.0.0.1:9000 minio Minio@123456
echo "===== ${DATE} MinIO备份开始 =====" >> ${LOG_FILE}
mc mirror minio/bucketname ${BACKUP_DIR}/bucket_${DATE}
if [ $? -eq 0 ];then
echo "MinIO bucket备份成功" >> ${LOG_FILE}
else
echo "MinIO备份失败" >> ${LOG_FILE}
echo "【告警】MinIO对象存储备份失败" | mail -s "【微服务告警】MinIO备份失败" 接收告警邮箱@shturl.
fi
find ${BACKUP_DIR} -type d -mtime +${RETENTION_DAYS} -exec rm -rf {} \\;
echo "===== MinIO备份结束 =====" >> ${LOG_FILE}
授权命令:
chmod +x /usr/local/micro/script/minio_backup.sh
脚本 4:系统 & 微服务配置文件统一备份脚本
文件名:config_backup.sh
#!/bin/bash
# 微服务配置、组件配置文件打包备份
BACKUP_DIR="/usr/local/micro/backup/config"
LOG_FILE="/usr/local/micro/log/script/config_backup.log"
RETENTION_DAYS=15
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p ${BACKUP_DIR}
TAR_FILE=${BACKUP_DIR}/micro_config_${DATE}.tar.gz
# 需要备份的目录:所有核心配置文件
tar -zcvf ${TAR_FILE} \\
/usr/local/micro/config \\
/usr/local/micro/script \\
/etc/my.cnf \\
/usr/local/micro/config/redis.conf \\
/etc/rabbitmq
if [ $? -eq 0 ];then
echo "配置文件备份成功:${TAR_FILE}" >> ${LOG_FILE}
else
echo "配置备份失败" >> ${LOG_FILE}
echo "【告警】微服务配置文件备份失败" | mail -s "【微服务告警】配置备份失败" 接收告警邮箱@shturl.
fi
find ${BACKUP_DIR} -name "*.tar.gz" -mtime +${RETENTION_DAYS} -delete
echo "=====配置备份结束 =====" >> ${LOG_FILE}
授权命令:
chmod +x /usr/local/micro/script/config_backup.sh
脚本 5:服务器资源监控脚本(CPU / 内存 / 磁盘 / 端口)
文件名:server_monitor.sh
定时采集服务器资源,超过阈值触发告警
#!/bin/bash
LOG_FILE="/usr/local/micro/log/script/server_monitor.log"
DATE=$(date "+%Y-%m-%d %H:%M:%S")
# 1 CPU使用率
CPU=$(top -b -n1 | grep Cpu | awk '{print $2}' | cut -f1 -d"%")
CPU_THRESHOLD=85
#2 内存使用率
MEM=$(free | awk '/Mem/{printf("%.0f"),$3/$2*100}')
MEM_THRESHOLD=85
#3 磁盘使用率(根分区)
DISK=$(df -h / | awk '/\\//{gsub(/%/,"");print $5}')
DISK_THRESHOLD=85
echo "==== ${DATE} 监控采集 ====" >> ${LOG_FILE}
echo "CPU:${CPU}%, MEM:${MEM}%, DISK:${DISK}%" >> ${LOG_FILE}
ALERT_MSG=""
if (( $(echo "${CPU} > ${CPU_THRESHOLD}" | bc -l) ));then
ALERT_MSG+="CPU使用率超过阈值${CPU}%;"
fi
if (( $(echo "${MEM} > ${MEM_THRESHOLD}" | bc -l) ));then
ALERT_MSG+="内存使用率超过阈值${MEM}%;"
fi
if [ ${DISK} -gt ${DISK_THRESHOLD} ];then
ALERT_MSG+="根磁盘使用率超过阈值${DISK}%;"
fi
# 检查微服务网关端口(示例8080,按需修改)
NETSTAT_PORT=$(lsof -i:8080 | wc -l)
if [ ${NETSTAT_PORT} -eq 0 ];then
ALERT_MSG+="网关服务端口8080未监听,服务可能宕机;"
fi
# 有告警就发送邮件
if [ -n "${ALERT_MSG}" ];then
echo "告警内容:${ALERT_MSG}" >> ${LOG_FILE}
echo "【资源告警】${ALERT_MSG}" | mail -s "【微服务服务器告警】资源超阈值" 接收告警邮箱@shturl.
fi
授权命令:
chmod +x /usr/local/micro/script/server_monitor.sh
脚本 6:RabbitMQ 队列堆积监控脚本
文件名:rabbitmq_monitor.sh
#!/bin/bash
LOG_FILE="/usr/local/micro/log/script/rabbitmq_monitor.log"
DATE=$(date "+%Y-%m-%d %H:%M:%S")
# rabbitmq账号密码
RABBIT_USER=micro
RABBIT_PASS=Mq@123456
QUEUE_NAME=business_queue
THRESHOLD=1000 #堆积超过1000条触发告警
# 获取队列消息数量
QUEUE_COUNT=$(rabbitmqctl list_queues | grep ${QUEUE_NAME}|awk '{print $2}')
echo "${DATE} Queue:${QUEUE_NAME} 消息数量:${QUEUE_COUNT}" >> ${LOG_FILE}
if [ ${QUEUE_COUNT} -gt ${THRESHOLD} ];then
MSG="RabbitMQ队列【${QUEUE_NAME}】消息堆积${QUEUE_COUNT}条,超过阈值${THRESHOLD}"
echo ${MSG} >> ${LOG_FILE}
echo ${MSG} | mail -s "【MQ告警】消息队列堆积" 接收告警邮箱@shturl.
fi
授权命令:
chmod +x /usr/local/micro/script/rabbitmq_monitor.sh
钉钉 Webhook 告警替换方案(可选,替代邮件)
将脚本内 mail 发送告警代码替换为下面钉钉函数:
# 钉钉告警函数
send_ding(){
CONTENT=$1
curl -s https://oapi.dingtalk.com/robot/send?access_token=你的机器人token \\
-H "Content-Type: application/json" \\
-d "{\\"msgtype\\":\\"text\\",\\"text\\":{\\"content\\":\\"${CONTENT}\\"}}"
}
# 调用示例
send_ding "【告警】MySQL备份失败"
7.6 Crontab 定时调度配置
执行 crontab -e,粘贴如下定时任务:
# 凌晨2点 MySQL备份
0 2 * * * /usr/local/micro/script/mysql_backup.sh
# 凌晨3点 Redis备份
0 3 * * * /usr/local/micro/script/redis_backup.sh
# 凌晨4点 MinIO备份
0 4 * * * /usr/local/micro/script/minio_backup.sh
# 每周日凌晨1点 全量配置文件备份
0 1 * * 0 /usr/local/micro/script/config_backup.sh
# 每5分钟 服务器资源监控
*/5 * * * * /usr/local/micro/script/server_monitor.sh
# 每10分钟 MQ队列监控
*/10 * * * /usr/local/micro/script/rabbitmq_monitor.sh
查看定时任务:crontab -l
上线前必须手动执行脚本验证可用性,再加入定时任务 手动测试示例:/usr/local/micro/script/mysql_backup.sh
7.7 日志自动清理脚本
文件名:log_clean.sh,防止日志持续占满磁盘
#!/bin/bash
# 清理30天之前日志
LOG_BASE=/usr/local/micro/log
RETENTION=30
find ${LOG_BASE} -type f -name "*.log" -mtime +${RETENTION} -delete
find ${LOG_BASE} -type f -name "*.gz" -mtime +${RETENTION} -delete
授权:
chmod +x /usr/local/micro/script/log_clean.sh
crontab 新增,每天凌晨 5 点自动清理日志
0 5 * * * /usr/local/micro/script/log_clean.sh
7.8 脚本运维注意事项
八、两种部署方案选型总结
8.1 本地资源部署适用场景
私有化部署、内网隔离项目、预算有限、数据绝对本地留存场景,优点是自主可控、无云服务费,缺点是运维工作量大、需要自主维护组件升级、故障处理、备份扩容。
8.2 云资源部署适用场景
互联网线上项目、需要弹性扩容、快速上线、减少运维成本场景,优点是高可用、免运维、弹性伸缩、自带监控备份,缺点是长期云服务费用较高、依赖公有云环境。


