fundplatform/doc/部署运维文档.md
zhangjf 645056eaf0 添加服务启动方式说明文档
更新内容:
1. 在单机部署文档中增加 4.8 节,详细说明服务启动方式
2. 在部署运维文档中增加 1.5 节,说明开发环境和生产环境的启动方式

关键约束:
- 明确说明不能使用 java -jar 方式启动(瘦包打包导致)
- 开发环境:使用 mvn spring-boot:run 或 IDE 直接运行
- 生产环境:使用 bin/start.sh 脚本启动
- 解释技术原因:Maven Assembly Plugin 瘦包打包、Manifest 配置缺失、类加载机制

调试建议:
- 开发环境推荐使用 IDE 或 Maven 插件
- 生产环境始终使用启动脚本
- 提供日志查看、进程检查等调试方法
2026-03-01 19:05:04 +08:00

41 KiB
Raw Permalink Blame History

资金服务平台部署运维文档

版本: v2.1
更新日期: 2026-02-13
作者: zhangjf


一、本地开发环境搭建

1.1 环境要求

组件 版本要求 说明
JDK 21+ Java开发工具包
Maven 3.9+ 项目构建工具
MySQL 8.0+ 数据库
Redis 7.0+ 缓存服务
Nacos 3.0+ 服务注册与配置中心
Node.js 18+ 前端开发环境

1.2 安装步骤

1.2.1 安装 JDK 21

# Ubuntu/Debian
sudo apt update
sudo apt install openjdk-21-jdk

# 配置环境变量
echo 'export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64' >> ~/.bashrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

# 验证安装
java -version

1.2.2 安装 Maven 3.9

# 下载并解压 Maven
wget https://dlcdn.apache.org/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz
tar -xzf apache-maven-3.9.9-bin.tar.gz -C /opt/

# 配置环境变量
echo 'export MAVEN_HOME=/opt/apache-maven-3.9.9' >> ~/.bashrc
echo 'export PATH=$MAVEN_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

# 验证安装
mvn -version

1.2.3 安装 MySQL 8.0

# Ubuntu/Debian
sudo apt update
sudo apt install mysql-server-8.0

# 启动 MySQL
sudo systemctl start mysql
sudo systemctl enable mysql

# 配置 root 密码
sudo mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'zjf@123456';"

# 创建数据库
mysql -u root -p'zjf@123456' -e "CREATE DATABASE fund_platform CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

1.2.4 安装 Redis

# Ubuntu/Debian
sudo apt update
sudo apt install redis-server

# 配置密码
sudo sed -i 's/# requirepass foobared/requirepass zjf@123456/' /etc/redis/redis.conf

# 启动 Redis
sudo systemctl restart redis
sudo systemctl enable redis

# 验证安装
redis-cli -a zjf@123456 ping

1.2.5 安装 Nacos 3.0

# 下载 Nacos
cd /opt
wget https://github.com/alibaba/nacos/releases/download/3.0.0/nacos-server-3.0.0.tar.gz
tar -xzf nacos-server-3.0.0.tar.gz

# 配置端口
cd nacos/conf
sed -i 's/server.port=8848/server.port=8048/' application.properties

# 启动 Nacos单机模式
cd /opt/nacos/bin
sh startup.sh -m standalone

# 访问控制台http://localhost:8048/nacos
# 默认账号密码nacos / nacos

1.2.6 安装 Node.js 18

# 使用 nvm 安装
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
source ~/.bashrc
nvm install 18
nvm use 18

# 验证安装
node -v
npm -v

1.3 项目初始化

# 克隆项目
git clone <repository-url>
cd fundplatform

# 初始化数据库
mysql -u root -p'zjf@123456' < sql/fund_platform_schema.sql
mysql -u root -p'zjf@123456' < sql/fund_platform_init.sql

# 配置环境变量
cp .env.example .env
# 编辑 .env 文件配置数据库、Redis、Nacos 连接信息

1.4 启动服务

# 1. 确保 MySQL、Redis、Nacos 已启动

# 2. 启动后端服务(在各自服务目录执行)
cd fund-gateway
mvn spring-boot:run

cd fund-sys
mvn spring-boot:run

# 3. 启动前端Vue 3
cd fund-admin
npm install
npm run dev

# 4. 访问系统
# 管理后台http://localhost:3000
# 移动端H5http://localhost:8080
# 网关地址http://localhost:8000
# Nacos 控制台http://localhost:8048/nacos
# Grafana 监控http://localhost:3000 (Docker 环境) 或 http://localhost:3001 (本地开发)
# Prometheushttp://localhost:9090

1.5 服务启动方式说明(重要)

⚠️ 重要提示: 为了打包发布的需要,每个服务 JAR 都采用瘦包方式打包(依赖分离),因此不能使用 java -jar 方式执行。

1.5.1 开发环境启动方式

正确的方式:

  1. 使用 Maven 插件(推荐)
cd fund-sys
mvn spring-boot:run
  1. 使用 IDE 直接运行
  • 找到对应的 Application 类(如 SysApplication.java
  • 右键 -> Run 运行

错误的方式:

# 以下方式会导致 ClassNotFoundException
cd fund-sys/target
java -jar fund-sys-0.0.1-SNAPSHOT.jar

1.5.2 生产环境启动方式

正确的方式:

  1. 使用启动脚本(推荐)
cd /opt/fundplatform/deploy/fund-sys
./bin/start.sh
  1. 手动指定类路径
cd /opt/fundplatform/deploy/fund-sys
java -cp "lib/*:conf/" com.fundplatform.sys.SysApplication

错误的方式:

# 以下方式会导致 ClassNotFoundException
cd /opt/fundplatform/deploy/fund-sys/lib
java -jar fund-sys.jar

1.5.3 为什么不能使用 java -jar

  1. 瘦包打包方式:项目使用 Maven Assembly Plugin 将依赖 JAR 分离到 lib/ 目录
  2. Manifest 配置:主 JAR 包的 MANIFEST.MF 中没有 Class-Path 属性
  3. 类加载机制JVM 无法自动找到 lib/ 目录下的依赖

1.5.4 调试建议

开发环境:

  • 使用 IDE 直接运行 Application 类
  • 使用 mvn spring-boot:run 命令
  • 避免使用 java -jar 命令

生产环境:

  • 始终使用 bin/start.sh 脚本启动
  • 查看日志:tail -f /datacfs/applogs/fund-sys/info.log
  • 检查进程:ps aux | grep fund-sys
  • 查看端口:netstat -tlnp | grep 8100

二、Docker Compose 部署

2.1 部署架构

项目支持 Docker Compose 一键部署,包含以下服务组件:

┌─────────────────────────────────────────────────────────────────────────────┐
│                         Docker Compose 部署架构                              │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│   ┌──────────────┐                                                          │
│   │   前端服务    │                                                          │
│   │ fund-admin   │  ← 管理后台 (http://localhost/fadmin/)                     │
│   │ fund-mobile  │  ← 移动端H5 (http://localhost/fmobile/)                    │
│   └──────┬───────┘                                                          │
│          │                                                                   │
│   ┌──────┴───────┐                                                          │
│   │   Gateway    │  ← API网关 (http://localhost:8000)                        │
│   │   :8000      │                                                          │
│   └──────┬───────┘                                                          │
│          │                                                                   │
│   ┌──────┴──────────────────────────────────────────┐                       │
│   │                                                  │                       │
│   ▼              ▼              ▼              ▼    │                       │
│ ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────┐ │                       │
│ │fund-sys │  │fund-cust│  │fund-proj│  │fund-req │ │  ← 业务微服务集群       │
│ │ :8100   │  │ :8200   │  │ :8300   │  │ :8400   │ │                       │
│ └─────────┘  └─────────┘  └─────────┘  └─────────┘ │                       │
│                                                      │                       │
│ ┌─────────┐  ┌─────────┐  ┌─────────┐              │                       │
│ │fund-exp │  │fund-rcpt│  │fund-rpt │              │                       │
│ │ :8500   │  │ :8600   │  │ :8700   │              │                       │
│ └─────────┘  └─────────┘  └─────────┘              │                       │
│                                                      │                       │
│   ┌──────────────────────┬─────────────────────┐   │                       │
│   │                      │                     │   │                       │
│   ▼                      ▼                     ▼   │                       │
│ ┌─────────┐          ┌─────────┐          ┌─────────┐                       │
│ │  MySQL  │          │  Redis  │          │  Nacos  │  ← 基础设施            │
│ │ :3306   │          │ :6379   │          │ :8848   │                       │
│ └─────────┘          └─────────┘          └─────────┘                       │
│                                                                              │
│ ┌─────────────────────────────────────────────────────────────────────┐    │
│ │                       监控体系                                       │    │
│ │  ┌─────────────┐              ┌─────────────┐                        │    │
│ │  │ Prometheus  │              │   Grafana   │                        │    │
│ │  │   :9090     │──────────────│   :3000     │                        │    │
│ │  └─────────────┘              └─────────────┘                        │    │
│ └─────────────────────────────────────────────────────────────────────┘    │
│                                                                              │
└─────────────────────────────────────────────────────────────────────────────┘

2.2 服务清单

服务 端口 说明
fund-admin 80 管理后台前端 (访问路径: /fadmin/)
fund-mobile 80 移动端H5 (访问路径: /fmobile/)
gateway 8000 API网关
fund-sys 8100 系统管理服务
fund-sys-vip001 8101 系统服务VIP专属实例
fund-cust 8200 客户管理服务
fund-proj 8300 项目管理服务
fund-req 8400 需求工单服务
fund-exp 8500 支出管理服务
fund-receipt 8600 收款管理服务
fund-report 8700 报表服务
fund-file 8800 文件服务
mysql 3306 MySQL数据库
redis 6379 Redis缓存
nacos 8848 Nacos服务注册中心
prometheus 9090 Prometheus监控
grafana 3000 Grafana可视化

2.3 快速部署

# 1. 克隆项目
git clone <repository-url>
cd fundplatform

# 2. 初始化环境
./deploy.sh init

# 3. 构建镜像
./deploy.sh build

# 4. 启动所有服务
./deploy.sh start

# 5. 查看服务状态
./deploy.sh status

# 6. 查看日志
./deploy.sh logs --service fund-sys

2.4 部署脚本命令

命令 说明
./deploy.sh start 启动所有服务
./deploy.sh stop 停止所有服务
./deploy.sh restart 重启所有服务
./deploy.sh build 构建所有镜像
./deploy.sh rebuild 重新构建(不使用缓存)
./deploy.sh logs 查看服务日志
./deploy.sh status 查看服务状态
./deploy.sh clean 清理未使用的镜像和容器
./deploy.sh init 初始化环境(首次部署)

2.5 多租户混合负载模式

项目支持 多租户混合负载模式可实现VIP专属实例与普通租户共享实例并存

┌─────────────────────────────────────────────────────────────────┐
│                    多租户混合负载模式                            │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│   请求 ──► Gateway ──► TenantGatewayFilter (提取租户ID)          │
│                              │                                   │
│              ┌───────────────┼───────────────┐                   │
│              ▼               ▼               ▼                   │
│      ┌──────────────┐ ┌──────────────┐ ┌──────────────┐         │
│      │ 共享实例      │ │ VIP_004专属  │ │ VIP_005专属  │         │
│      │ (多租户共享)  │ │ (单租户独占) │ │ (单租户独占) │         │
│      │ fund-sys     │ │ fund-sys-    │ │ fund-sys-    │         │
│      │ :8100        │ │ vip001:8101  │ │ vip002:8102  │         │
│      │              │ │              │ │              │         │
│      │ TENANT_ID:   │ │ TENANT_ID:   │ │ TENANT_ID:   │         │
│      │ VIP_001,     │ │ VIP_004      │ │ VIP_005      │         │
│      │ VIP_002,     │ │              │ │              │         │
│      │ VIP_003      │ │              │ │              │         │
│      └──────────────┘ └──────────────┘ └──────────────┘         │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

配置方式

docker-compose.yml 中通过环境变量 TENANT_ID 指定实例服务的租户:

# 共享实例 - 服务多个租户
fund-sys:
  environment:
    TENANT_ID: "VIP_001,VIP_002,VIP_003"  # 逗号分隔,服务多个租户

# VIP专属实例 - 单租户独占
fund-sys-vip001:
  environment:
    TENANT_ID: "VIP_004"  # 单租户专属实例

三、测试环境部署

3.1 服务器配置

组件 配置 数量
应用服务器 4核8G 2台
数据库服务器 4核8G 1台
缓存服务器 2核4G 1台

3.2 部署架构

┌─────────────────────────────────────────────────────────────┐
│                         测试环境部署架构                       │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│   ┌──────────────┐                                          │
│   │   Nginx      │  ← 负载均衡 + 静态资源                    │
│   │  (80/443)    │                                          │
│   └──────┬───────┘                                          │
│          │                                                   │
│   ┌──────┴──────┐                                           │
│   │             │                                           │
│   ▼             ▼                                           │
│ ┌─────────┐  ┌─────────┐                                    │
│ │AppSrv-1 │  │AppSrv-2 │  ← 应用服务器Gateway + Services│
│ │:8080-8090│  │:8080-8090│                                    │
│ └────┬────┘  └────┬────┘                                    │
│      │            │                                         │
│      └─────┬──────┘                                         │
│            │                                                 │
│   ┌────────┴────────┐                                       │
│   │                 │                                       │
│   ▼                 ▼                                       │
│ ┌─────────┐     ┌─────────┐                                │
│ │  MySQL  │     │  Redis  │                                │
│ │ :3306   │     │ :6379   │                                │
│ └─────────┘     └─────────┘                                │
│                                                              │
│ ┌─────────┐                                                 │
│ │  Nacos  │  ← 服务注册与配置中心                            │
│ │ :8848   │                                                 │
│ └─────────┘                                                 │
│                                                              │
└─────────────────────────────────────────────────────────────┘

3.3 部署步骤

3.3.1 部署 Nacos

# 在服务器上安装 Nacos
cd /opt
wget https://github.com/alibaba/nacos/releases/download/3.0.0/nacos-server-3.0.0.tar.gz
tar -xzf nacos-server-3.0.0.tar.gz
cd nacos/conf

# 配置 MySQL 持久化
cat >> application.properties << EOF
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://mysql-server:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai
db.user.0=nacos
db.password.0=nacos_password
EOF

# 启动 Nacos集群模式
cd /opt/nacos/bin
sh startup.sh

3.3.2 部署 MySQL

# 创建数据库和用户
mysql -u root -p << EOF
CREATE DATABASE IF NOT EXISTS fund_platform CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'fund_user'@'%' IDENTIFIED BY 'Fund@123456';
GRANT ALL PRIVILEGES ON fund_platform.* TO 'fund_user'@'%';
FLUSH PRIVILEGES;
EOF

# 导入表结构和数据
mysql -u fund_user -p'Fund@123456' fund_platform < fund_platform_schema.sql
mysql -u fund_user -p'Fund@123456' fund_platform < fund_platform_init.sql

3.3.3 部署 Redis

# 配置 Redis
sudo tee /etc/redis/redis.conf > /dev/null << EOF
bind 0.0.0.0
port 6379
requirepass Redis@123456
maxmemory 2gb
maxmemory-policy allkeys-lru
appendonly yes
EOF

# 启动 Redis
sudo systemctl restart redis

3.3.4 部署应用服务

# 1. 打包应用
cd fundplatform
mvn clean package -DskipTests

# 2. 上传 jar 包到服务器
scp fund-gateway/target/fund-gateway-1.0.0.jar user@app-server-1:/opt/fundplatform/
scp fund-sys/target/fund-sys-1.0.0.jar user@app-server-1:/opt/fundplatform/

# 3. 创建启动脚本
cat > /opt/fundplatform/start.sh << 'EOF'
#!/bin/bash
APP_NAME=$1
JAR_FILE=$2

nohup java -Xms512m -Xmx1024m \
  -Dspring.profiles.active=test \
  -Dfile.encoding=UTF-8 \
  -jar $JAR_FILE > logs/$APP_NAME.log 2>&1 &

echo "$APP_NAME started, PID: $!"
EOF

chmod +x /opt/fundplatform/start.sh

# 4. 启动服务
./start.sh gateway fund-gateway-1.0.0.jar
./start.sh sys fund-sys-1.0.0.jar

3.3.5 部署 Nginx

# 安装 Nginx
sudo apt install nginx

# 配置反向代理
sudo tee /etc/nginx/sites-available/fundplatform << 'EOF'
upstream gateway {
    server app-server-1:8080 weight=5;
    server app-server-2:8080 weight=5;
}

server {
    listen 80;
    server_name test.fundplatform.com;
    
    # 管理后台前端 (部署路径: /fadmin/)
    location /fadmin/ {
        alias /opt/fundplatform/admin/;
        try_files $uri $uri/ /fadmin/index.html;
    }
    
    # 移动端H5 (部署路径: /fmobile/)
    location /fmobile/ {
        alias /opt/fundplatform/mobile/;
        try_files $uri $uri/ /fmobile/index.html;
    }
    
    # API 代理 (网关前缀: /fund)
    location /fund/ {
        proxy_pass http://gateway/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
EOF

sudo ln -s /etc/nginx/sites-available/fundplatform /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

四、生产环境部署

4.1 服务器配置

组件 配置 数量 说明
应用服务器 8核16G 3台 运行 Gateway 和微服务
数据库服务器 8核16G 2台 MySQL 主从
缓存服务器 4核8G 3台 Redis 集群
Nacos 服务器 4核8G 3台 Nacos 集群
Nginx 服务器 4核8G 2台 负载均衡

4.2 部署架构

┌─────────────────────────────────────────────────────────────────────────────┐
│                              生产环境部署架构                                 │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│   ┌──────────────┐              ┌──────────────┐                            │
│   │   Nginx-1    │◄────────────►│   Nginx-2    │  ← 负载均衡Keepalived   │
│   │  (VIP:80/443)│              │              │                            │
│   └──────┬───────┘              └──────┬───────┘                            │
│          │                              │                                   │
│          └──────────────┬───────────────┘                                   │
│                         │                                                   │
│   ┌─────────────────────┼─────────────────────┐                             │
│   │                     │                     │                             │
│   ▼                     ▼                     ▼                             │
│ ┌─────────┐         ┌─────────┐         ┌─────────┐                        │
│ │AppSrv-1 │         │AppSrv-2 │         │AppSrv-3 │  ← 应用服务集群          │
│ │:8080-8090│         │:8080-8090│         │:8080-8090│                        │
│ └────┬────┘         └────┬────┘         └────┬────┘                        │
│      │                   │                   │                             │
│      └───────────────────┼───────────────────┘                             │
│                          │                                                  │
│   ┌──────────────────────┼──────────────────────┐                          │
│   │                      │                      │                          │
│   ▼                      ▼                      ▼                          │
│ ┌─────────┐          ┌─────────┐          ┌─────────┐                     │
│ │  MySQL  │◄────────►│  MySQL  │          │  Redis  │  ← 数据层            │
│ │ Master  │   主从   │  Slave  │          │ Cluster │                     │
│ │ :3306   │   复制   │  :3306  │          │ :6379   │                     │
│ └─────────┘          └─────────┘          └────┬────┘                     │
│                                                 │                          │
│   ┌─────────────────────────────────────────────┘                          │
│   │                                                                         │
│   ▼                                                                         │
│ ┌─────────┐  ┌─────────┐  ┌─────────┐                                     │
│ │ Nacos-1 │◄►│ Nacos-2 │◄►│ Nacos-3 │  ← Nacos 集群(外置 MySQL          │
│ │ :8848   │  │ :8848   │  │ :8848   │                                     │
│ └─────────┘  └─────────┘  └─────────┘                                     │
│                                                                              │
└─────────────────────────────────────────────────────────────────────────────┘

4.3 高可用配置

4.3.1 MySQL 主从配置

# 主库配置
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=fund_platform

# 从库配置
[mysqld]
server-id=2
relay-log=mysql-relay-bin
replicate-do-db=fund_platform

# 创建复制用户
CREATE USER 'repl'@'%' IDENTIFIED BY 'Repl@123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

# 从库执行
CHANGE MASTER TO
  MASTER_HOST='master-host',
  MASTER_USER='repl',
  MASTER_PASSWORD='Repl@123456',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=154;
START SLAVE;

4.3.2 Redis 集群配置

# 创建 6 个节点3主3从
redis-server --port 7001 --cluster-enabled yes --cluster-config-file nodes-7001.conf
redis-server --port 7002 --cluster-enabled yes --cluster-config-file nodes-7002.conf
redis-server --port 7003 --cluster-enabled yes --cluster-config-file nodes-7003.conf
redis-server --port 7004 --cluster-enabled yes --cluster-config-file nodes-7004.conf
redis-server --port 7005 --cluster-enabled yes --cluster-config-file nodes-7005.conf
redis-server --port 7006 --cluster-enabled yes --cluster-config-file nodes-7006.conf

# 创建集群
redis-cli --cluster create \
  node1:7001 node1:7002 node2:7003 node2:7004 node3:7005 node3:7006 \
  --cluster-replicas 1

4.3.3 Nacos 集群配置

# 配置 cluster.conf
cat > /opt/nacos/conf/cluster.conf << EOF
nacos-1:8848
nacos-2:8848
nacos-3:8848
EOF

# 配置 MySQL 持久化
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://mysql-cluster:3306/nacos?...
db.user.0=nacos
db.password.0=nacos_password

# 启动 Nacos
sh startup.sh

4.3.4 Nginx + Keepalived

# 安装 Keepalived
sudo apt install keepalived

# 配置 Keepalived主节点
cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
    router_id NGINX_MASTER
}

vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    
    virtual_ipaddress {
        192.168.1.100/24
    }
    
    track_script {
        check_nginx
    }
}
EOF

# 健康检查脚本
cat > /etc/keepalived/check_nginx.sh << 'EOF'
#!/bin/bash
if ! pgrep nginx > /dev/null; then
    systemctl start nginx
    sleep 2
    if ! pgrep nginx > /dev/null; then
        systemctl stop keepalived
    fi
fi
EOF

chmod +x /etc/keepalived/check_nginx.sh

五、运维手册

5.1 监控体系

5.1.1 应用监控Prometheus + Grafana

项目已集成 Prometheus + Grafana 监控体系,通过 Docker Compose 自动部署。

Prometheus 配置 (docker/prometheus/prometheus.yml)

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'fund-gateway'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['gateway:8000']
  
  - job_name: 'fund-sys'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['fund-sys:8100', 'fund-sys-vip001:8101']
  
  - job_name: 'fund-cust'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['fund-cust:8200']

访问地址

5.1.2 关键监控指标

指标 告警阈值 说明
JVM 内存使用率 > 80% JVM 堆内存使用百分比
CPU 使用率 > 80% 服务器 CPU 使用率
磁盘使用率 > 85% 磁盘空间使用百分比
接口响应时间 > 2s API 平均响应时间
错误率 > 5% HTTP 5xx 错误率
MySQL 连接数 > 80% 数据库连接数使用率
Redis 内存使用率 > 80% Redis 内存使用百分比

5.2 日志管理

5.2.1 日志配置

项目采用 Logback 作为日志框架,支持 TraceId + SpanId 链路追踪

关键配置

<!-- logback-spring.xml 核心配置 -->
<configuration>
    <!-- APP_NAME使用INSTANCE_NAME区分多实例 -->
    <springProperty scope="context" name="APP_NAME" source="app.instance.name" defaultValue="fund-sys"/>
    <springProperty scope="context" name="LOG_PATH" source="logging.file.path" defaultValue="/datacfs/applogs"/>
    <springProperty scope="context" name="LOG_LEVEL_ROOT" source="logging.level.root" defaultValue="INFO"/>
    <springProperty scope="context" name="LOG_LEVEL_APP" source="logging.level.app" defaultValue="DEBUG"/>
    
    <!-- 日志格式直接配置避免shell解析问题 -->
    <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n"/>
    
    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    
    <!-- INFO级别日志文件 -->
    <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/${APP_NAME}/info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/${APP_NAME}/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    
    <!-- ERROR级别日志文件 -->
    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/${APP_NAME}/error.log</file>
        <!-- 配置同上 -->
    </appender>
    
    <!-- JSON格式日志(用于ELK采集) -->
    <appender name="JSON_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/${APP_NAME}/json.log</file>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <customFields>{"app_name":"${APP_NAME}"}</customFields>
        </encoder>
    </appender>
</configuration>

多实例日志隔离

实例 INSTANCE_NAME 日志目录
普通租户 fund-sys /datacfs/applogs/fund-sys/
VIP租户 fund-sys-vip /datacfs/applogs/fund-sys-vip/

日志文件结构

/datacfs/applogs/
├── fund-gateway/
│   ├── info.log           # 主日志
│   ├── error.log          # 错误日志
│   ├── json.log           # JSON格式日志(ELK)
│   ├── aop.log            # API请求日志
│   └── stdout.log         # 标准输出日志
├── fund-sys/
│   ├── info.log
│   ├── error.log
│   └── ...
└── fund-sys-vip/          # VIP租户实例
    ├── info.log
    └── ...

5.2.2 启动脚本配置

启动脚本支持多租户多实例部署,关键特性:

# start.sh 核心逻辑

# 1. 加载配置文件
load_properties "${APP_HOME}/conf/env.properties"
load_properties "${APP_HOME}/conf/service.properties"

# 2. INSTANCE_NAME处理
# 如果INSTANCE_NAME为空自动使用APP_NAME
if [[ -z "${INSTANCE_NAME}" ]]; then
    INSTANCE_NAME=${APP_NAME}
fi

# 3. ClassPath配置lib/*:conf
CLASSPATH="${APP_HOME}/lib/*:${APP_HOME}/conf"

# 4. JVM参数
JAVA_OPTS="-Xms256m -Xmx512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200"

# 5. 日志参数使用INSTANCE_NAME区分实例
LOG_OPTS="-Dlogging.file.path=${LOG_HOME}"
LOG_OPTS="$LOG_OPTS -Dapp.instance.name=${INSTANCE_NAME}"

# 6. 启动命令java -cp模式
nohup java $JAVA_OPTS $LOG_OPTS $TENANT_OPTS -cp "$CLASSPATH" $MAIN_CLASS >${LOG_HOME}/${INSTANCE_NAME}/stdout.log 2>&1 &

关键参数说明

参数 说明 来源
APP_NAME 服务名称 service.properties
INSTANCE_NAME 实例名称(唯一) service.properties空则用APP_NAME
MAIN_CLASS 主类 service.properties
LOG_HOME 日志根目录 env.properties
TENANT_ID 租户ID service.properties

启动命令示例

# 单实例启动
./bin/start.sh

# 多实例启动VIP租户
INSTANCE_NAME=fund-sys-vip TENANT_ID=vip001 ./bin/start.sh

5.2.3 ELK 日志收集

# filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/fundplatform/*.log
  fields:
    service: fundplatform
  multiline.pattern: '^\d{4}-\d{2}-\d{2}'
  multiline.negate: true
  multiline.match: after

output.elasticsearch:
  hosts: ["elasticsearch:9200"]
  index: "fundplatform-%{+yyyy.MM.dd}"

5.3 备份策略

5.3.1 数据库备份

#!/bin/bash
# 数据库备份脚本

BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="fund_platform"
DB_USER="backup_user"
DB_PASS="Backup@123456"

# 全量备份
mysqldump -u$DB_USER -p$DB_PASS --single-transaction --routines --triggers $DB_NAME > $BACKUP_DIR/${DB_NAME}_${DATE}.sql

# 压缩
gzip $BACKUP_DIR/${DB_NAME}_${DATE}.sql

# 删除 7 天前的备份
find $BACKUP_DIR -name "${DB_NAME}_*.sql.gz" -mtime +7 -delete

# 上传到对象存储
aws s3 cp $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz s3://fundplatform-backup/mysql/

5.3.2 备份计划

备份类型 频率 保留时间
全量备份 每天 02:00 30 天
增量备份 每小时 7 天
二进制日志 实时 7 天

5.4 故障处理

5.4.1 常见故障及处理

故障现象 可能原因 处理方案
服务无法启动 端口冲突 检查端口占用,修改配置
数据库连接失败 连接池耗尽 增加连接池大小,检查慢查询
内存溢出 内存泄漏 分析堆转储,重启服务
接口超时 下游服务慢 检查依赖服务,增加熔断
Redis 连接失败 连接数超限 增加连接池,检查连接泄露

5.4.2 应急处理流程

1. 故障发现
   ↓
2. 故障确认(查看监控、日志)
   ↓
3. 故障定级P0-核心功能不可用P1-部分功能受影响P2-轻微影响)
   ↓
4. 启动应急预案
   - P0立即回滚或重启
   - P1限流降级保留核心功能
   - P2记录问题计划修复
   ↓
5. 故障恢复验证
   ↓
6. 故障复盘

5.5 性能优化

5.5.1 JVM 调优

# 生产环境 JVM 参数
java -server \
  -Xms4g -Xmx4g \
  -XX:MetaspaceSize=256m \
  -XX:MaxMetaspaceSize=512m \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/var/log/fundplatform/heapdump.hprof \
  -jar app.jar

5.5.2 MySQL 调优

# my.cnf
[mysqld]
# 连接配置
max_connections = 500
max_connect_errors = 1000
wait_timeout = 600
interactive_timeout = 600

# InnoDB 配置
innodb_buffer_pool_size = 4G
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT

# 查询缓存
query_cache_type = 1
query_cache_size = 256M

# 慢查询日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2

5.5.3 Redis 调优

# redis.conf
maxmemory 4gb
maxmemory-policy allkeys-lru
tcp-keepalive 300
timeout 0

六、附录

6.1 常用命令

# 查看服务状态
systemctl status mysql
systemctl status redis
systemctl status nginx

# 查看日志
tail -f logs/fund-gateway/info.log
tail -f logs/fund-sys/aop.log

# 查看进程
ps -ef | grep java
netstat -tlnp | grep 8000

# 数据库操作
mysql -u root -p'zjf@123456'
redis-cli -a 'zjf@123456'

# Nacos 管理
curl http://localhost:8848/nacos/v1/ns/instance/list?serviceName=fund-sys

# Docker 操作
docker ps
docker logs fund-gateway
docker-compose restart fund-sys

6.2 端口清单

服务 本地开发端口 Docker端口 说明
fund-admin 3000 80 管理后台前端
fund-mobile 5174 81 移动端H5
Gateway 8000 8000 API网关
fund-sys 8100 8100 系统管理服务
fund-sys-vip001 - 8101 系统服务VIP实例
fund-cust 8200 8200 客户管理服务
fund-proj 8300 8300 项目管理服务
fund-req 8400 8400 需求工单服务
fund-exp 8500 8500 支出管理服务
fund-receipt 8600 8600 收款管理服务
fund-report 8700 8700 报表服务
fund-file 8800 8800 文件服务
MySQL 3306 3306 数据库
Redis 6379 6379 缓存
Nacos API 8848 8848 服务注册
Nacos 控制台 8048 - 配置中心
Prometheus 9090 9090 监控
Grafana 3001 3000 可视化

6.3 环境变量配置

项目使用 .env 文件管理环境变量:

# ============================================
# 资金服务平台环境配置
# ============================================

# MySQL 配置
MYSQL_HOST=localhost
MYSQL_PORT=3306
MYSQL_USERNAME=root
MYSQL_PASSWORD=zjf@123456
MYSQL_AUTH_PLUGIN=caching_sha2_password

# Redis 配置
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=zjf@123456

# Nacos 配置
NACOS_HOST=localhost
NACOS_PORT=8848
NACOS_USERNAME=nacos
NACOS_PASSWORD=nacos
NACOS_CONSOLE_PORT=8048

# Grafana 配置
GRAFANA_PASSWORD=admin123

6.4 访问地址汇总

服务 本地开发 Docker部署
管理后台 http://localhost:3000 http://localhost:80
移动端H5 http://localhost:5174 http://localhost:81
API网关 http://localhost:8000 http://localhost:8000
Nacos控制台 http://localhost:8048/nacos http://localhost:8848/nacos
Prometheus http://localhost:9090 http://localhost:9090
Grafana http://localhost:3001 http://localhost:3000

6.5 默认账号

系统 用户名 密码
Nacos nacos nacos
Grafana admin admin123
管理后台 admin 123456

文档结束