Files
schemaCheck/docs/工程结构.md
2026-08-03 14:48:29 +08:00

199 lines
7.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 序列化结构检测器 — 工程结构说明
> 工程:`serialization-schema-checker``com.codechecker:serialization-schema-checker`
> 定位:基于 JavaParser 的 **Redis 缓存 / MQRocketMQ、Kafkavalue 序列化结构变更** 静态检测工具
> 当前版本:`1.1.0` · Java 11 · 可执行 Fat Jarmaven-shade
---
## 1. 仓库顶层结构
```text
redisCheck/
├── pom.xml # Maven 单模块工程
├── .gitea/ # Gitea Actions 与示例/自检配置
│ ├── workflows/
│ │ └── serialization-schema-check.yaml
│ └── config/
│ └── serialization-schema-check-config.yaml
├── docs/ # 方案、配置与集成文档(本目录)
├── src/
│ ├── main/
│ │ ├── java/com/codechecker/cache/ # 主代码(按职责分包)
│ │ └── resources/
│ │ └── default-config.yaml # jar 内置默认配置
│ └── test/
│ ├── java/com/codechecker/cache/ # 单测 / 场景测
│ └── resources/fixtures/ # 源码片段夹具
└── target/ # 构建产物(不入库)
```
---
## 2. 主代码包结构
根包:`com.codechecker.cache`
```text
com.codechecker.cache
├── cli/ # 命令行入口
├── config/ # 配置模型与加载
├── git/ # Git diff / show 封装
├── analyze/ # 扫描编排与主分析流程
├── detector/ # 写入点 / 读侧提示检测
├── key/ # Redis key 表达式解析
├── schema/ # 类型索引、字段 Schema、骨架 JSON
├── diff/ # Schema Diff 与变更类型
├── report/ # 报告模型与渲染
└── notify/ # 企微机器人通知
```
### 2.1 包职责与主要类
| 包 | 职责 | 主要类 |
|----|------|--------|
| **cli** | picocli 入口;加载配置 → 分析 → 控制台报告 → 可选通知 | `SerializationSchemaCheckerMain` |
| **config** | 默认配置与业务配置深度合并;运行时配置模型 | `ConfigLoader``CheckerConfig` |
| **git** | 变更 Java 文件列表、按 SHA 取文件内容 | `GitDiffScanner``GitException` |
| **analyze** | 端到端编排:候选文件 → 写点检测 → Schema 提取 → Diff → 报告 | `SchemaCheckAnalyzer``FileScanner``GlobMatcher` |
| **detector** | 识别 Redis/MQ 写入(投递)点与读侧类型提示 | `RedisWritePointDetector``MqWritePointDetector``CacheReadHintDetector``MqReadHintDetector``BareValueTypes``WritePoint``CacheReadHint` |
| **key** | 将 key 表达式解析为模式(如 `demo:foo:*` | `RedisKeyResolver` |
| **schema** | 源码类型索引、字段展开、骨架 JSON 渲染 | `SourceIndex``JavaSchemaExtractor``TypeSchema``FieldSchema``SkeletonJsonRenderer``AnnotationSupport``JsonType` |
| **diff** | 新旧 Schema 对比,产出变更明细 | `SchemaDiffer``SchemaChange``ChangeType``Severity` |
| **report** | 按 Key/Topic 聚合、企微 Markdown / 控制台文本 | `CheckReport``KeyStructureChange``ReportBuilder``SkeletonAnnotator` |
| **notify** | 企微机器人 Webhook 发送 | `WeComNotifier` |
### 2.2 核心数据模型(实体)
| 类 | 含义 |
|----|------|
| `WritePoint` | 一处 Redis 写入或 MQ 投递点通道、key/topic、value 类型、位置) |
| `CacheReadHint` | 读侧反序列化推断出的类型提示(补强写入点,不单独告警) |
| `TypeSchema` / `FieldSchema` | value 类型展开后的扁平 Schema |
| `SchemaChange` | 单条结构变更(类型、路径、严重级别、说明) |
| `KeyStructureChange` | 按 Key/Topic 聚合的摘要(含前后骨架 JSON |
| `CheckReport` | 一次检测的完整结果 |
| `CheckerConfig` | 运行配置(含 Notify / Ignore / Detection 等嵌套结构) |
---
## 3. 运行时数据流
```text
SerializationSchemaCheckerMain
ConfigLoader.load(--config)
│ jar 内 default-config.yaml ⊕ 业务配置
SchemaCheckAnalyzer.analyze(oldSha, newSha)
├─ GitDiffScanner → 变更 .java 文件
├─ FileScanner → 读新旧源码内容
├─ SourceIndex → 建类型索引
├─ Redis/Mq WritePointDetector → 写入/投递点
├─ Cache/Mq ReadHintDetector → 读侧类型补强
├─ JavaSchemaExtractor → 展开 TypeSchema
├─ SchemaDiffer → SchemaChange 列表
└─ 聚合 KeyStructureChange → CheckReport
ReportBuilder (控制台 + 企微 Markdown
WeComNotifier (可选,--dry-run 时跳过)
```
**退出码约定**
| 码 | 含义 |
|----|------|
| `0` | 通过、跳过(`enabled=false` / 无基准 SHA或 notify 模式有变更 |
| `1` | `mode=block` 且检测到结构变更 |
| `2` | 执行异常 |
---
## 4. 资源与配置
| 路径 | 说明 |
|------|------|
| `src/main/resources/default-config.yaml` | 工具内置默认:检测模式、忽略规则、严重级别等 |
| 业务仓 `.gitea/config/serialization-schema-check-config.yaml` | 业务覆盖配置(流水线 `--config` 指向) |
| 本仓 `.gitea/config/serialization-schema-check-config.yaml` | 工具仓自用/示例配置 |
配置合并与字段说明见:[配置说明.md](./配置说明.md)
---
## 5. 测试结构
```text
src/test/java/com/codechecker/cache/
├── TestSupport.java # 夹具加载等公共方法
├── *ScenarioTest.java # 端到端场景tenant / mq / recording-todo
├── analyze/ / config/ / detector/
├── diff/ / key/ / report/ / schema/ # 与主包对应的单测
└── ...
src/test/resources/fixtures/
├── lock/ # 分布式锁等非结构写入样例
├── template/ # 模板写入样例
├── tenant/ # 包装层 / 字段迁移场景
├── recording-todo/ # Redis 写入场景
└── mq/
├── kafka-patrol/ # Kafka 巡检相关
├── kafka-record/ # Kafka Record 投递/消费
├── rocket-im/ # RocketMQ IM 通知
└── rocket-wallet/ # RocketMQ 钱包扣款
```
夹具多为 `.txt` 形式的 Java 源码片段,由场景测试拼装为新旧版本对比输入。
---
## 6. 构建与产物
| 项 | 说明 |
|----|------|
| 构建 | `mvn clean package` |
| 主类 | `com.codechecker.cache.cli.SerializationSchemaCheckerMain` |
| 产物 | `target/serialization-schema-checker-1.1.0.jar`shade 可执行包) |
| 主要依赖 | JavaParser、SnakeYAML、Jackson、picocli、Lombokprovided、JUnit 5test |
---
## 7. 文档索引
| 文档 | 内容 |
|------|------|
| [工程结构.md](./工程结构.md) | 本文:目录与模块职责 |
| [配置说明.md](./配置说明.md) | 配置项、合并规则、忽略/抑制 |
| [CI集成说明.md](./CI集成说明.md) | 流水线接入方式 |
| [v1.0/](./v1.0/) | Redis / MQ 检测实施方案(历史方案) |
| [V1.1/](./V1.1/) | 非结构写入收敛、新增写入点展示等整改方案 |
---
## 8. 模块依赖关系(简图)
```mermaid
flowchart TB
CLI[cli] --> CFG[config]
CLI --> AN[analyze]
CLI --> RPT[report]
CLI --> NT[notify]
AN --> GIT[git]
AN --> DET[detector]
AN --> SCH[schema]
AN --> DIFF[diff]
AN --> RPT
DET --> KEY[key]
DET --> SCH
DIFF --> SCH
RPT --> DIFF
NT --> RPT
```
上层调用下层;`detector` / `schema` / `diff` 不依赖 `cli``notify`,便于单测与复用。