# 性能优化 **本文引用的文件** - [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、错误率、资源占用;对比:优化前后、不同参数组合。