# 性能优化
**本文引用的文件**
- [application.yml](file://nflg-wms-admin/src/main/resources/application.yml)
- [application-dev.yml](file://nflg-wms-admin/src/main/resources/application-dev.yml)
- [application-prod.yml](file://nflg-wms-admin/src/main/resources/application-prod.yml)
- [MysqlDataSourceConfig.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java)
- [SAPConfig.java](file://nflg-wms-admin/src/main/java/com/nflg/wms/admin/config/SAPConfig.java)
- [RedisConfig.java](file://nflg-wms-starter/src/main/java/com/nflg/wms/starter/config/RedisConfig.java)
- [BeanUtil.java](file://nflg-wms-common/src/main/java/com/nflg/wms/common/util/BeanUtil.java)
- [UserUtil.java](file://nflg-wms-common/src/main/java/com/nflg/wms/common/util/UserUtil.java)
- [SAPException.java](file://nflg-wms-common/src/main/java/com/nflg/wms/common/exception/SAPException.java)
- [NflgException.java](file://nflg-wms-common/src/main/java/com/nflg/wms/common/exception/NflgException.java)
- [PowerJobWorkerConfiguration.java](file://nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/config/PowerJobWorkerConfiguration.java)
- [InventoryCheckTaskProcessor.java](file://nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/processor/InventoryCheckTaskProcessor.java)
- [SAPConfig.java (srm-receive)](file://nflg-wms-srm-receive/src/main/java/com/nflg/wms/srm/receive/config/SAPConfig.java)
- [SAPConfig.java (scheduled)](file://nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/config/SAPConfig.java)
- [application-sit.yml (srm-receive)](file://nflg-wms-srm-receive/src/main/resources/application-sit.yml)
- [application-dev.yml (srm-receive)](file://nflg-wms-srm-receive/src/main/resources/application-dev.yml)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南面向NFLG WMS系统管理员与开发人员,聚焦于系统性能优化,覆盖数据库查询优化、缓存策略优化、网络延迟优化、并发处理优化、SAP系统集成优化、性能监控与指标分析、内存与GC优化、性能测试与基准测试方法,以及运维最佳实践与注意事项。文档基于仓库中实际配置与实现进行分析,并提供可操作的优化建议。
## 项目结构
WMS采用多模块分层架构:网关、鉴权、管理端、仓储作业、SRM收货、定时调度、通用工具与基础设施等模块协同工作。管理端与仓储模块通过MyBatis-Plus访问MySQL;通用模块提供DTO、常量、工具类与异常定义;定时任务模块使用PowerJob;SAP集成通过JCo连接池配置;Redis用于缓存与分布式能力。
```mermaid
graph TB
subgraph "应用层"
ADMIN["管理端(nflg-wms-admin)"]
SHIPMENT["发货(nflg-wms-shipment)"]
SRM["SRM收货(nflg-wms-srm-receive)"]
AUTH["鉴权(nflg-wms-auth)"]
GATEWAY["网关(nflg-wms-gateway)"]
end
subgraph "业务与支撑"
REPO["仓储(nflg-wms-repository)"]
COMMON["通用(nflg-wms-common)"]
STARTER["启动器(nflg-wms-starter)"]
SCHEDULED["定时(nflg-wms-scheduled)"]
end
DB["MySQL"]
REDIS["Redis"]
SAP["SAP系统"]
ADMIN --> REPO
SHIPMENT --> REPO
SRM --> REPO
ADMIN --> STARTER
SHIPMENT --> STARTER
SRM --> STARTER
ADMIN --> AUTH
GATEWAY --> ADMIN
GATEWAY --> SHIPMENT
GATEWAY --> SRM
GATEWAY --> AUTH
REPO --> DB
STARTER --> REDIS
ADMIN --> SAP
SRM --> SAP
SCHEDULED --> SAP
```
图示来源
- [application.yml:1-48](file://nflg-wms-admin/src/main/resources/application.yml#L1-L48)
- [MysqlDataSourceConfig.java:30-47](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java#L30-L47)
- [RedisConfig.java:14-29](file://nflg-wms-starter/src/main/java/com/nflg/wms/starter/config/RedisConfig.java#L14-L29)
- [SAPConfig.java:24-51](file://nflg-wms-admin/src/main/java/com/nflg/wms/admin/config/SAPConfig.java#L24-L51)
章节来源
- [application.yml:1-48](file://nflg-wms-admin/src/main/resources/application.yml#L1-L48)
## 核心组件
- 数据库连接与ORM
- MyBatis-Plus配置启用驼峰映射、空值Setter、UTC时间类型处理器与分页插件。
- HikariCP连接池在各环境配置了最大池大小、最小空闲、空闲超时、最大生命周期与泄漏检测阈值。
- 缓存
- RedisTemplate统一配置键值序列化策略,支持Object与String模板。
- SAP集成
- JCo目的地注册与连接池参数设置,包含峰值限制与池容量校验。
- 并发与调度
- PowerJob Worker配置,支持任务执行与存储策略选择。
- 工具与异常
- BeanUtil提供对象与JSON互转;UserUtil封装登录用户信息;NflgException与SAPException统一异常模型。
章节来源
- [MysqlDataSourceConfig.java:30-47](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java#L30-L47)
- [application-dev.yml:25-34](file://nflg-wms-admin/src/main/resources/application-dev.yml#L25-L34)
- [application-sit.yml (srm-receive):11-20](file://nflg-wms-srm-receive/src/main/resources/application-sit.yml#L11-L20)
- [application-dev.yml (srm-receive):11-20](file://nflg-wms-srm-receive/src/main/resources/application-dev.yml#L11-L20)
- [RedisConfig.java:14-29](file://nflg-wms-starter/src/main/java/com/nflg/wms/starter/config/RedisConfig.java#L14-L29)
- [SAPConfig.java:67-96](file://nflg-wms-admin/src/main/java/com/nflg/wms/admin/config/SAPConfig.java#L67-L96)
- [PowerJobWorkerConfiguration.java:22-33](file://nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/config/PowerJobWorkerConfiguration.java#L22-L33)
- [BeanUtil.java:17-27](file://nflg-wms-common/src/main/java/com/nflg/wms/common/util/BeanUtil.java#L17-L27)
- [UserUtil.java:11-33](file://nflg-wms-common/src/main/java/com/nflg/wms/common/util/UserUtil.java#L11-L33)
- [NflgException.java:12-16](file://nflg-wms-common/src/main/java/com/nflg/wms/common/exception/NflgException.java#L12-L16)
- [SAPException.java:12-16](file://nflg-wms-common/src/main/java/com/nflg/wms/common/exception/SAPException.java#L12-L16)
## 架构总览
下图展示WMS与外部系统的交互路径,重点标注数据库、缓存与SAP的关键链路,便于定位性能瓶颈。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant Gateway as "网关"
participant Admin as "管理端"
participant Repo as "仓储(MyBatis-Plus)"
participant DB as "MySQL"
participant Redis as "Redis"
participant SAP as "SAP系统"
Client->>Gateway : 请求
Gateway->>Admin : 转发
Admin->>Repo : 查询/更新
Repo->>DB : SQL执行
DB-->>Repo : 结果集
Admin->>Redis : 读取/写入缓存
Redis-->>Admin : 缓存命中/未命中
Admin->>SAP : RFC调用/JCo
SAP-->>Admin : 返回数据
Admin-->>Gateway : 响应
Gateway-->>Client : 响应
```
图示来源
- [application.yml:1-48](file://nflg-wms-admin/src/main/resources/application.yml#L1-L48)
- [MysqlDataSourceConfig.java:30-47](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java#L30-L47)
- [RedisConfig.java:14-29](file://nflg-wms-starter/src/main/java/com/nflg/wms/starter/config/RedisConfig.java#L14-L29)
- [SAPConfig.java:93-101](file://nflg-wms-admin/src/main/java/com/nflg/wms/admin/config/SAPConfig.java#L93-L101)
## 详细组件分析
### 数据库查询优化
- ORM与SQL优化
- 启用驼峰命名映射与空值Setter,减少字段映射差异导致的隐式开销。
- 使用分页插件与乐观锁拦截器,避免全表扫描与并发写冲突。
- 连接池配置
- 最大池大小、最小空闲、空闲超时、最大生命周期与泄漏检测阈值需结合业务QPS与事务时长调优。
- 开发/测试/生产环境分别配置不同池参数,避免资源争用与连接泄漏。
- 索引与查询
- 建议对高频过滤字段、关联字段与排序字段建立复合索引;定期分析慢查询日志与执行计划,剔除无效索引。
- 避免SELECT *,仅取必要列;对大结果集分页或流式读取。
```mermaid
flowchart TD
Start(["开始"]) --> CheckPool["检查连接池配置
最大池/空闲/超时/生命周期"]
CheckPool --> TunePool{"是否满足QPS与RT?"}
TunePool -- 否 --> Adjust["调整池参数/增加实例/拆分库表"]
TunePool -- 是 --> EnablePlugins["启用分页/乐观锁插件"]
EnablePlugins --> Analyze["分析慢查询与执行计划"]
Analyze --> IndexOps["创建/优化索引/删除无效索引"]
IndexOps --> End(["结束"])
```
图示来源
- [MysqlDataSourceConfig.java:30-47](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java#L30-L47)
- [application-dev.yml:25-34](file://nflg-wms-admin/src/main/resources/application-dev.yml#L25-L34)
- [application-sit.yml (srm-receive):11-20](file://nflg-wms-srm-receive/src/main/resources/application-sit.yml#L11-L20)
- [application-dev.yml (srm-receive):11-20](file://nflg-wms-srm-receive/src/main/resources/application-dev.yml#L11-L20)
章节来源
- [MysqlDataSourceConfig.java:30-47](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java#L30-L47)
- [application-dev.yml:25-34](file://nflg-wms-admin/src/main/resources/application-dev.yml#L25-L34)
- [application-sit.yml (srm-receive):11-20](file://nflg-wms-srm-receive/src/main/resources/application-sit.yml#L11-L20)
- [application-dev.yml (srm-receive):11-20](file://nflg-wms-srm-receive/src/main/resources/application-dev.yml#L11-L20)
### 缓存策略优化
- Redis配置
- 统一Key/Value序列化策略,降低序列化成本与跨语言兼容性问题。
- 提供Object与String模板,按场景选择合适模板以减少装箱与转换。
- 失效策略
- 对热点数据设置合理TTL;对缓存穿透使用布隆过滤器或短命Key+后加载策略。
- 对缓存击穿采用互斥锁或逻辑过期;对缓存雪崩采用随机TTL与分级缓存。
- 命中率与内存
- 监控key分布与内存占用,避免大Key与热点Key集中;定期清理过期Key。
```mermaid
flowchart TD
Req(["请求"]) --> GetKey["构造缓存Key"]
GetKey --> GetCache["从Redis读取"]
GetCache --> Hit{"命中?"}
Hit -- 是 --> Return["返回缓存"]
Hit -- 否 --> LoadDB["加载DB/下游接口"]
LoadDB --> SetCache["写入缓存(TTL/互斥)"]
SetCache --> Return
```
图示来源
- [RedisConfig.java:14-29](file://nflg-wms-starter/src/main/java/com/nflg/wms/starter/config/RedisConfig.java#L14-L29)
章节来源
- [RedisConfig.java:14-29](file://nflg-wms-starter/src/main/java/com/nflg/wms/starter/config/RedisConfig.java#L14-L29)
### 并发处理优化
- 线程池与异步
- 对高延迟外部调用(如SAP)使用独立线程池隔离;对CPU密集型任务与IO密集型任务分离。
- 异步回调与事件驱动减少阻塞等待;对批量任务采用分片与限速。
- 锁优化
- 减少锁粒度与持有时间;优先使用无锁容器与原子变量;避免死锁与超时重试。
- 定时任务
- PowerJob Worker存储策略按任务规模选择内存或磁盘;端口随机化避免冲突;协议HTTP稳定可靠。
```mermaid
sequenceDiagram
participant Task as "任务"
participant Pool as "线程池"
participant SAP as "SAP"
Task->>Pool : 提交异步任务
Pool->>SAP : 发起RFC调用
SAP-->>Pool : 返回结果
Pool-->>Task : 回调通知
```
图示来源
- [PowerJobWorkerConfiguration.java:22-33](file://nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/config/PowerJobWorkerConfiguration.java#L22-L33)
- [InventoryCheckTaskProcessor.java:22-31](file://nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/processor/InventoryCheckTaskProcessor.java#L22-L31)
章节来源
- [PowerJobWorkerConfiguration.java:22-33](file://nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/config/PowerJobWorkerConfiguration.java#L22-L33)
- [InventoryCheckTaskProcessor.java:22-31](file://nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/processor/InventoryCheckTaskProcessor.java#L22-L31)
### SAP系统集成性能优化
- 连接复用与池化
- 使用JCo目的地与池化连接,设置峰值限制与池容量,确保峰值不小于池容量。
- 配置连接超时、语言与系统参数,避免频繁重建连接。
- 批量处理
- 将多次RFC调用合并为批量调用,减少网络往返;对大批量数据分批处理并设置批次上限。
- 超时与重试
- 明确RFC调用超时与重试策略,避免长时间阻塞;对SAP异常进行分类与熔断保护。
```mermaid
sequenceDiagram
participant Admin as "管理端"
participant Dest as "JCo目的地"
participant Repo as "JCo仓库"
participant SAP as "SAP系统"
Admin->>Dest : 获取JCoDestination
Dest-->>Admin : 返回Destination
Admin->>Repo : 获取JCoRepository
Repo-->>Admin : 返回Repository
Admin->>SAP : RFC调用(批量/限流)
SAP-->>Admin : 返回结果
```
图示来源
- [SAPConfig.java:93-101](file://nflg-wms-admin/src/main/java/com/nflg/wms/admin/config/SAPConfig.java#L93-L101)
- [SAPConfig.java (srm-receive):68-98](file://nflg-wms-srm-receive/src/main/java/com/nflg/wms/srm/receive/config/SAPConfig.java#L68-L98)
- [SAPConfig.java (scheduled):68-98](file://nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/config/SAPConfig.java#L68-L98)
章节来源
- [SAPConfig.java:67-96](file://nflg-wms-admin/src/main/java/com/nflg/wms/admin/config/SAPConfig.java#L67-L96)
- [SAPConfig.java (srm-receive):68-98](file://nflg-wms-srm-receive/src/main/java/com/nflg/wms/srm/receive/config/SAPConfig.java#L68-L98)
- [SAPConfig.java (scheduled):68-98](file://nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/config/SAPConfig.java#L68-L98)
### 网络延迟优化
- 本地化与就近部署
- 将应用部署在数据库与SAP同地域,减少跨域网络时延。
- 连接与协议
- TCP参数优化、Keep-Alive配置;HTTP/2或更高效协议;压缩传输体。
- DNS与负载均衡
- 预热DNS、缩短解析时间;LB健康检查与快速摘除。
[本节为通用指导,无需引用具体文件]
### 内存管理与垃圾回收优化
- JVM参数
- 合理设置堆大小、新生代比例与元空间;开启逃逸分析与标量替换。
- GC策略
- 选择低停顿GC(如G1/工蜂),避免Full GC;控制晋升年龄与大对象直通老年代。
- 对象与序列化
- 使用对象池与轻量序列化;避免大对象频繁分配;及时释放大集合引用。
- 监控
- 观察GC频率与停顿、堆外内存、DirectBuffer;结合APM与GC日志定位问题。
[本节为通用指导,无需引用具体文件]
## 依赖分析
- 模块耦合
- 管理端、发货、SRM收货均依赖仓储模块与通用模块;定时模块依赖SAP配置与通用异常。
- 外部依赖
- MySQL、Redis、SAP;通过连接池与序列化配置降低外部依赖的性能损耗。
- 循环依赖
- 当前结构未见循环依赖迹象;若新增模块需避免双向依赖。
```mermaid
graph LR
ADMIN["管理端"] --> REPO["仓储"]
SHIPMENT["发货"] --> REPO
SRM["SRM收货"] --> REPO
ADMIN --> COMMON["通用"]
SHIPMENT --> COMMON
SRM --> COMMON
SCHEDULED["定时"] --> COMMON
SCHEDULED --> SAPCFG["SAP配置"]
ADMIN --> SAPCFG
SRM --> SAPCFG
STARTER["启动器"] --> REDIS["Redis"]
REPO --> MYSQL["MySQL"]
```
图示来源
- [MysqlDataSourceConfig.java:30-47](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java#L30-L47)
- [RedisConfig.java:14-29](file://nflg-wms-starter/src/main/java/com/nflg/wms/starter/config/RedisConfig.java#L14-L29)
- [SAPConfig.java:24-51](file://nflg-wms-admin/src/main/java/com/nflg/wms/admin/config/SAPConfig.java#L24-L51)
章节来源
- [MysqlDataSourceConfig.java:30-47](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java#L30-L47)
- [RedisConfig.java:14-29](file://nflg-wms-starter/src/main/java/com/nflg/wms/starter/config/RedisConfig.java#L14-L29)
- [SAPConfig.java:24-51](file://nflg-wms-admin/src/main/java/com/nflg/wms/admin/config/SAPConfig.java#L24-L51)
## 性能考虑
- 数据库
- 分库分表与读写分离;热点表分区;归档历史数据;批量写入与幂等设计。
- 缓存
- 多级缓存(本地缓存+Redis);预热与冷热分离;淘汰策略与TTL动态调整。
- 并发
- 限流与熔断;排队与背压;异步化与事件驱动。
- SAP
- 批量RFC、参数化查询、连接池峰值校验;异常降级与重试退避。
- 监控
- 指标:QPS、RT、错误率、连接池利用率、GC、Redis命中率;告警阈值分级。
- 测试
- 压测工具与脚本;基线RT与P99;回归对比;容量规划。
[本节为通用指导,无需引用具体文件]
## 故障排查指南
- 异常模型
- NflgException与SAPException统一状态码与消息,便于前端与监控识别。
- 日志与追踪
- 开启OTLP链路追踪与日志推送;结合TraceId定位端到端耗时。
- 连接池问题
- 连接泄漏:检查泄漏检测阈值与连接关闭;连接超时:增大超时或扩容池。
- 缓存问题
- 缓存穿透:布隆过滤器/短命Key+后加载;缓存击穿:互斥锁/逻辑过期;缓存雪崩:随机TTL。
- SAP问题
- RFC超时/报错:检查池容量与峰值、网络连通性、SAP端队列;批量失败:分片重试。
章节来源
- [NflgException.java:12-16](file://nflg-wms-common/src/main/java/com/nflg/wms/common/exception/NflgException.java#L12-L16)
- [SAPException.java:12-16](file://nflg-wms-common/src/main/java/com/nflg/wms/common/exception/SAPException.java#L12-L16)
- [application.yml:31-48](file://nflg-wms-admin/src/main/resources/application.yml#L31-L48)
- [application-dev.yml:13-14](file://nflg-wms-admin/src/main/resources/application-dev.yml#L13-L14)
## 结论
通过合理的数据库索引与查询优化、连接池参数调优、Redis多级缓存与失效策略、SAP连接池与批量处理、并发线程池与异步化、以及完善的监控与测试体系,WMS可在高并发与复杂业务场景下保持稳定与高性能。建议以模块为单位持续迭代优化,并结合生产数据进行容量与性能回归验证。
## 附录
- 关键配置要点
- 数据库:驼峰映射、空值Setter、分页与乐观锁插件;HikariCP池参数按环境区分。
- 缓存:统一序列化策略;对象/字符串模板按场景选择。
- SAP:目的地注册、池容量与峰值校验、RFC超时与重试。
- 监控:OTLP链路追踪、健康检查、Redis/DB健康探测。
- 推荐工具
- 数据库:Explain/慢查询分析;Redis:INFO/内存分析;SAP:ST05/交易记录分析;JVM:GC日志与APM。
- 基准测试建议
- 场景:并发读写、批量导入导出、SAP同步、缓存命中率;指标:QPS、RT、错误率、资源占用;对比:优化前后、不同参数组合。