feat(p1): complete P1 foundation stage
Some checks failed
CI Go / test (push) Has been cancelled
CI Proto / lint (push) Has been cancelled
CI Python / test (push) Has been cancelled
CI TypeScript / test (push) Has been cancelled

- monorepo: pnpm workspace + go.work + pyproject.toml + commitlint/husky
- infra: docker-compose (minimal + full profiles) + init-sql + prometheus
- arch-scan: multi-language scanner skeleton (TS/Go/Python/Proto)
- shared-proto: buf v2 + classes.proto (ClassService CRUD contract)
- api-gateway: Go/Gin + JWT HS256 auth + reverse proxy + request ID
- classes: NestJS golden template (error system + observability + middleware + CRUD + tests)
- teacher-portal: Next.js + paper-feel UI design system
- CI/CD: 4 workflows (go/ts/py/proto)
- docs: migration guide + project_rules + coding-standards + git-workflow + ui-design-system + 004 + 9 module READMEs + known-issues + spec/plan migration + roadmap
This commit is contained in:
SpecialX
2026-07-07 23:39:37 +08:00
commit 2ba4250165
100 changed files with 15242 additions and 0 deletions

492
MIGRATION_GUIDE.md Normal file
View File

@@ -0,0 +1,492 @@
# 迁移指南CICD → Edu
> 版本1.0
> 日期2026-07-07
> 状态:基线发布
> 维护者:架构组
> 关联文档:
> - [项目规则](./project_rules.md)
> - [编码规范](./docs/standards/coding-standards.md)
> - [Git 工作流](./docs/standards/git-workflow.md)
---
## 目录
1. [迁移背景](#一迁移背景)
2. [原始项目说明](#二原始项目说明cicd)
3. [新项目说明](#三新项目说明edu)
4. [迁移策略矩阵](#四迁移策略矩阵)
5. [文档体系映射表](#五文档体系映射表)
6. [六阶段路线图概览](#六六阶段路线图概览)
7. [原始项目可复用资产清单](#七原始项目可复用资产清单)
8. [迁移验收标准](#八迁移验收标准)
---
## 一、迁移背景
### 1.1 迁移动机
原始项目 CICD 是基于 Next.js 16 的单应用架构,承载 K12 智慧教务系统 35 个业务模块。随着业务规模扩张与团队增长,单应用架构在以下方面暴露瓶颈:
| 维度 | 单应用瓶颈 | 微服务目标 |
|------|-----------|-----------|
| 团队协作 | 35 模块挤在同一仓库,合并冲突频繁 | 按领域拆分6 领域团队独立迭代 |
| 部署节奏 | 全量构建发布,单模块变更牵动全站 | 服务粒度独立部署,故障爆炸半径缩小 |
| 技术选型 | TypeScript 单语言AI/分析场景受限 | TS业务+ Go网关+ PythonAI/分析)各取所长 |
| 数据规模 | 单 MySQL跨模块联表与读放大 | 读写分离 + CQRSClickHouse 承载分析负载 |
| 可演进性 | 模块间隐式耦合,重构成本高 | DDD 限界上下文显式契约,演化可控 |
### 1.2 迁移原则
1. **契约先行**:服务间通信先定 protobuf 契约,再写实现,禁止"先实现再补契约"
2. **资产复用**设计令牌、权限模型、缓存策略、UI 组件模式等优质资产尽量平移,不重复造轮子
3. ** strangler fig**:不一次性切流,按阶段灰度迁移,旧系统与新系统在过渡期并存
4. **数据自治**:每个微服务独占自身数据库,跨服务查询走 BFF 聚合或读模型
5. **可观测优先**:迁移同步建立 tracing/metrics/logging 三件套,禁止"先上线后补监控"
---
## 二、原始项目说明CICD
### 2.1 基本概况
| 属性 | 值 |
|------|-----|
| 仓库路径 | `e:\Desktop\CICD` |
| 技术栈 | Next.js 16 + React 19 + Tailwind v4 + Drizzle ORM |
| 语言 | TypeScript全栈 |
| 架构 | 单应用 + 严格模块化app → modules → shared 三层) |
| 业务模块数 | 35 个 |
| 数据库 | MySQL单库 |
| 认证 | NextAuth.js |
| 部署 | Gitea Actions + Docker standalone |
### 2.2 模块清单(按领域归类)
| 领域 | 模块 |
|------|------|
| 身份与权限 | auth、users、onboarding、settings、permissions |
| 教学组织 | classes、teachers、students、parents、subjects |
| 教学核心 | courses、lessons、schedule、attendance、leave-requests |
| 考试评价 | exams、questions、grading、scores、analytics |
| 作业内容 | homework、textbooks、resources |
| 沟通通知 | messaging、notifications、announcements |
| 智能辅助 | ai备课/出题/分析、search |
| 系统支撑 | audit-logs、reports、dashboard、layout |
### 2.3 已沉淀的工程资产
- **arch.db 架构元数据库**:通过 `npm run arch:scan` 扫描得到模块、函数、调用关系、依赖关系、技术标签的结构化数据
- **设计令牌体系**primitive / semantic-light / semantic-dark / 模块命名空间 / Tailwind 暴露 五层分层
- **权限模型**`requirePermission()` 服务端校验 + `usePermission().hasPermission()` 客户端校验,权限点常量集中维护
- **缓存策略**`cacheFn`React `cache()` + 自定义缓存层),权限数据不跨请求缓存
- **ActionState 模式**Server Action 统一返回 `{ success, message, errors, data }` 结构
- **5 层状态模型**URLnuqs→ ServerTanStack Query→ Client BusinessZustand→ Global UIZustand→ Formreact-hook-form
- **A11y 工具集**`useA11yId``mergeA11yProps``describeInput``loadingAria`、aria-live Hook、focus-trap 组件
- **CI/CD 流水线**CI + 安全扫描 + 灾备演练三套 Gitea Actions 工作流
- **审计日志三件套**`login-logger``change-logger``audit-logger`
---
## 三、新项目说明Edu
### 3.1 基本概况
| 属性 | 值 |
|------|-----|
| 仓库路径 | `e:\Desktop\Edu` |
| 远程仓库 | https://git.eazygame.cn/xiner/Edu.git |
| 架构范式 | DDD + EDA + CQRS 微服务 |
| 语言 | TypeScriptNestJS 10+ GoGin 网关)+ PythonFastAPI 分析/AI |
| 前端 | React + Next.js + Module Federation4 微前端) |
| monorepo 策略 | pnpm workspace + go.work + pyproject.toml (uv) |
| 事件总线 | Kafka + Debezium CDC |
| 契约 | protobuf + buf |
| 存储 | MySQL / Redis / ClickHouse / Neo4j / Elasticsearch |
### 3.2 整体架构
```mermaid
flowchart TB
subgraph Client[客户端]
WEB[Web 浏览器]
APP[移动端]
end
subgraph Gateway[网关层 Go Gin]
GW[API Gateway<br/>路由/鉴权/限流/熔断]
end
subgraph BFF[聚合层 BFF]
BFF1[Admin BFF]
BFF2[Teacher BFF]
BFF3[Student/Parent BFF]
end
subgraph Services[业务微服务 NestJS]
S1[identity 身份]
S2[org 教学组织]
S3[teaching 教学核心]
S4[content 内容分析]
S5[comm 沟通]
S6[insight 智能洞察]
end
subgraph Infra[基础设施服务]
I1[auth 认证授权]
I2[notification 通知]
end
subgraph EventBus[事件总线]
K[Kafka]
DBZ[Debezium CDC]
end
subgraph Storage[存储]
MY[(MySQL)]
RD[(Redis)]
CH[(ClickHouse)]
NEO[(Neo4j)]
ES[(Elasticsearch)]
end
Client --> GW
GW --> BFF
BFF --> Services
Services --> Infra
Services <--> K
DBZ --> K
Services --> Storage
Infra --> Storage
```
### 3.3 微前端与领域服务映射
| 微前端 | 路由前缀 | 对接 BFF | 主要消费的服务 |
|--------|---------|---------|---------------|
| Admin Shell | `/admin` | Admin BFF | identity、org、insight |
| Teacher Shell | `/teacher` | Teacher BFF | teaching、content、comm |
| Student Shell | `/student` | Student/Parent BFF | teaching、content |
| Parent Shell | `/parent` | Student/Parent BFF | teaching、comm |
| 微服务 | 原始模块映射 | 主存储 | 对外契约 |
|--------|------------|--------|---------|
| identity | auth、users、onboarding、settings、permissions | MySQL + Redis | identity.proto |
| org | classes、teachers、students、parents、subjects | MySQL | org.proto |
| teaching | courses、lessons、schedule、attendance、leave-requests、exams、homework | MySQL | teaching.proto |
| content | textbooks、resources、questions、grading | MySQL + Elasticsearch | content.proto |
| comm | messaging、notifications、announcements | MySQL + Redis | comm.proto |
| insight | scores、analytics、ai、search、reports、dashboard | ClickHouse + Neo4j | insight.proto |
| auth基础设施 | NextAuth 逻辑下沉 | MySQL + Redis | auth.proto |
| notification基础设施 | notifications channel 抽离 | MySQL + Redis | notification.proto |
---
## 四、迁移策略矩阵
按"直接迁移 / 调整迁移 / 重写 / 新建"四档分类。
### 4.1 规范类资产
| 资产 | 策略 | 说明 |
|------|------|------|
| 项目规则project_rules | 调整 | 架构图优先保留,分层规则从三层改为微服务分层,新增 DDD/契约/事件驱动规则 |
| 编码规范coding-standards | 调整 | TS 部分保留并补充 NestJS 装饰器/DI 规则,新增 Go、Python、protobuf 章节 |
| Git 工作流 | 调整 | trunk-based 替代分支策略scope 改为服务/包名,新增多语言 monorepo 提交规则 |
| 提交规范Conventional Commits | 直接迁移 | 类型与格式完全沿用 |
| 设计令牌规范 | 调整 | 分层模型保留,分布位置从 `src/app/styles/tokens/` 改为微前端共享包 |
| 安全规范 | 直接迁移 | Cookie 策略、env 校验、XSS 防护、权限校验规则全部沿用 |
| 问题记录规则 | 直接迁移 | known-issues.md 索引式速查手册模式沿用 |
| A11y 规范 | 直接迁移 | WCAG 2.2 AA 目标与工具集沿用 |
### 4.2 代码类资产
| 资产 | 策略 | 说明 |
|------|------|------|
| Zod schema 定义 | 直接迁移 | 各模块 schema.ts 平移至对应微服务,复用验证规则 |
| 权限点常量Permissions | 直接迁移 | 集中迁入 identity 服务共享包 |
| Drizzle schema表结构 | 调整 | 按领域拆分到各微服务独占库,关系型字段保持不变 |
| ActionState 类型 | 直接迁移 | 升级为 protobuf message结构不变 |
| Server Actions | 重写 | 改写为 NestJS Controller + Service + Application Service 三层 |
| data-access 层 | 重写 | 改写为 NestJS Repository + Domain Entity |
| UI 组件shared/components | 直接迁移 | 平移至微前端共享包,保持 PascalCase 命名 |
| HookuseAuth、usePermission | 调整 | 改为通过 BFF/gRPC client 获取,接口签名保持不变 |
| 缓存层cacheFn | 重写 | 改为 NestJS Cache 模块 + Redis去除 React cache() |
| arch:scan 工具 | 调整 | 扫描器扩展为多语言TS+Go+Python数据库结构保持 |
| 审计日志三件套 | 直接迁移 | 平移至 notification 服务,日志结构保持 |
| CI/CD 流水线 | 重写 | Gitea Actions 改为多服务并行流水线,新增契约校验阶段 |
### 4.3 文档类资产
| 资产 | 策略 | 说明 |
|------|------|------|
| 架构影响地图004 | 重写 | 从单应用模块图改为微服务限界上下文图 |
| K12 功能清单006 | 直接迁移 | 功能清单与架构无关,直接平移 |
| 差距审计报告007 | 调整 | 重新审计各微服务的功能完成度 |
| 模块角色映射008 | 直接迁移 | 角色权限矩阵不变 |
| 路线图roadmap/ | 重写 | 6 阶段微服务路线图 |
| known-issues.md | 直接迁移 | 经验日志平移,新增"微服务"分区 |
| 各模块 README | 重写 | 改为各微服务 README按 DDD 上下文描述 |
---
## 五、文档体系映射表
| CICD 文档 | Edu 对应文档 | 关系 |
|-----------|------------|------|
| `.trae/rules/project_rules.md` | `project_rules.md` | 调整(微服务版) |
| `docs/standards/coding-standards.md` | `docs/standards/coding-standards.md` | 调整(多语言版) |
| —(散落在 project_rules | `docs/standards/git-workflow.md` | 新建 |
| `docs/architecture/004_architecture_impact_map.md` | `docs/architecture/001_architecture_overview.md` | 重写 |
| `docs/architecture/006_k12_feature_checklist.md` | `docs/architecture/feature_checklist.md` | 直接迁移 |
| `docs/architecture/007_gap_audit_report.md` | `docs/architecture/gap_audit.md` | 调整 |
| `docs/architecture/008_module_role_mapping.md` | `docs/architecture/role_mapping.md` | 直接迁移 |
| `docs/architecture/roadmap/README.md` | `docs/architecture/roadmap/README.md` | 重写 |
| `docs/architecture/roadmap/tech-debt.md` | `docs/architecture/roadmap/tech-debt.md` | 重写 |
| `docs/architecture/roadmap/decoupling.md` | `docs/architecture/roadmap/migration_phases.md` | 重写(迁移阶段化) |
| `docs/troubleshooting/known-issues.md` | `docs/troubleshooting/known-issues.md` | 直接迁移 + 新分区 |
| `src/modules/[module]/README.md` | `services/[service]/README.md` | 重写 |
| `docs/standards/coding-standards.md` §A11y | `docs/standards/accessibility.md` | 拆分独立 |
---
## 六、六阶段路线图概览
### 6.1 阶段总览
```mermaid
gantt
title Edu 微服务迁移六阶段路线图
dateFormat YYYY-MM-DD
axisFormat %m月
section P1 地基
仓库结构/契约/CI/可观测 :p1, 2026-07-01, 30d
section P2 身份
identity/auth/notification :p2, after p1, 30d
section P3 核心教学
org/teaching/content :p3, after p2, 45d
section P4 内容分析
insight+CQRS读模型/ES :p4, after p3, 30d
section P5 沟通AI
comm/AI增强 :p5, after p4, 30d
section P6 硬化
安全/灾备/性能/混沌 :p6, after p5, 30d
```
### 6.2 各阶段目标
| 阶段 | 名称 | 目标 | 关键交付物 | 验收信号 |
|------|------|------|-----------|---------|
| P1 | 地基 | 仓库骨架、契约工具链、CI、可观测平台 | monorepo 结构、buf 配置、Kafka 集群、OpenTelemetry | 契约生成 + 一次端到端 trace |
| P2 | 身份 | identity + auth + notification 三服务打通 | JWT 颁发、RBAC、邮件/短信/站内通知 | 用户注册→登录→收到通知 |
| P3 | 核心教学 | org + teaching + content | 班级/课表/作业/题库/考试 | 教师创建作业→学生提交→批改闭环 |
| P4 | 内容分析 | insight + CQRS 读模型 + ES 全文检索 | ClickHouse 报表、ES 搜索、Neo4j 知识图谱 | 多维分析报表 + 全文搜索可用 |
| P5 | 沟通AI | comm + AI 辅助 | 站内信/通知中心、AI 备课/出题/答疑 | 教师用 AI 出题并发布到班级 |
| P6 | 硬化 | 安全加固、灾备、性能、混沌工程 | WAF、定期备份、压测报告、混沌演练 | RPO≤15min、RTO≤30min、P99≤500ms |
### 6.3 阶段交付门槛
每个阶段进入下一阶段前必须满足:
1. **契约稳定**:本阶段涉及服务的 protobuf 契约冻结breaking change 走 deprecation 流程
2. **可观测完整**tracing 覆盖率 ≥ 95%关键业务指标QPS/延迟/错误率)接入 Grafana
3. **测试覆盖**:单元测试 ≥ 80%,关键流程 E2E 通过
4. **文档同步**:服务 README + 004 架构图 + known-issues 已更新
5. **arch.db 同步**`pnpm run arch:scan` 已扫描最新代码状态
---
## 七、原始项目可复用资产清单
### 7.1 设计令牌思路
**复用方式**:将 CICD 的 `src/app/styles/tokens/` 五层分层模型平移至微前端共享包。
| CICD 位置 | Edu 位置 | 调整 |
|-----------|---------|------|
| `src/app/styles/tokens/primitive.css` | `packages/ui-tokens/primitive.css` | 直接平移 |
| `src/app/styles/tokens/semantic-light.css` | `packages/ui-tokens/semantic-light.css` | 直接平移 |
| `src/app/styles/tokens/semantic-dark.css` | `packages/ui-tokens/semantic-dark.css` | 直接平移 |
| `src/app/styles/tokens/lesson-preparation.css` | `packages/ui-tokens/lesson-preparation.css` | 直接平移 |
| `src/app/styles/tokens/tailwind-theme.css` | `packages/ui-tokens/tailwind-theme.css` | 直接平移 |
**强制规则保持不变**
- 禁止硬编码颜色(`#hex`
- 禁止硬编码字体(`'Inter'`/`'Fraunces'`/`'JetBrains Mono'`
- 禁止硬编码字号(`font-size: Npx`
- 禁止 Tailwind 任意值(`w-[Npx]`
- ESLint `no-restricted-syntax` + `design-tokens/no-hardcoded-fonts` 规则沿用
### 7.2 UI 组件模式
**复用方式**:将 CICD 的 `src/shared/components/ui/` 平移至 `packages/ui-components/`,作为 Module Federation 共享依赖。
| 组件类别 | CICD 路径 | Edu 路径 | 复用要点 |
|---------|----------|---------|---------|
| 基础组件Button/Input/Dialog | `shared/components/ui/` | `packages/ui-components/` | 全部平移,保持 PascalCase 命名 |
| A11y 组件 | `shared/components/a11y/` | `packages/ui-components/a11y/` | skip-link、visually-hidden、focus-trap、aria-status 全部平移 |
| 图表组件 | 各模块内 | `packages/ui-components/charts/` | 收集 recharts 封装,统一暴露 |
| 表单组件 | react-hook-form 封装 | `packages/ui-components/form/` | 与 zod resolver 一同平移 |
**复用规则**
- 组件必须为纯函数,使用 `function` 声明
- 不使用 `React.FC`,直接用函数声明 + 显式标注 props 类型
- 默认服务端组件(微前端 host需要交互时才添加 `"use client"`
- 组件行数 ≤ 500 行(复杂表单/大型表格可放宽至 800 行)
### 7.3 权限模型
**复用方式**:将 CICD 的 `requirePermission()` + `usePermission().hasPermission()` 模式平移至 identity 服务 + auth 基础设施服务。
| CICD 资产 | Edu 位置 | 调整 |
|-----------|---------|------|
| `shared/lib/auth-guard.ts`requirePermission | `services/auth/src/guards/permission.guard.ts`NestJS Guard | 改为 NestJS Guard 装饰器 |
| `shared/types/permissions.ts`(权限点常量) | `packages/contracts/src/permissions.ts` | 集中到 contracts 包,多服务共享 |
| `usePermission` Hook | `packages/ui-components/hooks/use-permission.ts` | 通过 BFF 拉取权限Hook 接口不变 |
| 角色权限矩阵008 | `docs/architecture/role_mapping.md` | 直接平移 |
**强制规则保持不变**
- 每个 Controller/Action 必须调用 `requirePermission()` 等价物
- 前端组件禁止使用 `role === "xxx"` 硬编码,统一使用 `usePermission().hasPermission()`
### 7.4 缓存策略
**复用方式**CICD 的 `cacheFn`React `cache()` + 自定义缓存层)改为 NestJS Cache 模块 + Redis**权限数据不跨请求缓存**的规则沿用。
| CICD 模式 | Edu 模式 | 备注 |
|-----------|---------|------|
| `cacheFn`React cache | NestJS `@UseInterceptors(CacheInterceptor)` + Redis | 单请求内缓存改为 NestJS REQUEST scope |
| `unstable_cache` | 禁用 | CICD 已禁用Edu 沿用禁用决策 |
| 权限数据缓存 | 仅在 auth 服务内部缓存TTL ≤ 60s | 跨服务不缓存权限 |
| 静态资源缓存 | CDN + 短缓存 | 配置不变 |
### 7.5 Server Action 模式 → Application Service 模式
**复用方式**CICD 的 Server Action 编排模式(权限 + Zod 验证 + 调用 data-access + revalidate平移为 NestJS Application Service 编排模式。
| CICD Server Action 步骤 | NestJS Application Service 对应 |
|------------------------|-------------------------------|
| `requirePermission(perm)` | `@RequirePermission(perm)` 装饰器 + Guard |
| Zod `safeParse` | `ValidationPipe` + DTO class-validator |
| 调用 `data-access` | 调用 Domain Service / Repository |
| `revalidatePath` | 发布领域事件触发读模型更新 |
| 返回 `ActionState<T>` | 返回 protobuf message结构同 ActionState |
### 7.6 状态管理 5 层模型
**复用方式**CICD 的 5 层状态模型平移至微前端 host 应用。
| 层级 | CICD 方案 | Edu 方案 | 备注 |
|------|----------|---------|------|
| L1 URL | nuqs | nuqs | 直接平移 |
| L2 Server | TanStack Query | TanStack Query | 直接平移 |
| L3 Client Business | Zustand slice | Zustand slice | 直接平移 |
| L4 Global UI | Zustand ui-store + ModalRoot | Zustand ui-store + ModalRoot | 直接平移 |
| L5 Form | react-hook-form + zodResolver | react-hook-form + zodResolver | 直接平移 |
### 7.7 A11y 工具集
**复用方式**:全部平移至 `packages/ui-components/a11y/`
- `useA11yId`:自动生成唯一 ARIA ID
- `mergeA11yProps`:合并 ARIA props
- `describeInput`:关联 input 与描述
- `loadingAria`:加载状态 ARIA 属性
- `useAriaLive`aria-live 区域管理 Hook
- `skip-link``visually-hidden``focus-trap``aria-status` 组件
**目标**WCAG 2.2 AA 合规,`eslint-plugin-jsx-a11y` 设为 `error`
### 7.8 审计日志三件套
**复用方式**:平移至 notification 服务,日志结构保持。
| CICD 资产 | Edu 位置 | 备注 |
|-----------|---------|------|
| `shared/lib/login-logger.ts` | `services/notification/src/loggers/login-logger.ts` | 登录尝试日志 |
| `shared/lib/change-logger.ts` | `services/notification/src/loggers/change-logger.ts` | 数据变更日志(监听领域事件) |
| `shared/lib/audit-logger.ts` | `services/notification/src/loggers/audit-logger.ts` | 关键业务操作日志 |
### 7.9 CI/CD 流水线模式
**复用方式**三套工作流模式沿用CI + 安全扫描 + 灾备演练),但执行方式改为多服务并行。
| CICD 工作流 | Edu 工作流 | 调整 |
|------------|-----------|------|
| `ci.yml` | `.gitea/workflows/ci.yml` | 单体改为矩阵并行(每个服务一个 job |
| `security.yml` | `.gitea/workflows/security.yml` | 新增 Trivy 扫描 Docker 镜像 |
| `dr-drill.yml` | `.gitea/workflows/dr-drill.yml` | 灾备演练改为多服务恢复顺序演练 |
**CI 必须包含**(沿用 CICD 规则):
1. 安装依赖多语言pnpm install / go mod download / uv sync
2. Lint 检查ESLint + golangci-lint + ruff
3. 类型检查tsc --noEmit + go vet + mypy
4. 契约校验buf lint + buf breaking
5. 单元测试 + 覆盖率
6. 构建(多服务并行)
7. 安全审计npm audit + Snyk + Trivy
8. E2E 测试(仅主分支)
---
## 八、迁移验收标准
### 8.1 阶段验收清单
每个阶段完成时必须勾选所有项:
- [ ] 本阶段服务的 protobuf 契约已冻结并通过 `buf breaking` 校验
- [ ] 服务 README 已编写,包含限界上下文图与依赖关系
- [ ] `docs/architecture/001_architecture_overview.md` 已同步更新
- [ ] `docs/troubleshooting/known-issues.md` 已追加本阶段经验日志
- [ ] `pnpm run arch:scan` 已扫描最新代码状态(含 TS+Go+Python
- [ ] 单元测试覆盖率 ≥ 80%
- [ ] tracing 覆盖率 ≥ 95%,关键指标已接入 Grafana
- [ ] `pnpm run lint``pnpm run typecheck` 零错误
- [ ] 安全扫描无高危漏洞
### 8.2 整体迁移完成标准
- [ ] 6 阶段全部交付且验收通过
- [ ] CICD 35 个业务模块全部在对应微服务中找到归宿
- [ ] 旧系统流量完全切流至新系统strangler fig 完成)
- [ ] RPO ≤ 15minRTO ≤ 30min
- [ ] P99 延迟 ≤ 500ms
- [ ] 全链路追踪可用,任意请求可一键定位调用链
- [ ] 文档体系完整架构图、契约、README、known-issues 全部同步
### 8.3 回滚预案
每个阶段均需准备回滚方案:
1. **P1 地基**基础设施回滚Kafka/可观测平台降级)
2. **P2 身份**:双写期间保留 CICD NextAuth 作为 fallback
3. **P3 核心教学**:双写 + 读流量按比例切流,异常即回切
4. **P4 内容分析**CQRS 读模型失败时降级为直查 MySQL
5. **P5 沟通AI**AI 服务降级为兜底响应,不影响主流程
6. **P6 硬化**:混沌演练发现问题后回滚至上一稳定版本
---
## 附录:迁移过程中的关键决策点
| 决策点 | 选择 | 理由 |
|--------|------|------|
| 服务拆分粒度 | 6 业务 + 2 基础设施 | 平衡团队规模与拆分收益,避免过细导致 RPC 开销 |
| 通信协议 | gRPC内部+ RESTBFF 对外) | 内部高性能,外部兼容性 |
| 事件总线 | Kafka + Debezium CDC | CDC 减少业务代码侵入Outbox 模式保证一致性 |
| 契约工具 | protobuf + buf | 多语言代码生成breaking change 检测 |
| 前端架构 | Module Federation | 微前端独立部署,运行时共享依赖 |
| 状态管理 | 沿用 5 层模型 | 团队熟悉度高,迁移成本低 |
| 数据库拆分 | 每服务独占库 | 杜绝跨服务联表,强制契约化通信 |
| 缓存策略 | NestJS Cache + Redis | 替代 React cache(),规则(权限不跨请求缓存)沿用 |
| 迁移方式 | strangler fig | 风险可控,渐进式切换 |
| arch.db | 多语言扫描扩展 | 复用 CICD 元数据库思路,扩展 Go/Python 扫描器 |