1. 文档基础信息
|
项目名称 |
[填写服务所属项目的完整名称] |
文档版本 |
V[X].[Y].[Z] |
|---|---|---|---|
|
服务名称 |
[填写待部署服务的名称] |
文档状态 |
□ 草稿 □ 待审核 □ 已生效 □ 已归档 |
|
编写人 |
[姓名] |
编写日期 |
[年-月-日] |
|
审核人 |
[姓名] |
审核日期 |
[年-月-日] |
|
维护人 |
[姓名/团队名称] |
联系方式 |
[电话/邮箱] |
2. 服务概述
2.1 服务功能
[简要描述服务的核心功能、作用及在整个系统中的定位,例如:该服务为用户提供数据查询接口,支撑前端应用的核心业务模块,是系统数据交互的关键节点。]
2.2 部署目标
[明确本次部署的目标,例如:完成服务在生产环境的首次部署并实现稳定运行;对现有服务进行版本升级,修复已知漏洞并提升性能;实现服务的集群部署,提高可用性和并发处理能力。]
2.3 部署范围
[说明部署涉及的环境、节点及相关依赖服务,例如:生产环境下的3个应用节点;依赖的MySQL数据库(主从架构)、Redis缓存集群、RabbitMQ消息队列;需要同步更新的配置中心服务。]
3. 部署环境要求
3.1 硬件环境
|
节点类型 |
CPU |
内存 |
硬盘 |
网络带宽 |
数量要求 |
|---|---|---|---|---|---|
|
应用节点 |
[例如:8核及以上] |
[例如:16GB及以上] |
[例如:SSD 200GB及以上] |
[例如:100Mbps及以上] |
[例如:3台] |
|
数据库节点 |
[例如:16核及以上] |
[例如:32GB及以上] |
[例如:SSD 1TB及以上] |
[例如:1000Mbps及以上] |
[例如:2台(主从)] |
|
[其他节点类型] |
[填写具体要求] |
[填写具体要求] |
[填写具体要求] |
[填写具体要求] |
[填写具体要求] |
3.2 软件环境
|
软件类型 |
软件名称 |
版本要求 |
安装说明 |
|---|---|---|---|
|
操作系统 |
[例如:CentOS、Ubuntu、Windows Server] |
[例如:CentOS 7.6 64位、Ubuntu 20.04 LTS、Windows Server 2019] |
[例如:最小化安装,关闭防火墙或开放指定端口;开启SSH服务方便远程管理] |
|
编程语言/运行时 |
[例如:JDK、Python、Node.js、.NET Core] |
[例如:JDK 1.8.0_301、Python 3.9.6、Node.js 16.14.0、.NET Core 6.0] |
[例如:配置环境变量JAVA_HOME/PYTHON_HOME;设置默认编码为UTF-8] |
|
数据库 |
[例如:MySQL、Oracle、PostgreSQL] |
[例如:MySQL 8.0、Oracle 19c、PostgreSQL 13] |
[例如:配置字符集为utf8mb4;开启慢查询日志;设置合适的连接池大小] |
|
中间件 |
[例如:Redis、RabbitMQ、Kafka、Nginx] |
[例如:Redis 6.2、RabbitMQ 3.9、Kafka 3.0、Nginx 1.20] |
[例如:Redis开启持久化;RabbitMQ配置镜像队列;Nginx配置反向代理和负载均衡] |
|
部署工具 |
[例如:Docker、Kubernetes、Jenkins、Ansible] |
[例如:Docker 20.10、Kubernetes 1.23、Jenkins 2.303、Ansible 2.12] |
[例如:Docker配置私有镜像仓库;Jenkins安装必要的插件(如Git、Maven)] |
|
[其他软件] |
[填写软件名称] |
[填写版本要求] |
[填写安装说明] |
4. 部署前准备
4.1 资源准备
-
服务安装包/镜像:[说明安装包/镜像的获取途径,例如:从GitLab仓库拉取源码编译打包;从私有Docker镜像仓库获取镜像(镜像地址:[具体地址]);版本号:[具体版本号]]
-
配置文件:[列出所需的配置文件,例如:application.yml(应用配置)、nginx.conf(反向代理配置)、database.properties(数据库连接配置);说明配置文件的获取途径及模板位置]
-
数据库脚本:[若涉及数据库变更,说明脚本的位置(如:Git仓库[具体路径])、执行顺序(如:先执行建表脚本,再执行初始化数据脚本)、版本号(与服务版本匹配)]
-
依赖资源:[列出服务依赖的外部资源,例如:第三方API的访问密钥;存储服务(如OSS)的账号密码;证书文件(如SSL证书)的存放路径及获取方式]
4.2 环境检查
-
硬件检查:[确认各节点的CPU、内存、硬盘、网络等硬件资源是否满足要求,可通过命令(如:lscpu、free -h、df -h、ifconfig)检查]
-
软件检查:[确认所需软件已安装且版本符合要求,例如:java -version、mysql -V、docker --version;检查软件服务是否正常运行(如:systemctl status nginx)]
-
网络检查:[确认各节点之间网络互通,例如:通过ping命令测试节点间连通性;检查服务所需端口是否开放(如:telnet [IP] [端口] 或 firewall-cmd --list-ports);确认外部访问链路通畅(如:负载均衡器到应用节点的连通性)]
-
权限检查:[确认部署账号拥有足够的权限,例如:服务器的sudo权限;Git仓库的拉取权限;数据库的建表、插入数据权限;文件目录的读写权限(如:/opt/[服务名])]
4.3 风险评估与预案
|
潜在风险 |
风险等级 |
应对预案 |
|---|---|---|
|
服务启动失败 |
高 |
1. 查看服务日志(路径:[日志路径])定位错误原因;2. 检查配置文件是否正确、依赖服务是否可用;3. 若为版本问题,回滚至历史稳定版本 |
|
数据库脚本执行出错 |
高 |
1. 立即停止脚本执行,备份当前数据库数据;2. 分析错误日志,修复脚本问题;3. 若数据已受损,使用备份数据恢复,重新执行脚本 |
|
网络中断导致部署中断 |
中 |
1. 确认网络恢复后,检查部署进度;2. 若为脚本部署,重新执行脚本(确保脚本支持幂等性);3. 若为镜像部署,检查镜像是否已完整拉取,重新启动部署流程 |
|
资源不足导致部署失败 |
中 |
1. 清理服务器无用资源(如:过期日志、未使用的镜像);2. 扩容硬件资源或调整服务资源配置;3. 分批部署,避免多个服务同时占用大量资源 |
|
[其他潜在风险] |
[高/中/低] |
[填写应对预案] |
5. 详细部署步骤
5.1 环境初始化(若未初始化)
5.1.1 操作系统配置
-
关闭防火墙(生产环境建议开放指定端口):[例如:CentOS:systemctl stop firewalld && systemctl disable firewalld;Ubuntu:ufw disable]
-
关闭SELinux:[例如:setenforce 0;修改/etc/selinux/config文件,设置SELINUX=disabled]
-
配置时区:[例如:timedatectl set-timezone Asia/Shanghai;同步时间:ntpdate [时间服务器地址]]
-
创建部署目录:[例如:mkdir -p /opt/[服务名]/bin /opt/[服务名]/conf /opt/[服务名]/log /opt/[服务名]/data;授权:chown -R [部署账号]:[部署组] /opt/[服务名]]
-
[其他配置]:[例如:优化内核参数(修改/etc/sysctl.conf);配置SSH免密登录方便节点间操作]
5.1.2 基础软件安装
[以CentOS安装JDK为例]:
-
下载JDK安装包:wget [JDK下载地址]
-
解压安装包:tar -zxvf jdk-8u301-linux-x64.tar.gz -C /usr/local/
-
配置环境变量:echo "export JAVA_HOME=/usr/local/jdk1.8.0_301" >> /etc/profile;echo "export PATH=\$JAVA_HOME/bin:\$PATH" >> /etc/profile
-
生效环境变量:source /etc/profile
-
验证安装:java -version,若显示对应版本信息则安装成功
[其他软件安装步骤参考上述格式,详细说明下载、安装、配置、验证的完整命令及操作]
5.2 依赖服务部署(若未部署)
[以部署Redis为例,其他依赖服务如MySQL、RabbitMQ等参照此格式]
-
下载并安装Redis:[例如:yum install redis -y 或 源码编译安装]
-
修改配置文件(/etc/redis.conf): 设置绑定IP:bind [节点IP](允许指定IP访问)
-
设置密码:requirepass [Redis密码]
-
开启持久化:appendonly yes
-
调整内存限制:maxmemory [内存大小,如:8gb]
-
启动Redis服务:systemctl start redis;设置开机自启:systemctl enable redis
-
验证服务:redis-cli -h [节点IP] -p 6379 -a [密码],执行ping命令,返回PONG则服务正常
5.3 服务部署(核心步骤)
5.3.1 方式一:传统部署(安装包部署)
-
获取服务安装包:[例如:通过SCP命令上传:scp [本地路径]/[服务名]-[版本号].tar.gz [部署账号]@[目标IP]:/opt/[服务名]/bin/;或从Git拉取源码编译:git clone [仓库地址],cd [项目目录],mvn clean package -Dmaven.test.skip=true]
-
解压安装包:cd /opt/[服务名]/bin;tar -zxvf [服务名]-[版本号].tar.gz
-
配置服务参数: 将准备好的配置文件复制到服务配置目录:cp [配置文件路径]/application.yml /opt/[服务名]/conf/
-
修改配置文件:vi /opt/[服务名]/conf/application.yml,配置数据库连接(URL、用户名、密码)、依赖服务地址(Redis、RabbitMQ等)、服务端口、日志路径等关键参数
-
设置服务启动脚本: 创建启动脚本:vi /opt/[服务名]/bin/start.sh,内容如下:
#!/bin/bash APP_NAME=[服务名]-[版本号].jar APP_PATH=/opt/[服务名]/bin CONF_PATH=/opt/[服务名]/conf LOG_PATH=/opt/[服务名]/log nohup java -jar $APP_PATH/$APP_NAME --spring.config.location=$CONF_PATH/application.yml > $LOG_PATH/start.log 2>&1 & echo "服务启动中,可通过tail -f $LOG_PATH/start.log查看启动日志" -
创建停止脚本:vi /opt/[服务名]/bin/stop.sh,内容如下:
#!/bin/bash APP_NAME=[服务名]-[版本号].jar PID=$(ps -ef | grep $APP_NAME | grep -v grep | awk '{print $2}') if [ -n "$PID" ]; then kill -15 $PID echo "服务已停止,PID:$PID" else echo "未找到服务进程" fi -
授权脚本权限:chmod +x /opt/[服务名]/bin/start.sh /opt/[服务名]/bin/stop.sh
-
启动服务:cd /opt/[服务名]/bin;./start.sh
-
验证服务启动: 查看启动日志:tail -f /opt/[服务名]/log/start.log,确认无报错信息
-
检查进程:ps -ef | grep [服务名],确认进程存在
-
访问服务接口:curl http://[服务IP]:[服务端口]/[健康检查接口],例如:curl http://192.168.1.100:8080/actuator/health,返回健康状态为UP则启动成功
5.3.2 方式二:Docker部署
-
获取Docker镜像: 从私有仓库拉取:docker pull [镜像仓库地址]/[服务名]:[版本号]
-
本地构建镜像(若有Dockerfile):cd [Dockerfile所在目录];docker build -t [服务名]:[版本号] .
-
准备配置文件:[将服务配置文件挂载到容器,例如:创建/opt/[服务名]/docker/conf目录,将application.yml复制到该目录]
-
启动Docker容器:
docker run -d \--name [容器名] \-p [主机端口]:[容器内服务端口] \-v /opt/[服务名]/docker/conf:/opt/[服务名]/conf \-v /opt/[服务名]/docker/log:/opt/[服务名]/log \-e "SPRING_PROFILES_ACTIVE=prod" \--restart=always \[镜像仓库地址]/[服务名]:[版本号]参数说明:-d:后台运行;--name:指定容器名;-p:端口映射;-v:目录挂载;-e:设置环境变量;--restart=always:容器异常退出时自动重启 -
验证容器启动: 查看容器状态:docker ps | grep [容器名],确认状态为Up
-
查看容器日志:docker logs -f [容器名],确认服务启动无报错
-
访问服务接口:同传统部署的接口访问方式,验证服务可用性
5.3.3 方式三:Kubernetes部署
-
准备K8s资源配置文件(如Deployment、Service、ConfigMap等): ConfigMap配置(存储应用配置):vi [服务名]-configmap.yaml
apiVersion: v1 kind: ConfigMap metadata: name: [服务名]-config namespace: [命名空间] data: application.yml: | spring: datasource: url: jdbc:mysql://[数据库服务名].[命名空间]:3306/[数据库名] username: [用户名] password: [密码] redis: host: [Redis服务名].[命名空间] port: 6379 password: [Redis密码] server: port: 8080 -
Deployment配置(定义服务部署):vi [服务名]-deployment.yaml
2. apiVersion: apps/v1 kind: Deployment metadata: name: [服务名] namespace: [命名空间] spec: replicas: 3 # 副本数 selector: matchLabels: app: [服务名] template: metadata: labels: app: [服务名] spec: containers: - name: [服务名] image: [镜像仓库地址]/[服务名]:[版本号] ports: - containerPort: 8080 resources: requests: cpu: "1" memory: "2Gi" limits: cpu: "2" memory: "4Gi" volumeMounts: - name: config-volume mountPath: /opt/[服务名]/conf - name: log-volume mountPath: /opt/[服务名]/log livenessProbe: # 存活探针 httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 60 periodSeconds: 10 readinessProbe: # 就绪探针 httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 30 periodSeconds: 5 volumes: - name: config-volume configMap: name: [服务名]-config - name: log-volume persistentVolumeClaim: claimName: [服务名]-log-pvc # 需提前创建PVC -
Service配置(暴露服务访问):vi [服务名]-service.yaml
apiVersion: v1 kind: Service metadata: name: [服务名] namespace: [命名空间] spec: selector: app: [服务名] ports: - port: 80 targetPort: 8080 type: ClusterIP -
应用K8s配置文件: 创建ConfigMap:kubectl apply -f [服务名]-configmap.yaml
-
创建Deployment:kubectl apply -f [服务名]-deployment.yaml
-
创建Service:kubectl apply -f [服务名]-service.yaml
-
验证K8s部署: 查看Pod状态:kubectl get pods -n [命名空间] | grep [服务名],确认所有Pod状态为Running
-
查看Deployment状态:kubectl get deployment -n [命名空间] [服务名],确认READY数与副本数一致
-
查看Service状态:kubectl get service -n [命名空间] [服务名],确认服务正常暴露
-
访问服务:通过Service的ClusterIP或NodePort访问服务健康检查接口,验证服务可用性
5.4 数据库脚本执行
-
连接数据库:[例如:mysql -h [数据库IP] -u [用户名] -p[密码];或通过数据库客户端工具连接]
-
执行建表脚本:source [脚本路径]/schema-[版本号].sql;或在客户端工具中执行脚本文件
-
执行初始化数据脚本:source [脚本路径]/data-[版本号].sql
-
验证脚本执行:[例如:查询数据库表结构:show tables;查询初始化数据:select * from [表名] limit 10;确认表结构和数据符合预期]
5.5 负载均衡与域名配置(若需)
-
负载均衡配置:[以Nginx为例,修改nginx.conf配置文件]
upstream [服务集群名] {server [应用节点1IP]:[端口] weight=1;server [应用节点2IP]:[端口] weight=1;server [应用节点3IP]:[端口] weight=1;# 负载均衡策略:默认轮询,可配置ip_hash、least_conn等}server {listen 80;server_name [服务域名];location / {proxy_pass http://[服务集群名];proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}重启Nginx生效:systemctl restart nginx -
域名解析配置:[在DNS服务商平台,将服务域名解析至负载均衡器IP或应用节点IP(若无负载均衡)]
-
验证配置:通过域名访问服务,例如:curl http://[服务域名]/[健康检查接口],确认服务正常响应
6. 部署后验证
6.1 功能验证
|
功能模块 |
验证用例 |
验证步骤 |
预期结果 |
实际结果 |
验证状态 |
|---|---|---|---|---|---|
|
[核心功能1] |
[例如:用户登录功能] |
1. 调用登录接口:POST http://[服务地址]/api/login;2. 请求参数:{username:"test", password:"123456"};3. 查看返回结果 |
返回状态码200,包含token信息 |
|
□ 通过 □ 未通过 |
|
[核心功能2] |
[例如:数据查询功能] |
1. 调用查询接口:GET http://[服务地址]/api/data?page=1&size=10;2. 携带登录token;3. 查看返回数据 |
返回状态码200,数据列表符合预期,分页正确 |
|
□ 通过 □ 未通过 |
|
[其他功能] |
[填写验证用例] |
[填写验证步骤] |
[填写预期结果] |
|
□ 通过 □ 未通过 |
6.2 性能验证
-
响应时间:[使用工具如JMeter、Postman,对核心接口进行压测,记录平均响应时间,例如:单接口平均响应时间≤500ms,满足性能要求]
-
并发能力:[设置并发用户数(如:100、500、1000),测试接口的QPS(每秒查询率),例如:QPS达到500以上,无请求超时]
-
资源占用:[压测期间,通过监控工具(如:top、prometheus+grafana)查看应用节点的CPU、内存占用,例如:CPU占用≤70%,内存占用稳定,无内存泄漏]
-
稳定性:[长时间运行测试(如:24小时),观察服务是否稳定,无异常退出、接口报错等情况]
6.3 兼容性验证
-
浏览器兼容性:[若为Web服务,测试在主流浏览器(Chrome、Firefox、Edge、Safari)中的功能正常性]
-
客户端兼容性:[若为接口服务,测试不同客户端(Java、Python、前端JS)调用接口的兼容性]
-
版本兼容性:[测试服务与依赖服务的版本兼容性,例如:服务与MySQL 8.0、Redis 6.2的兼容正常]
6.4 安全验证
-
接口安全:[验证接口是否需要权限校验,无权限访问时返回正确的错误码;敏感参数(如密码)是否加密传输]
-
数据安全:[验证数据库敏感数据(如用户密码)是否加密存储;服务日志中是否未泄露敏感信息]
-
网络安全:[验证服务是否仅开放必要端口;是否配置防火墙策略,限制非法IP访问]
7. 服务运维与监控
7.1 日常运维操作
|
操作类型 |
操作命令/步骤 |
注意事项 |
|---|---|---|
|
启动服务 |
传统部署:/opt/[服务名]/bin/start.sh;Docker:docker start [容器名];K8s:kubectl scale deployment [服务名] -n [命名空间] --replicas=3 |
启动前确认配置文件正确,依赖服务正常 |
|
停止服务 |
传统部署:/opt/[服务名]/bin/stop.sh;Docker:docker stop [容器名];K8s:kubectl scale deployment [服务名] -n [命名空间] --replicas=0 |
生产环境停止前需提前通知相关业务方,避免影响业务 |
|
重启服务 |
传统部署:/opt/[服务名]/bin/stop.sh && /opt/[服务名]/bin/start.sh;Docker:docker restart [容器名];K8s:kubectl rollout restart deployment [服务名] -n [命名空间] |
重启后需验证服务是否正常启动 |
|
查看日志 |
传统部署:tail -f /opt/[服务名]/log/[日志文件名];Docker:docker logs -f [容器名];K8s:kubectl logs -f [Pod名] -n [命名空间] |
使用grep命令过滤关键信息,如:grep "ERROR" /opt/[服务名]/log/start.log |
|
版本升级 |
传统部署:停止服务→替换安装包→启动服务;Docker:docker pull 新镜像→停止旧容器→启动新容器;K8s:kubectl set image deployment [服务名] [服务名]=[新镜像地址] -n [命名空间] |
升级前备份旧版本安装包/镜像,以便回滚;建议灰度升级(如K8s的滚动更新) |
|
服务回滚 |
传统部署:停止服务→替换为旧版本安装包→启动服务;Docker:docker start 旧容器或重新启动旧版本镜像;K8s:kubectl rollout undo deployment [服务名] -n [命名空间] |
回滚后需立即验证服务功能和性能 |
7.2 监控配置
-
监控指标:[明确需要监控的指标,例如:服务状态(运行/停止)、接口响应时间、QPS、错误率;服务器CPU、内存、硬盘、网络使用率;数据库连接数、查询耗时、慢查询数;依赖服务(Redis、RabbitMQ)的运行状态和关键指标]
-
监控工具:[说明使用的监控工具及配置方式,例如: 应用监控:Spring Boot Actuator + Prometheus + Grafana,配置服务暴露监控端点,Prometheus采集指标,Grafana展示监控面板
-
服务器监控:Zabbix、Nagios,配置服务器资源监控告警
-
日志监控:ELK Stack(Elasticsearch、Logstash、Kibana),收集服务日志,支持日志检索和异常监控
告警配置:[设置告警规则和通知方式,例如: 告警规则:服务停止超过5分钟;接口错误率超过1%;CPU使用率超过80%持续5分钟;数据库慢查询数每分钟超过10条
通知方式:邮件(发送至[邮箱地址])、短信(发送至[手机号])、企业微信/钉钉机器人通知(发送至[群聊])
8. 常见问题与解决方案
|
常见问题 |
可能原因 |
解决方案 |
|---|---|---|
|
服务启动失败,日志提示“数据库连接超时” |
1. 数据库服务未启动;2. 数据库IP、端口配置错误;3. 数据库账号密码错误;4. 网络不通,应用节点无法访问数据库 |
1. 检查数据库服务状态:systemctl status mysql;2. 核对配置文件中的数据库连接信息;3. 测试应用节点到数据库的网络连通性:telnet [数据库IP] 3306;4. 确认数据库账号权限是否正常 |
|
接口访问返回“403 Forbidden” |
1. 权限校验未通过(未携带token或token过期);2. 防火墙或安全组限制了访问;3. 服务配置了IP白名单,访问IP不在白名单内 |
1. 检查请求头是否携带有效token,若过期重新获取;2. 检查防火墙/安全组规则,开放访问端口;3. 核对服务IP白名单配置,将访问IP加入白名单 |
|
服务运行中出现“内存溢出(OOM)” |
1. 服务内存配置不足;2. 存在内存泄漏问题;3. 并发请求过高,内存占用超出限制 |
1. 调整服务JVM参数,增加内存配置:java -Xms2g -Xmx4g -jar [服务名].jar;2. 分析内存快照(如:使用jmap命令生成快照,jhat工具分析),定位内存泄漏点;3. 优化代码,减少内存占用;4. 增加服务副本数,分担并发压力 |
|
Docker容器启动后立即退出 |
1. 容器内服务启动失败;2. 容器启动命令错误;3. 容器无前台进程运行(如:服务启动后后台运行,导致容器退出) |
1. 查看容器日志:docker logs [容器名],定位服务启动失败原因;2. 核对容器启动命令,确保参数正确;3. 确保服务启动后有前台进程(如:Java服务避免使用nohup,或使用docker run的-it参数) |
|
[其他常见问题] |
[填写可能原因] |
[填写解决方案] |
9. 附录
9.1 参考文档
-
[文档1]:[例如:《Spring Boot官方部署文档》,链接:[官方文档链接]]
-
[文档2]:[例如:《Docker容器化最佳实践》,链接:[文档链接]]
-
[文档3]:[例如:《Kubernetes Deployment配置指南》,链接:[文档链接]]
9.2 相关资源链接
-
Git仓库地址:[服务源码/配置文件仓库地址]
-
Docker镜像仓库地址:[镜像仓库地址]
-
监控平台地址:[Grafana/Zabbix监控平台访问地址]
-
日志平台地址:[Kibana日志平台访问地址]
9.3 术语说明
|
术语 |
说明 |
|---|---|
|
QPS |
每秒查询率,衡量服务并发处理能力的指标 |
|
OOM |
内存溢出,指程序运行时申请的内存超出了系统分配的内存限制 |
|
PVC |
PersistentVolumeClaim,Kubernetes中的持久化存储声明,用于申请持久化存储资源 |
|
[其他术语] |
[填写术语说明] |
9.4 变更记录
|
版本号 |
变更日期 |
变更内容 |
变更人 |
|---|---|---|---|
|
V1.0.0 |
[年-月-日] |
初始版本,完成服务部署文档初稿 |
[姓名] |
|
V1.0.1 |
[年-月-日] |
补充Docker部署方式的详细步骤,更新常见问题模块 |
[姓名] |
|
[版本号] |
[年-月-日] |
[变更内容] |
[姓名] |