跳到主要内容

性能问题优化

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖分析
  7. 性能考虑
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本指南聚焦 yudao-cloud 项目的性能问题识别与优化实践,覆盖 CPU 使用率高、内存占用大、磁盘 IO 频繁等瓶颈定位方法;缓存优化策略(Redis 缓存配置、缓存穿透防护、缓存一致性);线程池配置与任务调度优化(异步任务处理、线程池参数调优);数据库性能优化(查询优化、索引设计、连接池配置);以及性能监控指标与调优工具的使用方法。文档面向不同层次读者,既提供高层架构视角,也给出可落地的优化建议。

项目结构

yudao-cloud 采用微服务架构,以 Spring Cloud Gateway 为统一入口,后端服务按业务域拆分至多个模块(系统、基础设施、设备、运营、黑名单、任务、规则引擎等),并集成 Nacos、Redis、MySQL、TDengine、Kafka 等中间件。系统通过 Actuator/Micrometer 暴露指标,Prometheus 抓取,SkyWalking 进行链路追踪。

Mermaid Diagram Code:

graph TB
subgraph "客户端"
Web["Web/App"]
end
subgraph "网关层"
GW["yudao-gateway"]
end
subgraph "业务服务"
SYS["yudao-module-system"]
INFRA["yudao-module-infra"]
DEV["yudao-module-device"]
LCH["yudao-module-launcher"]
BLK["yudao-module-blacklist"]
TSK["yudao-module-task"]
RUL["yudao-module-rule"]
end
subgraph "中间件"
NACOS["Nacos"]
REDIS["Redis"]
MYSQL["MySQL"]
TD["TDengine"]
KAFKA["Kafka"]
SW["SkyWalking"]
end
Web --> GW
GW --> SYS
GW --> INFRA
GW --> DEV
GW --> LCH
GW --> BLK
GW --> TSK
GW --> RUL
SYS -.-> NACOS
DEV -.-> TD
TSK -.-> TD
BLK -.-> KAFKA
GW -.-> REDIS
SW -.-> SYS
SW -.-> DEV
SW -.-> TSK

图表来源

章节来源

核心组件

  • 网关与灰度发布:基于 Spring Cloud Gateway 的灰度负载均衡,支持按版本头分流。
  • 监控与可观测性:Micrometer + Actuator + Prometheus + SkyWalking。
  • 缓存:Redis + 自定义 TTL 管理,支持“缓存 + 分布式锁 + 数据库兜底”。
  • 线程池:模块内自定义线程池,异步任务接入 TransmittableThreadLocal。
  • 数据存储:MySQL + TDengine(时序/日志),Kafka(异步解耦)。
  • 规则引擎:LiteFlow + Redis 缓存 + 审批流程。

章节来源

架构总览

系统采用“网关 + 多业务服务 + 中间件”的分层架构。网关负责路由、鉴权与灰度;服务内部通过 Redis 缓存热点数据,使用 Kafka 异步处理日志与事件;设备与任务服务将高频日志写入 TDengine 时序库,降低 MySQL 压力;Prometheus 抓取各服务指标,SkyWalking 进行链路追踪。

Mermaid Diagram Code:

sequenceDiagram
participant Client as "客户端"
participant GW as "Gateway"
participant SVC as "业务服务"
participant REDIS as "Redis"
participant DB as "MySQL/TDengine"
participant MQ as "Kafka"
Client->>GW : 请求
GW->>SVC : 路由转发
SVC->>REDIS : 读取缓存
alt 命中
REDIS-->>SVC : 返回数据
else 未命中
SVC->>DB : 查询数据库
DB-->>SVC : 返回数据
SVC->>REDIS : 写入缓存
end
opt 异步流程
SVC->>MQ : 发送消息
MQ-->>SVC : 确认
end
SVC-->>GW : 响应
GW-->>Client : 返回

图表来源

详细组件分析

缓存优化策略(Redis)

  • 自定义过期时间:通过缓存名格式“key#ttl”实现按缓存项粒度设置过期时间,支持 d/h/m/s 单位。
  • 随机过期抖动:配置 key 过期时间随机范围,降低缓存雪崩风险。
  • 规则引擎缓存:使用 Redis 缓存规则链 DTO,结合分布式锁与数据库兜底,避免缓存穿透与击穿。
  • 缓存一致性:热点数据采用“先更新 DB,再失效/更新缓存”,并配合异步刷新策略。

Mermaid Diagram Code:

flowchart TD
Start["开始: getRuleDetail(ruleId)"] --> CheckParam{"ruleId 是否为空?"}
CheckParam --> |是| Error["抛出异常"]
CheckParam --> |否| QueryRedis["查询 Redis 缓存"]
QueryRedis --> CacheHit{"缓存命中?"}
CacheHit --> |是| CheckEmpty{"是否为空占位符?"}
CheckEmpty --> |是| ReturnNull["返回 null"]
CheckEmpty --> |否| ReturnResult["返回规则 DTO"]
CacheHit --> |否| AcquireLock["尝试获取分布式锁"]
AcquireLock --> LockSuccess{"获取成功?"}
LockSuccess --> |否| ReturnNullLock["返回 null"]
LockSuccess --> |是| DoubleCheckRedis["再次查询 Redis"]
DoubleCheckRedis --> DoubleHit{"缓存命中?"}
DoubleHit --> |是| ReturnResult
DoubleHit --> |否| QueryDB["查询数据库 RuleBusinessApi"]
QueryDB --> DBHit{"数据库存在?"}
DBHit --> |是| SetCache["写入 Redis 缓存"]
SetCache --> ReturnDBResult["返回 DB 数据"]
DBHit --> |否| SetEmptyCache["写入防穿透空值"]
SetEmptyCache --> ReturnNullDB["返回 null"]

图表来源

章节来源

线程池配置与任务调度优化

  • 模块内线程池:设备、启动器、任务模块均提供自定义线程池,核心池大小、最大池大小、队列容量、拒绝策略可按业务调优。
  • 异步任务:启用 @EnableAsync,线程池任务装饰器接入 TransmittableThreadLocal,保证上下文传递。
  • 导出任务限流:通过配置项限制系统同时运行的异步导出任务数量,避免资源争抢。

Mermaid Diagram Code:

classDiagram
class ThreadPoolConfig_Device {
+taskExecutor() Executor
}
class ThreadPoolConfig_Launcher {
+taskExecutor() Executor
}
class ThreadPoolConfig_Task {
+taskExecutor() Executor
}
class ExportRejectedExecutionHandler {
+rejectedExecution(r, executor) void
}
class ExportTaskConfig {
+exportTaskMaxCount int
}
class YudaoAsyncAutoConfiguration {
+threadPoolTaskExecutorBeanPostProcessor() BeanPostProcessor
}
ThreadPoolConfig_Device --> ExportRejectedExecutionHandler : "使用"
ThreadPoolConfig_Launcher --> ExportRejectedExecutionHandler : "使用"
ThreadPoolConfig_Task --> ExportRejectedExecutionHandler : "使用"
ExportTaskConfig --> ThreadPoolConfig_Task : "受控"
YudaoAsyncAutoConfiguration --> ThreadPoolConfig_Device : "装饰"
YudaoAsyncAutoConfiguration --> ThreadPoolConfig_Launcher : "装饰"
YudaoAsyncAutoConfiguration --> ThreadPoolConfig_Task : "装饰"

图表来源

章节来源

数据库性能优化

  • MySQL 连接池:可通过连接池参数(最大活跃、最大空闲、最大等待、Ping 策略等)优化长事务与连接复用。
  • 查询优化:使用 Druid 性能分析 SQL 报告,关注慢 SQL 数量、平均响应时间、错误率与并发峰值。
  • 索引设计:围绕高频查询字段建立合适索引,避免全表扫描;对时间序列数据优先使用分区或分表策略。
  • 时序数据:设备运行时序数据写入 TDengine,降低 MySQL 压力,提升 OLAP 场景查询效率。

Mermaid Diagram Code:

flowchart TD
A["收集慢 SQL 指标"] --> B["分析执行计划"]
B --> C{"是否存在索引缺失?"}
C --> |是| D["创建/调整索引"]
C --> |否| E["优化 SQL 结构"]
D --> F["监控回归"]
E --> F
F --> G["评估 QPS/RT/错误率"]

图表来源

章节来源

网关灰度发布与流量控制

  • 灰度负载均衡:根据请求头中的版本字段筛选相同版本的服务实例,未匹配时回退到全部实例。
  • 流量路由:在灰度场景下,确保新旧版本实例的权重配置合理,避免流量倾斜。

Mermaid Diagram Code:

sequenceDiagram
participant Client as "客户端"
participant Filter as "GrayReactiveLoadBalancerClientFilter"
participant LB as "GrayLoadBalancer"
participant Nacos as "Nacos"
participant Inst as "服务实例"
Client->>Filter : 请求 (Header : version=1.0.1)
Filter->>LB : choose()
LB->>Nacos : 获取实例列表
Nacos-->>LB : 返回实例(含metadata)
LB->>LB : 筛选 metadata[version]==1.0.1
alt 存在匹配
LB->>Inst : 基于权重选择
else 无匹配
LB->>Inst : 在全部实例中基于权重选择
end
LB-->>Filter : 返回实例
Filter->>Inst : 转发请求
Inst-->>Client : 响应

图表来源

章节来源

消息队列与异步解耦

  • Kafka:黑名单模块提供测试接口用于发送回调事件,异步解耦日志上报与业务主流程。
  • 生产者配置:确保批量大小、压缩算法、重试策略与分区策略与吞吐需求匹配。

章节来源

依赖分析

  • 组件耦合:网关与各业务服务松耦合,通过 Nacos 注册与配置中心;缓存与数据库为互补关系,规则引擎与审批流程耦合度较高。
  • 外部依赖:Nacos(注册/配置)、Redis(缓存)、MySQL(业务)、TDengine(时序)、Kafka(消息)、SkyWalking(链路追踪)。
  • 可能的循环依赖:网关配置中允许循环依赖,需谨慎处理 Bean 初始化顺序。

Mermaid Diagram Code:

graph LR
GW["Gateway"] --> NACOS["Nacos"]
GW --> REDIS["Redis"]
SVC["业务服务"] --> MYSQL["MySQL"]
SVC --> TD["TDengine"]
SVC --> KAFKA["Kafka"]
MON["Prometheus/SkyWalking"] --> SVC

图表来源

章节来源

性能考虑

  • CPU 高:排查热点接口、线程池饱和、GC 抖动;优先优化慢 SQL 与缓存命中率。
  • 内存高:关注大对象缓存、线程池队列堆积、长时间存活对象;开启随机过期抖动降低缓存雪崩。
  • 磁盘 IO 高:将高频日志写入 TDengine,减少 MySQL 写放大;优化 Kafka 批量与压缩策略。
  • 网络与并发:灰度发布时控制流量比例,避免新版本实例过载;线程池参数与拒绝策略协同。

[本节为通用指导,无需列出章节来源]

故障排查指南

  • 指标采集:通过 Prometheus 抓取 Actuator 暴露的 Micrometer 指标,结合 SkyWalking 查看链路耗时。
  • 规则引擎异常:检查 Redis 缓存是否命中、分布式锁是否超时、数据库是否存在对应规则链。
  • 线程池拒绝:导出任务被拒绝时,检查系统并发阈值与队列容量,必要时扩容或降载。
  • 网关灰度异常:确认请求头版本字段与实例元数据一致,检查权重配置。

章节来源

结论

yudao-cloud 的性能优化应围绕“缓存命中 + 线程池调优 + 数据库与时序库分离 + 指标监控”展开。通过 Redis 自定义 TTL、规则引擎多级缓存与分布式锁、模块化线程池与异步任务装饰器、MySQL + TDengine 的混合存储架构,以及 Prometheus + SkyWalking 的可观测性体系,可系统性地降低 CPU、内存与 IO 压力,提升整体吞吐与稳定性。

[本节为总结,无需列出章节来源]

附录

  • 监控端点与标签:Actuator 暴露指标,commonTags 统一标注 application 名称。
  • 灰度发布:基于 Header 的版本分流,支持权重选择与回退策略。
  • Kafka 集成:黑名单模块提供测试接口用于发送回调事件,便于验证异步链路。

章节来源

用户文档
AI 助手
Agent 列表
请选择一个 Agent 开始对话
AI 问答