# 框架配置 **本文引用的文件** - [application.yml](file://crm-app/src/main/resources/application.yml) - [JacksonConfig.java](file://crm-base/src/main/java/com/crm/base/config/JacksonConfig.java) - [RedisConfig.java](file://crm-base/src/main/java/com/crm/base/config/RedisConfig.java) - [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java) - [SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java) - [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java) - [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java) - [CustomIdGenerator.java](file://crm-base/src/main/java/com/crm/base/config/CustomIdGenerator.java) - [CrmSqlInjector.java](file://crm-base/src/main/java/com/crm/base/config/CrmSqlInjector.java) - [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考虑](#性能考虑) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本文件聚焦于框架层的关键配置与扩展点,覆盖以下主题: - Jackson 序列化配置:时间、空值、枚举、字段可见性等常用策略。 - Redis 缓存配置:连接、序列化、超时、重试等关键参数说明与优化建议。 - 雪花ID生成器 SnowflakeIdWorker:工作节点与机器位分配、时钟回拨处理、线程安全与性能要点。 - 元对象填充处理器 MetaObjectFillHandler:自动填充创建人、更新时间等审计字段的机制与自定义方式。 - 相关集成:MyBatis-Plus 的 ID 生成器注入、SQL 注入器、基础实体约定。 ## 项目结构 本项目采用多模块组织,框架级配置集中在 crm-base 模块的 config 包中,应用入口在 crm-app 模块的 application.yml 中进行外部化配置。 ```mermaid graph TB subgraph "应用层" APP["crm-app
application.yml"] end subgraph "基础能力层" JCONF["JacksonConfig.java"] RCONF["RedisConfig.java"] MPCONF["MybatisPlusConfig.java"] SQLI["CrmSqlInjector.java"] META["MetaObjectFillHandler.java"] SNOWF["SnowflakeIdWorker.java"] SNOWP["SnowflakeProperties.java"] CIDG["CustomIdGenerator.java"] BASEE["BaseEntity.java"] end APP --> JCONF APP --> RCONF APP --> MPCONF MPCONF --> META MPCONF --> CIDG CIDG --> SNOWF SNOWF --> SNOWP MPCONF --> SQLI MPCONF --> BASEE ``` **图表来源** - [application.yml](file://crm-app/src/main/resources/application.yml) - [JacksonConfig.java](file://crm-base/src/main/java/com/crm/base/config/JacksonConfig.java) - [RedisConfig.java](file://crm-base/src/main/java/com/crm/base/config/RedisConfig.java) - [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java) - [CrmSqlInjector.java](file://crm-base/src/main/java/com/crm/base/config/CrmSqlInjector.java) - [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java) - [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java) - [SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java) - [CustomIdGenerator.java](file://crm-base/src/main/java/com/crm/base/config/CustomIdGenerator.java) - [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java) **章节来源** - [application.yml](file://crm-app/src/main/resources/application.yml) - [JacksonConfig.java](file://crm-base/src/main/java/com/crm/base/config/JacksonConfig.java) - [RedisConfig.java](file://crm-base/src/main/java/com/crm/base/config/RedisConfig.java) - [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java) - [CrmSqlInjector.java](file://crm-base/src/main/java/com/crm/base/config/CrmSqlInjector.java) - [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java) - [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java) - [SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java) - [CustomIdGenerator.java](file://crm-base/src/main/java/com/crm/base/config/CustomIdGenerator.java) - [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java) ## 核心组件 - Jackson 序列化配置:统一 JSON 行为(时间格式、空值策略、枚举序列化、字段可见性、时区等)。 - Redis 缓存配置:连接池、序列化、过期策略、异常重试、集群/哨兵模式开关等。 - SnowflakeIdWorker:分布式唯一ID生成,支持可配置的工作节点与数据中心位,具备时钟回拨检测与告警。 - MetaObjectFillHandler:基于 MyBatis-Plus 的元对象填充,实现创建/更新审计字段自动填充。 - MyBatis-Plus 集成:全局 ID 生成器、SQL 注入器、分页插件、乐观锁等。 **章节来源** - [JacksonConfig.java](file://crm-base/src/main/java/com/crm/base/config/JacksonConfig.java) - [RedisConfig.java](file://crm-base/src/main/java/com/crm/base/config/RedisConfig.java) - [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java) - [SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java) - [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java) - [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java) - [CrmSqlInjector.java](file://crm-base/src/main/java/com/crm/base/config/CrmSqlInjector.java) - [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java) ## 架构总览 下图展示了配置类之间的装配关系与数据流向:应用通过 application.yml 提供外部化配置;Spring 容器加载各配置类并注册 Bean;业务代码通过注解或 API 使用这些能力。 ```mermaid graph LR YML["application.yml"] --> JCONF["JacksonConfig"] YML --> RCONF["RedisConfig"] YML --> MPCONF["MybatisPlusConfig"] MPCONF --> META["MetaObjectFillHandler"] MPCONF --> CIDG["CustomIdGenerator"] CIDG --> SNOWF["SnowflakeIdWorker"] SNOWF --> SNOWP["SnowflakeProperties"] MPCONF --> SQLI["CrmSqlInjector"] MPCONF --> BASEE["BaseEntity"] ``` **图表来源** - [application.yml](file://crm-app/src/main/resources/application.yml) - [JacksonConfig.java](file://crm-base/src/main/java/com/crm/base/config/JacksonConfig.java) - [RedisConfig.java](file://crm-base/src/main/java/com/crm/base/config/RedisConfig.java) - [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java) - [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java) - [CustomIdGenerator.java](file://crm-base/src/main/java/com/crm/base/config/CustomIdGenerator.java) - [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java) - [SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java) - [CrmSqlInjector.java](file://crm-base/src/main/java/com/crm/base/config/CrmSqlInjector.java) - [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java) ## 详细组件分析 ### Jackson 序列化配置 - 作用与默认行为 - 时间类型序列化:统一为字符串格式与时区设置,避免前后端时间解析不一致。 - 空值处理:对 null 字段进行过滤或保留策略控制,减少冗余 JSON。 - 枚举序列化:按名称或序号序列化,保证接口稳定性。 - 字段可见性:仅序列化被注解标记或满足可见性规则的字段。 - 反序列化容错:忽略未知字段、宽松日期解析等。 - 自定义方式 - 通过 JacksonConfig 中的 ObjectMapper 定制模块、注解、格式化器等。 - 结合 @JsonFormat、@JsonIgnore、@JsonProperty 等注解细化模型行为。 - 优化建议 - 合理设置最大嵌套深度与最大数组长度,防止恶意负载导致 OOM。 - 针对热点字段启用快速序列化(如禁用反射开销)以提升吞吐。 - 常见问题 - 时间格式不匹配:检查时区与格式化模板是否一致。 - 空值丢失:确认空值策略与模型注解是否冲突。 **章节来源** - [JacksonConfig.java](file://crm-base/src/main/java/com/crm/base/config/JacksonConfig.java) ### Redis 缓存配置 - 作用与默认行为 - 连接管理:单机/哨兵/集群模式切换,连接池大小、超时、重试次数。 - 序列化策略:键值序列化器选择(JSON、JDK、String 等),影响兼容性与体积。 - 过期策略:默认 TTL、空值缓存策略、缓存穿透/击穿防护。 - 事务与监听:Pipeline、事务、消息监听等高级特性开关。 - 自定义方式 - 通过 RedisConfig 调整序列化器、超时、连接池、Cluster/Sentinel 参数。 - 在业务中使用 StringRedisTemplate/RedisTemplate 操作缓存。 - 优化建议 - 热点 Key 加本地缓存或布隆过滤器降低 Redis 压力。 - 大对象分片存储,避免单个 Key 过大。 - 合理设置过期时间与随机抖动,避免雪崩。 - 常见问题 - 序列化不一致导致读不到缓存:确保生产与消费侧序列化器一致。 - 连接池耗尽:监控连接数与慢查询,调优 pool.max-active 与超时。 **章节来源** - [RedisConfig.java](file://crm-base/src/main/java/com/crm/base/config/RedisConfig.java) ### 雪花ID生成器 SnowflakeIdWorker - 作用与默认行为 - 生成 64 位长整型 ID,包含时间戳、数据中心位、工作节点位、序列号。 - 线程安全,单调递增,适合高并发场景。 - 支持时钟回拨检测与告警,必要时可回退到安全策略。 - 配置项与默认值 - 数据中心位与工作节点位:由 SnowflakeProperties 提供,需保证集群内唯一。 - 时钟回拨阈值:超过阈值触发告警或降级。 - 自定义方式 - 通过 CustomIdGenerator 将 SnowflakeIdWorker 注入为 MyBatis-Plus 的全局 ID 生成器。 - 可通过环境变量或配置文件动态调整位分配与阈值。 - 优化建议 - 合理划分数据中心位与工作节点位,避免 ID 空间不足。 - 监控时钟回拨事件,配合 NTP 同步服务。 - 常见问题 - ID 重复:检查工作节点位是否冲突、时钟是否回拨。 - ID 非单调:确认序列号溢出与时间戳推进逻辑。 ```mermaid classDiagram class SnowflakeProperties { +long datacenterId +long workerId +long maxBackwardMs } class SnowflakeIdWorker { +long nextId() long -long timestamp -long sequence -long datacenterId -long workerId } class CustomIdGenerator { +generateId(entity) Object } SnowflakeIdWorker --> SnowflakeProperties : "读取配置" CustomIdGenerator --> SnowflakeIdWorker : "委托生成" ``` **图表来源** - [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java) - [SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java) - [CustomIdGenerator.java](file://crm-base/src/main/java/com/crm/base/config/CustomIdGenerator.java) **章节来源** - [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java) - [SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java) - [CustomIdGenerator.java](file://crm-base/src/main/java/com/crm/base/config/CustomIdGenerator.java) ### 元对象填充处理器 MetaObjectFillHandler - 作用与默认行为 - 在插入与更新前自动填充审计字段(如创建人、创建时间、更新人、更新时间)。 - 基于 MyBatis-Plus 的 MetaObjectHandler 接口实现,拦截持久化操作。 - 配置与使用 - 在 MybatisPlusConfig 中注册 MetaObjectFillHandler。 - 实体继承 BaseEntity,定义需要自动填充的字段。 - 自定义方式 - 重写填充逻辑,从上下文获取当前用户信息、租户信息等。 - 可按条件跳过某些字段的填充。 - 优化建议 - 避免在填充逻辑中进行远程调用,保持高性能。 - 对批量操作进行性能优化,减少上下文查询。 - 常见问题 - 填充失败:检查处理器是否注册、上下文是否可用。 - 字段未生效:确认实体字段与注解配置是否正确。 ```mermaid sequenceDiagram participant Biz as "业务代码" participant MP as "MyBatis-Plus" participant Handler as "MetaObjectFillHandler" participant DB as "数据库" Biz->>MP : 调用 insert/update MP->>Handler : 执行填充逻辑 Handler-->>MP : 返回填充后的实体 MP->>DB : 执行持久化 DB-->>Biz : 返回结果 ``` **图表来源** - [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java) - [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java) - [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java) **章节来源** - [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java) - [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java) - [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java) ### MyBatis-Plus 集成与 SQL 注入器 - 作用与默认行为 - 全局配置 ID 生成器、分页插件、乐观锁、SQL 注入器等。 - CrmSqlInjector 提供通用 SQL 片段与增强方法。 - 配置与使用 - 在 MybatisPlusConfig 中注册各类插件与处理器。 - 在 Mapper 中直接使用增强方法。 - 优化建议 - 合理使用分页与条件构造器,避免全表扫描。 - 对复杂查询进行 SQL 分析与索引优化。 - 常见问题 - 插件冲突:检查插件注册顺序与兼容性。 - SQL 注入风险:使用参数化查询,避免拼接。 **章节来源** - [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java) - [CrmSqlInjector.java](file://crm-base/src/main/java/com/crm/base/config/CrmSqlInjector.java) ## 依赖关系分析 - JacksonConfig 与 RedisConfig 均依赖 Spring 环境,通过 application.yml 提供配置。 - MybatisPlusConfig 依赖 MetaObjectFillHandler、CustomIdGenerator、CrmSqlInjector。 - CustomIdGenerator 依赖 SnowflakeIdWorker,后者依赖 SnowflakeProperties。 - BaseEntity 作为实体基类,被业务实体继承以启用审计字段。 ```mermaid graph TD JCONF["JacksonConfig"] --> SPRING["Spring 容器"] RCONF["RedisConfig"] --> SPRING MPCONF["MybatisPlusConfig"] --> META["MetaObjectFillHandler"] MPCONF --> CIDG["CustomIdGenerator"] CIDG --> SNOWF["SnowflakeIdWorker"] SNOWF --> SNOWP["SnowflakeProperties"] MPCONF --> SQLI["CrmSqlInjector"] MPCONF --> BASEE["BaseEntity"] ``` **图表来源** - [JacksonConfig.java](file://crm-base/src/main/java/com/crm/base/config/JacksonConfig.java) - [RedisConfig.java](file://crm-base/src/main/java/com/crm/base/config/RedisConfig.java) - [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java) - [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java) - [CustomIdGenerator.java](file://crm-base/src/main/java/com/crm/base/config/CustomIdGenerator.java) - [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java) - [SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java) - [CrmSqlInjector.java](file://crm-base/src/main/java/com/crm/base/config/CrmSqlInjector.java) - [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java) **章节来源** - [application.yml](file://crm-app/src/main/resources/application.yml) - [JacksonConfig.java](file://crm-base/src/main/java/com/crm/base/config/JacksonConfig.java) - [RedisConfig.java](file://crm-base/src/main/java/com/crm/base/config/RedisConfig.java) - [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java) - [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java) - [CustomIdGenerator.java](file://crm-base/src/main/java/com/crm/base/config/CustomIdGenerator.java) - [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java) - [SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java) - [CrmSqlInjector.java](file://crm-base/src/main/java/com/crm/base/config/CrmSqlInjector.java) - [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java) ## 性能考虑 - Jackson:启用快速序列化、限制嵌套深度、按需序列化字段。 - Redis:连接池调优、Pipeline 批量操作、热点 Key 本地缓存、避免大对象。 - Snowflake:合理分配位段、监控时钟回拨、避免序列号溢出。 - MyBatis-Plus:分页查询、索引优化、避免 N+1 问题。 [本节为通用指导,无需特定文件来源] ## 故障排查指南 - Jackson 序列化异常 - 现象:JSON 解析失败、时间格式错误。 - 排查:检查 ObjectMapper 配置、字段注解、时区设置。 - Redis 连接失败 - 现象:连接超时、序列化错误。 - 排查:检查连接参数、序列化器一致性、网络连通性。 - Snowflake ID 重复 - 现象:主键冲突。 - 排查:检查工作节点位唯一性、时钟回拨日志、序列号溢出。 - 元对象填充失效 - 现象:审计字段为空。 - 排查:检查处理器注册、上下文可用性、实体继承关系。 **章节来源** - [JacksonConfig.java](file://crm-base/src/main/java/com/crm/base/config/JacksonConfig.java) - [RedisConfig.java](file://crm-base/src/main/java/com/crm/base/config/RedisConfig.java) - [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java) - [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java) ## 结论 通过集中化的框架配置,项目在序列化、缓存、ID 生成与审计填充等方面实现了统一与可扩展。建议在生产环境中持续监控关键指标(序列化耗时、Redis 连接数、ID 生成延迟、填充成功率),并结合业务场景进行参数调优与故障预案设计。 [本节为总结性内容,无需特定文件来源] ## 附录 - 配置项速查 - Jackson:时间格式、空值策略、枚举序列化、字段可见性。 - Redis:连接池、序列化器、超时、重试、集群/哨兵。 - Snowflake:数据中心位、工作节点位、时钟回拨阈值。 - MetaObjectFillHandler:审计字段、填充时机、上下文来源。 - 最佳实践 - 配置与环境分离,使用配置文件管理不同环境差异。 - 对关键组件添加健康检查与监控告警。 - 定期审查配置变更,避免漂移与不一致。 [本节为补充信息,无需特定文件来源]