微服务部署指南
本文档适用于微服务(Cloud)模式部署。假设 MySQL、Redis、Nacos 等中间件已就绪。
微服务模式下,各业务模块独立打包为 JAR,通过 Nacos 注册发现,由 API Gateway 统一对外暴露接口。
一、架构总览
┌─────────────────────────────┐
│ Nacos 注册中心 │
│ 服务注册 / 配置管理 │
└──────────┬──────────────────┘
│ 注册 & 发现
┌───────────────────┼───────────────────┐
│ │ │
┌────────▼───────┐ ┌────────▼───────┐ ┌───────▼────────┐
浏览器 ──────►│ Nginx (:80) │ │ │ │ │
│ /web → 前端 │ │ │ │ │
│ /admin-api → │ │ │ │ │
│ Gateway │ │ │ │ │
└───────┬────────┘ │ │ │ │
│ │ │ │ │
┌───────▼────────┐ │ │ │ │
│ Gateway │ │ system-server │ │ infra-server │
│ (:48080) │──│ (:48081) │ │ (:48082) │
│ 路由 & 鉴权 │ │ │ │ │
└───────┬────────┘ └────────────────┘ └────────────────┘
│
┌───────┬───────┼───────┬───────┬───────┬───────┐
│ │ │ │ │ │ │
bpm-server │ report-server │ pay-server │ ...更多服务
(:48083) │ (:48084) │ (:48085) │
│ │ │
oa-server crm-server erp-server
(:48101) (:48089) (:48088)二、服务清单与端口
| 服务名称 | 服务标识 | 默认端口 | 说明 |
|---|---|---|---|
| API 网关 | gateway-server | 48080 | Spring Cloud Gateway,统一入口 |
| 系统服务 | system-server | 48081 | 用户、角色、菜单、权限、租户 |
| 基础设施服务 | infra-server | 48082 | 文件、代码生成、配置、日志、WebSocket |
| 工作流服务 | bpm-server | 48083 | Flowable 工作流引擎 |
| 报表服务 | report-server | 48084 | 积木报表 |
| 支付服务 | pay-server | 48085 | 支付渠道、退款 |
| 公众号服务 | mp-server | 48086 | 微信公众号管理 |
| 会员服务 | member-server | 48087 | C 端会员体系 |
| ERP 服务 | erp-server | 48088 | 采购、销售、库存、财务 |
| CRM 服务 | crm-server | 48089 | 线索、客户、商机、合同 |
| AI 服务 | ai-server | 48090 | 大模型对话、知识库 |
| IoT 服务 | iot-server | 48091 | 物联网设备管理 |
| 商城-商品 | product-server | 48100 | 商品 SPU/SKU |
| OA 服务 | oa-server | 48101 | 协同办公 |
| 商城-交易 | trade-server | 48102 | 订单、售后 |
| 商城-统计 | statistics-server | 48103 | 数据统计 |
| HRM 服务 | hrm-server | 48102 | 人力资源管理 |
| 资产服务 | asset-server | 48101 | 资产管理 |
| 仓储服务 | wms-server | 48101 | 仓储管理 |
| 合同服务 | contract-server | 48110 | 合同管理 |
| 项目服务 | project-server | 48110 | 项目管理 |
| 财务服务 | finance-server | 48108 | 财务管理 |
| MES 服务 | mes-server | 48091 | 生产制造 |
⚠️ 部分服务默认端口存在复用:例如
oa-server、asset-server、wms-server、promotion-server默认都可能是48101,hrm-server与trade-server默认可能同为48102,iot-server与mes-server默认可能同为48091,contract-server与project-server默认可能同为48110。如果部署在同一台服务器,必须通过服务配置或启动参数调整端口,例如--server.port=48111;如果部署在不同服务器,可以保留默认端口。
三、构建
3.1 微服务模式构建(全量)
# 在后端项目根目录 ruoyi-office/ 执行,构建所有模块
mvn clean package -Pcloud -Dmaven.test.skip=true根 pom.xml 默认激活 cloud profile,但生产构建建议显式增加 -Pcloud,避免本地环境曾切换过 profile 导致误打包。微服务模式下 skip.repackage=false,每个 -server 子模块都会打出可执行的 Fat JAR。
3.2 构建指定模块
# 只构建网关 + 系统服务 + 基础设施服务(最小可用集)
mvn clean package -Pcloud -Dmaven.test.skip=true \
-pl yudao-gateway,yudao-module-system/yudao-module-system-server,yudao-module-infra/yudao-module-infra-server \
-am3.3 构建产物位置
yudao-gateway/target/yudao-gateway.jar
yudao-module-system/yudao-module-system-server/target/yudao-module-system-server.jar
yudao-module-infra/yudao-module-infra-server/target/yudao-module-infra-server.jar
yudao-module-bpm/yudao-module-bpm-server/target/yudao-module-bpm-server.jar
yudao-module-oa/yudao-module-oa-server/target/yudao-module-oa-server.jar
...(其他模块同理)3.4 前端构建
cd ruoyi-office-vben
pnpm install
# 或使用 pnpm i,确保本地 Node / pnpm 版本与项目要求一致
pnpm -r --filter "./packages/**" --filter "./internal/**" build
# 推荐直接使用项目脚本构建 web-antd
pnpm build:antd
# 产物:apps/web-antd/dist/四、Nacos 配置
微服务模式依赖 Nacos 作为注册中心和配置中心。
4.1 各服务连接 Nacos
每个 -server 模块的 application-prod.yaml、Nacos 配置,或启动参数(推荐)需配置:
spring:
cloud:
nacos:
server-addr: 你的Nacos地址:8848
username: nacos
password: nacos密码
discovery:
namespace: prod # 生产命名空间
group: DEFAULT_GROUP
config:
namespace: prod
group: DEFAULT_GROUP如果 discovery/config 使用不同地址,也可分别配置:
spring:
cloud:
nacos:
discovery:
server-addr: 你的Nacos地址:8848
config:
server-addr: 你的Nacos地址:88484.2 环境变量覆盖(推荐)
启动时通过环境变量传入,无需修改配置文件:
java -jar xxx-server.jar \
--spring.profiles.active=prod \
--spring.cloud.nacos.server-addr=192.168.30.100:8848 \
--spring.cloud.nacos.discovery.namespace=prod \
--spring.cloud.nacos.config.namespace=prod4.3 Nacos 中的配置文件
在 Nacos 控制台 → 配置管理中,为各服务创建对应的配置文件:
| Data ID | Group | 说明 |
|---|---|---|
gateway-server-prod.yaml | DEFAULT_GROUP | 网关配置 |
system-server-prod.yaml | DEFAULT_GROUP | 系统服务配置(数据库、Redis 等) |
infra-server-prod.yaml | DEFAULT_GROUP | 基础设施服务配置 |
bpm-server-prod.yaml | DEFAULT_GROUP | 工作流服务配置 |
oa-server-prod.yaml | DEFAULT_GROUP | OA 服务配置 |
hrm-server-prod.yaml | DEFAULT_GROUP | HRM 服务配置 |
| ...其他服务同理 |
配置示例(system-server-prod.yaml,其他业务服务也要配置同一套 MySQL、Redis、租户、日志、MQ 等公共配置):
spring:
datasource:
dynamic:
primary: master
datasource:
master:
url: jdbc:mysql://数据库IP:3306/ruoyi-office?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username: root
password: 数据库密码
data:
redis:
host: Redis地址
port: 6379
database: 0
password: Redis密码 # 无密码可删除当前工程主要使用
spring.data.redis。如果你的运行版本仍使用旧配置键,请按实际代码版本改为spring.redis,不要两套配置混用导致连接到不同 Redis。
4.4 公共配置一致性检查
微服务最常见的阻断问题不是单个服务无法启动,而是公共配置不一致。上线前请确认:
- 所有服务连接同一个业务数据库,或连接同一套分库规则。
- 所有服务连接同一个 Redis;如果 BPM 使用 Redis Stream 通知,
bpm-server和业务服务必须连接同一个 Redis database。 - 所有服务使用同一个 Nacos namespace 和 group。
- 所有服务的租户、多数据源、加密密钥、日志级别、RPC 超时配置一致。
- 如果启用文件上传、报表、WebSocket、消息队列等能力,相关服务配置不能只写在
system-server,需要写到实际使用该能力的服务。
五、部署后端服务
5.1 上传 JAR 到服务器
# 上传到统一目录
scp yudao-gateway/target/yudao-gateway.jar root@服务器IP:/data/app/gateway/
scp yudao-module-system/yudao-module-system-server/target/yudao-module-system-server.jar root@服务器IP:/data/app/system/
scp yudao-module-infra/yudao-module-infra-server/target/yudao-module-infra-server.jar root@服务器IP:/data/app/infra/
scp yudao-module-bpm/yudao-module-bpm-server/target/yudao-module-bpm-server.jar root@服务器IP:/data/app/bpm/
scp yudao-module-oa/yudao-module-oa-server/target/yudao-module-oa-server.jar root@服务器IP:/data/app/oa/
scp yudao-module-hrm/yudao-module-hrm-server/target/yudao-module-hrm-server.jar root@服务器IP:/data/app/hrm/
# ...其他模块同理5.2 启动顺序
微服务间有依赖关系,建议按以下顺序启动。Gateway 可先启动,但在 system/infra 未注册前请求会 503,因此生产脚本建议先启动基础服务,再开放网关流量:
1. system-server (系统服务,核心基础)
2. infra-server (基础设施,依赖 system)
3. bpm-server (工作流,业务流程依赖)
4. 业务服务 (oa / hrm / asset / contract / crm / erp / pay / ...)
5. gateway-server (网关,依赖 Nacos;也可提前启动,但需等待目标服务注册)5.3 启动命令
通用启动模板:
nohup java -Xms512m -Xmx1024m \
-jar /data/app/服务目录/xxx-server.jar \
--spring.profiles.active=prod \
--spring.cloud.nacos.server-addr=Nacos地址:8848 \
--spring.cloud.nacos.discovery.namespace=prod \
--spring.cloud.nacos.config.namespace=prod \
> /data/app/服务目录/nohup.out 2>&1 &如多个服务部署在同一台服务器且默认端口冲突,请额外增加:
--server.port=实际端口完整启动示例
# ① 系统服务
nohup java -Xms512m -Xmx1024m \
-jar /data/app/system/yudao-module-system-server.jar \
--spring.profiles.active=prod \
--spring.cloud.nacos.server-addr=192.168.30.100:8848 \
--spring.cloud.nacos.discovery.namespace=prod \
--spring.cloud.nacos.config.namespace=prod \
> /data/app/system/nohup.out 2>&1 &
sleep 30
# ② 基础设施服务
nohup java -Xms512m -Xmx1024m \
-jar /data/app/infra/yudao-module-infra-server.jar \
--spring.profiles.active=prod \
--spring.cloud.nacos.server-addr=192.168.30.100:8848 \
--spring.cloud.nacos.discovery.namespace=prod \
--spring.cloud.nacos.config.namespace=prod \
> /data/app/infra/nohup.out 2>&1 &
sleep 30
# ③ 工作流服务
nohup java -Xms512m -Xmx1024m \
-jar /data/app/bpm/yudao-module-bpm-server.jar \
--spring.profiles.active=prod \
--spring.cloud.nacos.server-addr=192.168.30.100:8848 \
--spring.cloud.nacos.discovery.namespace=prod \
--spring.cloud.nacos.config.namespace=prod \
> /data/app/bpm/nohup.out 2>&1 &
# ④ OA 服务
nohup java -Xms512m -Xmx1024m \
-jar /data/app/oa/yudao-module-oa-server.jar \
--spring.profiles.active=prod \
--spring.cloud.nacos.server-addr=192.168.30.100:8848 \
--spring.cloud.nacos.discovery.namespace=prod \
--spring.cloud.nacos.config.namespace=prod \
--server.port=48101 \
> /data/app/oa/nohup.out 2>&1 &
# ⑤ HRM 服务;如果与 trade-server 同机,需调整其中一个端口
nohup java -Xms512m -Xmx1024m \
-jar /data/app/hrm/yudao-module-hrm-server.jar \
--spring.profiles.active=prod \
--spring.cloud.nacos.server-addr=192.168.30.100:8848 \
--spring.cloud.nacos.discovery.namespace=prod \
--spring.cloud.nacos.config.namespace=prod \
--server.port=48104 \
> /data/app/hrm/nohup.out 2>&1 &
# ⑥ 网关服务
nohup java -Xms256m -Xmx512m \
-jar /data/app/gateway/yudao-gateway.jar \
--spring.profiles.active=prod \
--spring.cloud.nacos.server-addr=192.168.30.100:8848 \
--spring.cloud.nacos.discovery.namespace=prod \
--spring.cloud.nacos.config.namespace=prod \
> /data/app/gateway/nohup.out 2>&1 &5.4 验证服务注册
启动完成后,访问 Nacos 控制台 → 服务管理 → 服务列表,确认各服务已注册:
http://Nacos地址:8848/nacos应该能看到 gateway-server、system-server、infra-server、bpm-server、oa-server、hrm-server 等服务实例。
六、部署前端
6.1 确认前端环境变量
apps/web-antd/.env.production:
VITE_BASE_URL=
VITE_GLOB_API_URL=/admin-api前端通过 Nginx 代理
/admin-api→ Gateway(:48080),Gateway 再根据路由规则转发到各微服务。
6.2 上传到服务器
ssh root@服务器IP "rm -rf /data/nginx/html/web/*"
scp -r apps/web-antd/dist/* root@服务器IP:/data/nginx/html/web/七、Nginx 配置
微服务模式下 Nginx 只需反代到 Gateway(而非各个微服务),由 Gateway 负责路由分发。
server {
listen 80;
server_name _;
# 1. 前端静态文件
location /web {
alias /data/nginx/html/web;
index index.html;
try_files $uri $uri/ /web/index.html;
}
# 2. 后端 API → 全部转发到 Gateway
location /admin-api {
proxy_pass http://127.0.0.1:48080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# 3. WebSocket 连接
location /infra/ws {
proxy_pass http://127.0.0.1:48080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 4. 接口文档(Knife4j 聚合)
location /doc.html {
proxy_pass http://127.0.0.1:48080;
proxy_set_header Host $host;
}
# 5. 根路径跳转
location = / {
return 302 /web;
}
}修改后重新加载:
nginx -t && nginx -s reload八、Gateway 路由规则
Gateway 根据 URL 前缀将请求转发到对应微服务(已内置,通常无需修改):
| URL 前缀 | 转发目标服务 | 示例 |
|---|---|---|
/admin-api/system/** | system-server | 登录、用户、角色 |
/admin-api/infra/** | infra-server | 文件上传、配置 |
/admin-api/bpm/** | bpm-server | 流程定义、审批 |
/admin-api/oa/** | oa-server | OA 协同办公 |
/admin-api/crm/** | crm-server | 客户管理 |
/admin-api/erp/** | erp-server | 进销存 |
/admin-api/pay/** | pay-server | 支付 |
/admin-api/member/** | member-server | 会员 |
/admin-api/report/** | report-server | 报表 |
/admin-api/mp/** | mp-server | 公众号 |
/admin-api/ai/** | ai-server | AI 大模型 |
/admin-api/iot/** | iot-server | 物联网 |
/admin-api/hrm/** | hrm-server | 人力资源 |
/admin-api/asset/** | asset-server | 资产管理 |
/admin-api/product/** | product-server | 商品 |
/admin-api/trade/** | trade-server | 交易 |
/admin-api/promotion/** | promotion-server | 营销 |
/admin-api/statistics/** | statistics-server | 统计 |
Gateway 使用 grayLb:// 协议,支持基于 Nacos 的服务发现 + 负载均衡。
九、微服务下 BPM 流程通知配置(重要)
微服务部署时,BPM 引擎运行在 bpm-server,业务单据运行在 oa-server、hrm-server、asset-server 等服务。流程到达结束节点后,Flowable 会自动结束流程实例,但业务单据表里的 process_status 需要通过跨服务通知回写。
如果仍使用单体模式的本地事件通知,可能出现以下现象:
- 流程图已经到“结束”节点,但右上角业务状态仍显示“审批中”。
- 业务单据
process_status仍为1,没有更新为审批通过2。 - 补卡、销假、资产调拨、合同生效等
onProcessApproved后置逻辑没有执行。 - 审批记录表中没有结束节点,但流程图已结束。结束节点不是用户任务,不一定出现在审批记录表;真正要看业务状态是否回写。
9.1 推荐方案:Redis Stream MQ
当前工程已内置 Redis Stream 消息类和消费者:
- 发送方:
bpm-server中的BpmMqNotificationHandler - 消息 Stream Key:
bpm.workflow.instance.status.changed - 消费方:各业务服务的
*MqNotificationConsumer,例如 HRM 的HrmMqNotificationConsumer
bpm-server 配置
在 Nacos 的 bpm-server-prod.yaml 中增加:
yudao:
bpm:
notification:
# 微服务部署必须使用 mq 或 feign;不要使用 local
default-type: mq
# 建议先同步发送,排查稳定后可改为 true
async: false
mq:
enabled: true
feign:
enabled: false
# 可选:只指定部分流程走 MQ;如果 default-type 已是 mq,可不配
process-config:
hr_leave_cancel_bill: mq
hr_card_replacement_bill: mq
oa_leave: mq
oa_car_apply_bill: mq同时确认 bpm-server 连接到与业务服务相同的 Redis:
spring:
data:
redis:
host: Redis地址
port: 6379
database: 0
password: Redis密码业务服务配置
所有需要接收 BPM 审批结果的业务服务也必须连接同一个 Redis,例如 hrm-server-prod.yaml:
spring:
data:
redis:
host: Redis地址
port: 6379
database: 0
password: Redis密码并确认业务服务依赖中包含 MQ starter。HRM 服务当前已包含:
<dependency>
<groupId>cn.iocoder.cloud</groupId>
<artifactId>yudao-spring-boot-starter-mq</artifactId>
</dependency>9.2 Redis MQ 验证
启动后检查日志。
bpm-server 应出现:
注册通知处理器: 消息队列通知
[handleNotification][MQ通知] 发送流程状态变化消息
[handleNotification][MQ通知] 流程状态变化消息发送成功业务服务,例如 hrm-server,应出现:
[redisStreamMessageListenerContainer][完成注册 StreamKey(bpm.workflow.instance.status.changed) 对应的监听器(...HrmMqNotificationConsumer)]
[onMessage][MQ消费] 收到BPM事件消息
[invokeLifecycleHooks] 流程审批通过,触发 onProcessApproved也可在 Redis 中检查:
redis-cli XINFO STREAM bpm.workflow.instance.status.changed
redis-cli XINFO GROUPS bpm.workflow.instance.status.changed
redis-cli XPENDING bpm.workflow.instance.status.changed hrm-serverRedis Stream 消费组默认使用
spring.application.name,因此 HRM 的消费组通常是hrm-server,OA 的消费组通常是oa-server。
9.3 常见故障定位
| 现象 | 优先检查 |
|---|---|
| 流程图已结束,业务状态仍审批中 | bpm-server 是否配置 default-type: mq,业务服务是否消费到消息 |
| Redis Stream 有消息但业务服务没处理 | 业务服务是否连接同一 Redis、是否注册 *MqNotificationConsumer、消费组是否存在 |
| 消费日志有异常 | 检查业务单据是否存在、businessKey 是否正确、租户上下文是否正确 |
| 补卡审批通过但考勤记录未生成 | HRM 的 onProcessApproved 是否执行,hrm_punch_record 是否有对应日期记录 |
| Nacos 正常但接口 503 | Gateway 目标服务名和 Nacos 注册名是否一致,服务是否健康 |
9.4 关于 Feign 通知
当前工程也有 feign 通知方式,但现有 BpmFeignNotificationHandler 主要按 OA 流程做了示例分发。如果要用 Feign 覆盖 HRM、资产、合同等模块,需要扩展 BPM 侧分发逻辑和各模块的 Feign API。生产环境更推荐先使用 Redis Stream MQ,配置简单且适合多业务模块广播消费。
注意:如代码中异步开关读取的是
yudao.bmp.notification.async,而配置写的是yudao.bpm.notification.async,会导致async配置不生效。建议代码与配置统一为yudao.bpm.notification.async。
十、验证
10.1 检查各服务
# 检查 Gateway
curl http://127.0.0.1:48080/actuator/health
# 检查 system-server
curl http://127.0.0.1:48081/actuator/health
# 检查 infra-server
curl http://127.0.0.1:48082/actuator/health
# 通过 Gateway 访问系统接口
curl http://127.0.0.1:48080/admin-api/system/auth/get-permission-info10.2 检查前端
浏览器访问 http://服务器IP/web,正常显示登录页,输入账号密码能登录成功。
10.3 检查接口文档
访问 http://服务器IP:48080/doc.html,Gateway 会聚合所有微服务的 Swagger 文档。
十一、一键启停脚本
11.1 一键启动(start-all.sh)
#!/bin/bash
# start-all.sh - 按依赖顺序启动所有微服务
NACOS_ADDR="192.168.30.100:8848"
NAMESPACE="prod"
PROFILE="prod"
BASE_DIR="/data/app"
start_service() {
local name=$1
local jar=$2
local xms=${3:-512m}
local xmx=${4:-1024m}
local dir="$BASE_DIR/$name"
echo "🚀 启动 $name ..."
mkdir -p "$dir"
nohup java -Xms$xms -Xmx$xmx \
-jar "$dir/$jar" \
--spring.profiles.active=$PROFILE \
--spring.cloud.nacos.server-addr=$NACOS_ADDR \
--spring.cloud.nacos.discovery.namespace=$NAMESPACE \
--spring.cloud.nacos.config.namespace=$NAMESPACE \
> "$dir/nohup.out" 2>&1 &
echo " PID: $!"
}
# 按依赖顺序启动
start_service "system" "yudao-module-system-server.jar"
sleep 30
start_service "infra" "yudao-module-infra-server.jar"
sleep 20
start_service "bpm" "yudao-module-bpm-server.jar"
sleep 20
# 以下业务服务可并行启动;同机端口冲突时,请在 Nacos 或启动参数中改 server.port
start_service "oa" "yudao-module-oa-server.jar"
start_service "hrm" "yudao-module-hrm-server.jar"
# 按需添加更多服务...
# start_service "crm" "yudao-module-crm-server.jar"
# start_service "erp" "yudao-module-erp-server.jar"
# start_service "pay" "yudao-module-pay-server.jar"
# start_service "ai" "yudao-module-ai-server.jar" "512m" "2048m"
# 最后启动网关,或提前启动但等待目标服务注册后再开放流量
start_service "gateway" "yudao-gateway.jar" "256m" "512m"
echo ""
echo "✅ 所有服务启动命令已下发,请等待 1-2 分钟后检查 Nacos 服务列表"11.2 一键停止(stop-all.sh)
#!/bin/bash
# stop-all.sh - 停止所有微服务
SERVICES=(
"yudao-gateway"
"yudao-module-system-server"
"yudao-module-infra-server"
"yudao-module-bpm-server"
"yudao-module-oa-server"
"yudao-module-hrm-server"
# 按需添加...
)
for svc in "${SERVICES[@]}"; do
PID=$(ps -ef | grep "$svc" | grep -v grep | awk '{print $2}')
if [ -n "$PID" ]; then
echo "⏹️ 停止 $svc (PID: $PID)"
kill $PID
else
echo "⏭️ $svc 未运行"
fi
done
echo "✅ 停止命令已发送"11.3 查看运行状态(status.sh)
#!/bin/bash
# status.sh - 查看所有微服务状态
echo "========================================"
echo " 微服务运行状态"
echo "========================================"
SERVICES=(
"yudao-gateway:48080"
"yudao-module-system-server:48081"
"yudao-module-infra-server:48082"
"yudao-module-bpm-server:48083"
"yudao-module-oa-server:48101"
"yudao-module-hrm-server:48102"
)
for entry in "${SERVICES[@]}"; do
svc="${entry%%:*}"
port="${entry##*:}"
PID=$(ps -ef | grep "$svc" | grep -v grep | awk '{print $2}')
if [ -n "$PID" ]; then
echo "✅ $svc (PID: $PID, 端口: $port)"
else
echo "❌ $svc 未运行"
fi
done十二、单体模式 vs 微服务模式对比
| 对比项 | 单体模式 | 微服务模式 |
|---|---|---|
| 构建命令 | mvn package -pl yudao-server -am -Dskip.repackage=true | mvn package |
| Maven Profile | -Pboot(或 -Pprod -Dskip.repackage=true) | -Pcloud(默认) |
| 产出 | 1 个 JAR(yudao-server.jar) | N 个 JAR(每个模块一个) |
| 注册中心 | 不需要 | 需要 Nacos |
| API 入口 | 直接访问 :48080 | Gateway :48080 → 各服务 |
| Nginx 反代 | /admin-api → :48080 | /admin-api → Gateway :48080 |
| 服务器要求 | 4GB+ 内存 | 8GB+ 内存(推荐 16GB) |
| 适用场景 | 中小团队、快速上线 | 大团队、高并发、独立扩缩容 |
十三、常见问题
Q1: 服务启动后在 Nacos 看不到
# 检查 Nacos 连接
curl http://Nacos地址:8848/nacos/v1/ns/instance/list?serviceName=system-server
# 检查启动日志
tail -100 /data/app/system/nohup.out | grep -i nacos
# 常见原因:
# 1. Nacos 地址配错
# 2. namespace 不匹配
# 3. 网络不通(telnet Nacos地址 8848)Q2: Gateway 报 503 Service Unavailable
# 目标服务尚未启动或注册,等待 30s 重试
# 检查目标服务是否在 Nacos 注册
curl http://Nacos地址:8848/nacos/v1/ns/instance/list?serviceName=system-serverQ3: 服务间调用超时
# 检查调用链路,确认目标服务正常
curl http://127.0.0.1:目标端口/actuator/health
# 适当调大 Feign 超时
# 在 Nacos 配置中添加:
# spring.cloud.openfeign.client.config.default.connect-timeout=10000
# spring.cloud.openfeign.client.config.default.read-timeout=30000Q4: 内存不够,想只启动部分服务
最小可用集(管理后台基本功能):
gateway-server + system-server + infra-server加上 OA 和工作流:
gateway-server + system-server + infra-server + bpm-server + oa-server内存估算:每个服务约 512MB ~ 1GB,Gateway 约 256MB。
Q5: 流程已经到结束节点,但业务状态还是审批中
这是微服务部署最容易遗漏的配置。请按下面顺序排查:
# 1. 看 bpm-server 是否发送 MQ 通知
tail -100 /data/app/bpm/nohup.out | grep -E "MQ通知|sendNotification|流程状态变化"
# 2. 看业务服务是否注册 Redis Stream 监听器,例如 HRM
tail -100 /data/app/hrm/nohup.out | grep -E "HrmMqNotificationConsumer|bpm.workflow.instance.status.changed|MQ消费|onProcessApproved"
# 3. 查 Redis Stream
redis-cli XINFO STREAM bpm.workflow.instance.status.changed
redis-cli XINFO GROUPS bpm.workflow.instance.status.changed如果 bpm-server 使用的是 default-type: local,在微服务部署下业务服务收不到本地 Spring 事件,需要改为 微服务下 BPM 流程通知配置 中的 mq 配置。
Q6: 如何切换到单体模式
# 单体模式只需一个 JAR,无需 Nacos
mvn clean package -Pboot -Dmaven.test.skip=true -Dskip.repackage=true -pl yudao-server -am
java -jar yudao-server/target/yudao-server.jar --spring.profiles.active=prod详见 快速部署指南。
