# 企业级微服务架构升级设计 > 日期: 2026-07-07 > 状态: 已批准(待书面审阅) > 范围: 基于 0010_architecture.md 蓝图,将现有 Next.js 单体应用升级为 DDD+EDA+CQRS 微服务架构 > 实施策略: 方案 A(基础设施优先)+ 黄金模板服务驱动 > 团队: 1 人 + AI 辅助 > 周期: 12-18 个月,分 6 阶段(P1-P6) > 仓库: 全新独立 Git 仓库(next-edu-cloud),与现有 e:\Desktop\CICD 仓库分离 --- ## 1. 背景与目标 ### 1.1 现状 **现有项目**(e:\Desktop\CICD): - 单 Next.js 16 应用 + 严格三层模块化架构(app → modules → shared) - 35 业务模块、1030 源文件、54 数据库表、61 权限点、6 系统角色 - 已完成企业级规范化(P0 权限治理 + P1 工具链 + P2 配置升级) - 文档体系成熟:004 架构设计文档 + arch.db 元数据库 + 35 模块 README + known-issues 索引 **0010 蓝图**(理想架构): - DDD + EDA + CQRS + 异构微服务云原生架构 - 面向百万级 DAU、多端、全校同时交卷场景 - 6+ 领域微服务、Kafka 事件总线、异构存储(MySQL/ClickHouse/Neo4j/ES)、Push Gateway、Service Mesh ### 1.2 升级意图 用户选择**完整微服务重构**(非选择性借鉴),以 0010 蓝图为终态目标,12-18 个月内分阶段实施。新架构独立于现有 Next.js 项目,从零开始构建。 ### 1.3 核心约束 | 维度 | 约束 | | -------- | ------------------------------------------------------------------ | | 团队 | 1 人 + AI 辅助生成大部分代码 | | 周期 | 12-18 个月,分 6 阶段 | | 仓库 | 全新独立 Git 仓库,与现有 Next.js 仓库分离 | | 基础设施 | 微服务基础设施先用 Docker Desktop 本地构建 | | 技术栈 | 异构:Go(网关/长连接)+ Python(AI/分析)+ TypeScript(业务服务) | | 文档纪律 | 与现有项目等价:架构文档 + 模块文档 + 经验文档 + arch.db 查询 | | Git 管理 | 严格分支策略、Conventional Commits、模块管理 | | 数据策略 | 全新 DDD 限界上下文 schema,不迁移旧 schema,不共享数据库 | ### 1.4 目标 - 终态:实现 0010 蓝图的完整微服务架构 - 过程:每阶段有可独立验证的交付物,逐步深入 - 质量:企业级文档纪律、契约先行、CI 强制、可观测先行 - 风险控制:黄金模板服务驱动,避免分布式复杂度一次性爆发 --- ## 2. 总体架构与阶段总览 ### 2.1 目标系统终态架构 ```mermaid graph TB subgraph Client["多端访问层"] MF[Micro-Frontends
Teacher/Student/Parent/Admin
Module Federation] end subgraph Edge["边缘与网关层"] GW[API Gateway
Go: 鉴权/限流/路由] BFF_T[Teacher BFF
TS: GraphQL+DataLoader] BFF_S[Student BFF
TS: GraphQL] BFF_P[Parent BFF
TS: GraphQL] end subgraph Services["领域微服务层"] IAM[IAM 服务
TS/NestJS] CoreEdu[CoreEdu 服务
TS/NestJS] Content[Content 服务
TS/NestJS+Neo4j] DataAna[DataAna 服务
Python: 学情分析] Msg[Msg 服务
TS/NestJS] AI[AI 网关
Python: Prompt 管理] Push[Push Gateway
Go: 长连接] end subgraph Bus["事件总线"] Kafka[(Kafka
领域事件+CDC)] end subgraph Storage["异构存储"] MySQL[(MySQL/TiDB
关系型主库)] Redis[(Redis Cluster
缓存/锁/PubSub)] CH[(ClickHouse
分析宽表)] Neo4j[(Neo4j
知识图谱)] ES[(Elasticsearch
全文检索)] end subgraph Infra["基础设施"] CDC[Debezium CDC] Temporal[Temporal
工作流编排] Conf[配置中心
Consul/Nacos] Mesh[Service Mesh
Istio] end MF --> GW GW --> BFF_T & BFF_S & BFF_P BFF_T & BFF_S & BFF_P --> Services Services --> MySQL Services --> Redis Content --> Neo4j DataAna --> CH Services -- Outbox --> Kafka MySQL -- binlog --> CDC --> Kafka Kafka --> DataAna Kafka --> Push Kafka --> ES ``` ### 2.2 服务语言分配 | 服务 | 语言 | 框架 | 选型理由 | | ----------------------------- | ---------- | ------------------------- | ------------------------------ | | API Gateway | Go | Gin/Echo | 高并发网关性能 | | Push Gateway | Go | net/http + gorilla | 十万级长连接 | | IAM / CoreEdu / Content / Msg | TypeScript | NestJS | 业务逻辑 + 类型安全 + DDD 友好 | | DataAna 服务 | Python | FastAPI + ClickHouse | 数据分析生态 | | AI 网关 | Python | FastAPI | LLM SDK 生态 | | BFF × 3 | TypeScript | GraphQL Yoga + DataLoader | 前端聚合 | ### 2.3 角色可扩展性设计(三层解耦模型) 将"角色"拆成三个独立维度,角色只是配置载体,支持未来扩展(教导主任、教研组长、宿管等): ```mermaid graph LR subgraph Role["角色层(可动态扩展)"] R1[admin] R2[teacher] R3[student] R4[parent] R5[grade_head
年级主任] R6[teaching_head
教研组长] R7[...未来角色] end subgraph Perm["权限层(resource:action)"] P1[exam:create] P2[exam:read] P3[...N 个权限点] end subgraph View["视口层(UI 可见性配置)"] V1[L1 导航
侧边栏菜单项] V2[L2 路由
可访问路由] V3[L3 组件
页面内组件可见性] V4[L4 数据
DataScope 行级过滤] end Role -.->|"多对多
RolePermission 表"| Perm Role -.->|"多对多
RoleViewport 表"| View Perm -.->|"权限推导视口
permission→viewport 映射"| View ``` **关键决策**:视口既可独立配置(RoleViewport 表),也可由权限推导(permission → viewport 默认映射)。新角色只需配置权限集,视口自动推导;需要差异化时再显式配置视口。 **视口四层模型**: | 层级 | 含义 | 配置载体 | 示例 | | ------- | ---------------- | ------------------------------------ | -------------------------------------- | | L1 导航 | 侧边栏菜单项 | `navigation_config` 表 | 教导主任看到"全校成绩分析"菜单 | | L2 路由 | 可访问路由 | `route_permission` 表 + Gateway 校验 | 教导主任可访问 `/admin/grade-analysis` | | L3 组件 | 页面内组件可见性 | `usePermission().hasPermission()` | 教导主任看到"导出全校报表"按钮 | | L4 数据 | 数据行级过滤 | `DataScope` 枚举 | 教导主任 DataScope=`grade_managed` | **BFF 划分决策**:按"使用场景域"分 4 个稳定 BFF,新角色映射到最接近的场景域 + 通过权限/视口差异化: - Teacher BFF(教学场景:教师/教导主任/教研组长共用) - Student BFF(学习场景) - Parent BFF(家长场景) - Admin BFF(管理场景) **微前端划分决策**:按场景域分 4 个稳定 portal,内部通过 `viewports` 配置渲染差异化 UI: - teacher-portal / student-portal / parent-app / admin-console ### 2.4 六阶段里程碑总览 | 阶段 | 周期 | 核心交付 | 退出标准 | | ---------------- | ------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | | **P1 地基** | M1-M3 | 仓库骨架 + Docker 全量 infra + API Gateway 骨架 + 契约层 + CI/CD + 文档体系 + classes 域黄金模板服务 | classes 域 CRUD 端到端跑通 + 全横切关注点落地 + 30 分钟可复制新服务 | | **P2 身份** | M4-M6 | IAM 服务 + Teacher BFF(GraphQL) + 微前端骨架 | 教师可登录并看到空白 Dashboard | | **P3 核心教学** | M7-M10 | CoreEdu 服务 + Outbox 模式 + 考试/作业/成绩域 | 教师创建考试→学生作答→教师批改→成绩统计 全链路 | | **P4 内容+分析** | M11-M13 | Content 服务(Neo4j,CRUD only) + DataAna(Python+CH) + CDC 链路 | 知识图谱查询 + 学情诊断宽表 5s 内返回 | | **P5 沟通+AI** | M14-M16 | Msg 服务 + Push Gateway + AI 网关 + ES 题库检索 | 全校广播推送 + AI 辅助出题 + 题库检索 < 200ms | | **P6 硬化** | M17-M18 | Service Mesh + 全链路可观测 + 生产硬化 | 单服务可独立扩缩容 + 99.9% 可用性 | ### 2.5 新仓库目录结构 ``` next-edu-cloud/ # 新独立仓库 ├─ .github/workflows/ # CI/CD(每服务独立 workflow) ├─ docs/ │ ├─ architecture/ │ │ ├─ 0010_architecture.md # 从旧仓库迁移的理想蓝图 │ │ ├─ 004_architecture_impact_map.md # 架构设计意图(多服务版) │ │ ├─ roadmap/ # 长远规划 │ │ └─ audit/ # 架构审查报告 │ ├─ modules/ # 各服务 README(每个服务一份) │ ├─ standards/ # 编码规范(按语言分) │ ├─ troubleshooting/ # known-issues 索引 │ └─ superpowers/specs/ # 设计 spec ├─ packages/ # 共享包 │ ├─ shared-types/ # TS 共享类型(protobuf 生成) │ ├─ shared-proto/ # protobuf 契约源 │ └─ shared-go/ # Go 共享库 ├─ services/ # 领域微服务 │ ├─ api-gateway/ # Go │ ├─ push-gateway/ # Go │ ├─ iam/ # TS/NestJS │ ├─ core-edu/ # TS/NestJS │ ├─ content/ # TS/NestJS │ ├─ data-ana/ # Python/FastAPI │ ├─ messaging/ # TS/NestJS │ └─ ai-gateway/ # Python/FastAPI ├─ bff/ # BFF 层 │ ├─ teacher-bff/ │ ├─ student-bff/ │ └─ parent-bff/ ├─ apps/ # 微前端应用 │ ├─ teacher-portal/ │ ├─ student-portal/ │ ├─ parent-app/ │ └─ admin-console/ ├─ infra/ # 基础设施编排 │ ├─ docker-compose.yml # 本地全量 infra │ ├─ docker-compose.minimal.yml # 最小开发集 │ └─ k8s/ # K8s 清单(P6 阶段) ├─ scripts/ # 工具脚本 │ ├─ arch-scan/ # arch.db 扫描器(多语言) │ └─ arch-query/ # arch.db 查询 ├─ arch.db # 架构元数据库(多语言扩展) ├─ package.json # monorepo 根(pnpm workspace) ├─ pnpm-workspace.yaml ├─ go.work # Go workspace └─ pyproject.toml # Python workspace(uv/poetry) ``` ### 2.6 与现有 Next.js 项目的关系 | 维度 | 关系 | | -------- | ------------------------------------------------------------------------------------------------------------- | | 代码 | **不迁移**。新仓库从零开始,旧 schema 仅作领域知识参考 | | 数据库 | **不共享**。新系统全新 schema,未来通过 CDC/ETL 迁移数据 | | 文档体系 | **移植并扩展**:004 模板、arch.db 扫描器、模块 README 模板、known-issues 索引格式全部迁移,扩展支持 Go/Python | | 项目规则 | **移植 project_rules.md** 并按多语言/微服务特性调整 | | Git 管理 | 新独立仓库,独立分支策略,但提交规范(Conventional Commits)延续 | --- ## 3. P1 地基阶段详细设计 ### 3.1 P1 范围与不做清单 **做**: - 新仓库初始化(独立 git 仓库,独立分支策略) - 多语言 monorepo 骨架(pnpm + go.work + pyproject) - Docker Compose 全量基础设施(一次性到位) - API Gateway 骨架(Go,仅路由+鉴权转发,不做限流高级功能) - 契约层(protobuf + OpenAPI,先定义 classes 域契约) - CI/CD 骨架(每语言独立 workflow,lint+test+build) - 文档体系移植(004 模板 / arch.db 多语言扫描器 / 模块 README 模板 / project_rules 多语言版) - **classes 域黄金模板服务**(完整实现所有横切关注点,作为后续服务复制范本) **不做**(P1 严格禁止,避免膨胀): - 不实现 IAM 服务(P1 用 Gateway 内置最小鉴权,P2 才建 IAM 服务) - 不实现 Outbox/Kafka/CDC(P1 classes 域直接 CRUD MySQL) - 不实现 BFF/微前端完整骨架(P1 用单一测试页验证链路) - 不实现 ClickHouse/Neo4j/ES 的业务逻辑(仅 docker-compose 起容器备用) - 不实现任何复杂业务逻辑(classes 域仅 CRUD) - 不预实现阶段特有模式(Outbox/CDC/长连接在对应阶段实现后回写黄金模板) ### 3.2 P1 目录骨架(实际创建) ``` next-edu-cloud/ ├─ .github/workflows/ │ ├─ ci-go.yml # Go: lint+test+build │ ├─ ci-ts.yml # TS: lint+tsc+test │ └─ ci-py.yml # Python: ruff+pytest ├─ docs/ │ ├─ architecture/ │ │ ├─ 0010_architecture.md # 迁移自旧仓库 │ │ ├─ 004_architecture_impact_map.md # 架构设计意图(多服务版) │ │ ├─ roadmap/ # tech-debt / decoupling / pending-features │ │ └─ audit/ │ ├─ modules/ # 各服务 README │ ├─ standards/ │ │ ├─ coding-standards.md # 多语言编码规范 │ │ └─ git-workflow.md # 分支策略 + Conventional Commits │ ├─ troubleshooting/known-issues.md │ └─ superpowers/specs/ ├─ packages/ │ ├─ shared-proto/ # protobuf 契约源 + 生成脚本 │ │ ├─ proto/classes.proto │ │ └─ buf.yaml │ ├─ shared-ts/ # TS 共享类型(从 proto 生成) │ └─ shared-go/ # Go 共享库 ├─ services/ │ ├─ api-gateway/ # Go: 仅路由+鉴权转发 │ │ ├─ main.go │ │ ├─ go.mod │ │ └─ Dockerfile │ └─ classes/ # TS/NestJS 黄金模板服务 │ ├─ src/ │ │ ├─ main.ts # NestJS bootstrap + OTel 初始化 │ │ ├─ app.module.ts │ │ ├─ config/ │ │ │ ├─ config.ts # 三层配置加载 │ │ │ └─ env.ts # @t3-oss/env-nextjs 校验 │ │ ├─ middleware/ │ │ │ ├─ auth.middleware.ts # JWT 公钥校验 │ │ │ ├─ permission.guard.ts # requirePermission() │ │ │ └─ data-scope.interceptor.ts # DataScope 注入 │ │ ├─ classes/ │ │ │ ├─ classes.controller.ts # gRPC handler │ │ │ ├─ classes.service.ts # 业务编排 │ │ │ ├─ classes.repository.ts # 数据访问(Drizzle) │ │ │ └─ classes.dto.ts # 从 proto 生成 │ │ ├─ shared/ │ │ │ ├─ errors/ # ApplicationError 基类 + 子类 │ │ │ ├─ observability/ # logger/metrics/tracer │ │ │ └─ i18n/ # 错误码 → key 映射 │ │ └─ generated/ # proto 生成代码 │ ├─ test/ │ │ ├─ unit/ # vitest 单元测试 │ │ ├─ integration/ # Testcontainers 集成测试 │ │ ├─ contract/ # Pact 契约测试 │ │ └─ e2e/ # Playwright E2E │ ├─ Dockerfile # 多阶段构建模板 │ ├─ nest-cli.json │ ├─ tsconfig.json │ ├─ vitest.config.ts │ └─ README.md # 8 章模板(黄金范本) ├─ bff/ │ └─ teacher-bff/ # P1 仅占位,P2 实现 ├─ apps/ │ └─ teacher-portal/ # P1 仅一个测试页验证链路 │ ├─ package.json │ └─ src/ ├─ infra/ │ ├─ docker-compose.yml # 全量基础设施 │ ├─ docker-compose.minimal.yml # 仅 MySQL+Redis(开发最小集) │ └─ init-sql/ # MySQL 初始化脚本 ├─ scripts/ │ ├─ arch-scan/ # 多语言 arch.db 扫描器 │ └─ arch-query/ ├─ .commitlintrc.js ├─ .husky/ ├─ arch.db ├─ package.json # pnpm workspace 根 ├─ pnpm-workspace.yaml ├─ go.work ├─ pyproject.toml ├─ LICENSE ├─ CHANGELOG.md ├─ CONTRIBUTING.md ├─ SECURITY.md └─ .env.example ``` ### 3.3 Docker Compose 全量基础设施 一次性起齐所有容器,业务逻辑按阶段填入。最小开发集(`docker-compose.minimal.yml`)仅 mysql + redis,用于日常开发快速启动。 P1 仅启动 MySQL + Redis;P3 加 Kafka + Zookeeper;P4 加 Debezium + ClickHouse + Neo4j;P5 加 Elasticsearch;P6 加 Consul + Istio。每服务配置 `mem_limit` 避免单服务吃满内存。 ### 3.4 契约层设计 P1 用 **protobuf 作为服务间契约的唯一源**,OpenAPI 作为 BFF 对前端的契约: ``` packages/shared-proto/ ├─ proto/ │ ├─ classes.proto # P1 唯一契约 │ ├─ iam.proto # P2 占位 │ └─ core_edu.proto # P3 占位 ├─ buf.yaml # buf 工具配置(lint+breaking change 检测) ├─ buf.gen.yaml # 代码生成配置(TS+Go+Python 三端) └─ README.md ``` **契约先行的硬约束**: - 任何服务间通信必须先改 proto,CI 检测 breaking change 阻止违规合并 - proto 版本化:包名带版本(`classes.v1`、`classes.v2`),新旧版本共存 - 生成三端代码:`shared-ts/`(NestJS 用)、`shared-go/`(Gateway 用)、`services/*/generated/`(Python 用) ### 3.5 API Gateway 骨架(Go) P1 仅实现:路由 + JWT 校验 + 转发。不做限流/熔断/灰度(P6 硬化)。 **P1 鉴权**:Gateway 内置最小 JWT 校验(HS256 + 用户 ID + 角色列表),P2 由 IAM 服务接管签发(RS256)。P1 用测试 JWT 工具生成 token 验证链路。 ### 3.6 classes 域黄金模板服务 P1 末尾用 classes 域端到端验证地基。classes 服务不再只是"验证链路",而是**完整实现所有横切关注点**,作为后续 8 个服务的复制模板: | 横切关注点 | classes 黄金模板实现 | 后续服务复用方式 | | ---------- | ----------------------------------------------------------------------- | ------------------------- | | 错误处理 | TS `ApplicationError` 基类 + 错误码 `CORE_EDU_*` | 复制基类,改错误码前缀 | | 可观测 | pino 结构化日志 + prom-client metrics + OTel trace | 复制 SDK 初始化代码 | | 安全 | JWT 公钥校验 + `requirePermission()` 中间件 + DataScope 过滤 | 复制中间件 | | 契约 | classes.proto + buf lint/breaking + 三端代码生成 | 复制 buf 配置,加新 proto | | 测试 | 单元(vitest)+ 集成(Testcontainers)+ 契约(Pact)+ E2E(Playwright) | 复制测试目录结构与配置 | | 文档 | 模块 README 8 章模板 + arch.db 扫描 + known-issues 条目 | 复制 README 模板 | | 配置 | 三层配置(env/yaml/默认值)+ `@t3-oss/env-nextjs` | 复制配置加载代码 | | i18n | 错误码 → i18n key 映射 | 复制映射表结构 | | CI/CD | Go/TS/Python 三语言 workflow 模板 | 复制 workflow,改服务名 | | Dockerfile | 多阶段构建模板 | 复制 Dockerfile,改入口 | **后续服务复制流程**: 1. `cp -r services/classes services/iam` 2. 改错误码前缀 `CORE_EDU → IAM` 3. 改 proto 文件 `iam.proto` 4. 改业务逻辑(controller/service/repository) 5. 改 README 模块名与架构图 6. 改 CI workflow 服务名 7. 改 Dockerfile 入口(如需要) 8. 运行 `npm run arch:scan` 确认 arch.db 更新 9. 运行 `buf lint` + `buf breaking` 确认契约合规 **Outbox/CDC/长连接等阶段特有模式**:在对应阶段实现后**回写黄金模板**(在 classes 服务的 README 增加章节示例),后续服务复制时即包含。 ### 3.7 P1 Git 管理策略 **分支策略**(trunk-based 简化版,适合 1 人 + AI): ``` main # 受保护,仅通过 PR 合入,始终可发布 ├─ feature/p1-repo-init # P1 仓库初始化 ├─ feature/p1-infra-compose # Docker Compose 基础设施 ├─ feature/p1-api-gateway-skel # Gateway 骨架 ├─ feature/p1-contract-classes # classes 契约 ├─ feature/p1-classes-service # classes 黄金模板服务 ├─ feature/p1-teacher-portal # 测试页 ├─ feature/p1-docs-system # 文档体系移植 └─ feature/p1-arch-scan-multilang # arch.db 多语言扫描器 ``` - 每个 feature 分支独立 PR,CI 通过后合入 main - main 始终保持可运行(`docker-compose up` 可起所有 infra) - 每阶段末打 tag:`v0.1.0-p1`、`v0.2.0-p2`... - commitlint 强制 Conventional Commits(与旧项目一致) ### 3.8 P1 退出标准(验收) | 维度 | 验收项 | | ---------- | ---------------------------------------------------------------------------------------------------- | | 基础设施 | `docker-compose up -d` 全量容器健康(P1 仅起 MySQL+Redis,其余容器配置就绪但不启动) | | 链路 | 浏览器创建班级 → MySQL 落库 → 列表显示 | | 横切关注点 | 全横切关注点落地:错误处理 + 可观测 + 安全 + 契约 + 测试 + 文档 + 配置 + i18n + CI + Dockerfile | | 契约 | `buf lint` + `buf breaking` 通过,三端代码生成成功 | | CI | 三语言 workflow 全绿(lint+test+build) | | 测试 | 单元 + 阈值集成 + 契约 + E2E 四类测试齐备,覆盖率达标(领域逻辑 ≥ 80%,Handler ≥ 60%,整体 ≥ 60%) | | 文档 | 004 + 2 个模块 README(api-gateway + classes)+ coding-standards + known-issues + project_rules 齐全 | | arch.db | `npm run arch:scan` 扫描 Go+TS 代码,`arch:query -- violations` 输出 0 | | 可复制性 | 新建一个空服务复制 classes 模板,30 分钟内可跑起来 | | Git | main 受保护,所有 feature 经 PR 合入,打 tag `v0.1.0-p1` | --- ## 4. P2-P6 各阶段详细设计 ### 4.1 P2 身份层(M4-M6) **目标**:建 IAM 服务,替换 P1 Gateway 内置最小鉴权;建首个完整 BFF(Teacher)与微前端骨架。 **交付物**: | 组件 | 内容 | |------|------| | IAM 服务(TS/NestJS) | 认证(登录/登出/JWT/2FA)+ RBAC(角色/权限/角色-权限 CRUD)+ 视口配置(4 层模型)+ DataScope 解析 + `getEffectivePermissions(userId)` API | | MySQL schema | `users` / `roles` / `permissions` / `role_permissions` / `role_viewports` / `parent_student_relations` / `class_subject_teachers`(DataScope 依赖) | | Teacher BFF(TS/GraphQL) | GraphQL Yoga + DataLoader(防 N+1)+ 调 IAM 的 `getEffectivePermissions` 注入视口到响应 | | teacher-portal(微前端宿主) | Module Federation 宿主 + 路由骨架 + 侧边栏(由 `viewports.L1` 驱动渲染)+ 登录页 | | API Gateway | 移除内置 JWT,改调 IAM 校验;路由表扩展 `/api/v1/iam/*` | **关键技术决策**: - JWT 由 IAM 签发(RS256,非对称),Gateway 用公钥校验,无需调 IAM 即可校验签名 - `getEffectivePermissions` 结果用 Redis 缓存(TTL 5 分钟),角色变更时主动失效 - 视口配置存 MySQL(`role_viewports` 表),不硬编码到前端 **退出标准**:教师登录 → 获取 JWT → 访问 teacher-portal → 侧边栏按 `viewports.L1` 渲染 → 看到空白 Dashboard 占位页。 ### 4.2 P3 核心教学层(M7-M10) **目标**:建 CoreEdu 服务,实现考试全生命周期;落地 Outbox + Kafka 事件模式。 **交付物**: | 组件 | 内容 | |------|------| | CoreEdu 服务(TS/NestJS) | 考试/作业/成绩域 CRUD + 批改业务编排 + Outbox 事件发布 | | MySQL schema | `exams` / `exam_questions` / `homework_assignments` / `homework_submissions` / `homework_answers` / `grade_records` / `outbox_events` | | Outbox 模式 | 业务事务同写 `outbox_events` 表;后台 relay worker 投递到 Kafka | | Kafka | 启用业务 topic:`exam.published` / `homework.graded` / `grade.recorded` | | Teacher BFF 扩展 | 考试/作业/成绩的 GraphQL 查询与 mutation | | teacher-portal 扩展 | 考试创建/作业批改/成绩查看页面 | | student-portal(微前端) | 学生作答作业页面(Module Federation 子应用) | | Temporal | 引入但仅做 1 个工作流(考试发布编排:创建作业→通知)作为试点 | **关键技术决策**: - **不引入 Saga**:跨服务一致性用 Outbox + 最终一致性,避免 Saga 复杂度 - **批改后联动**(沿用旧项目模式):批改完成 → 发 `homework.graded` 事件 → 各下游消费(P4 的 DataAna 消费、P5 的 Msg 消费通知) - Outbox relay worker 用 Go 写(轻量、高吞吐),独立服务 `services/outbox-relay/` - **Outbox 实现后回写黄金模板** **退出标准**:教师创建考试 → 发布 → 学生作答提交 → 教师批改 → 事件发到 Kafka → 成绩统计更新(CoreEdu 内部消费自己事件做统计)→ 全链路可观测(trace 追踪)。 ### 4.3 P4 内容与分析层(M11-M13) **目标**:建 Content 服务(Neo4j 知识图谱)+ DataAna 服务(Python+ClickHouse);落地 CDC 链路。 **交付物**: | 组件 | 内容 | |------|------| | Content 服务(TS/NestJS) | 教材/章节/知识点 CRUD(**仅 CRUD,不实现检索**)+ 知识图谱查询(调 Neo4j)+ 题库 CRUD(**不实现检索**) | | MySQL schema | `textbooks` / `chapters` / `knowledge_points` / `questions` | | Neo4j 数据 | 知识点前置依赖图(从 MySQL `knowledge_points` 同步) | | DataAna 服务(Python/FastAPI) | 学情诊断 API + 错题本 API + 消费 Kafka 构建宽表 | | ClickHouse | `student_dashboard_view` 宽表(由 DataAna 消费 Kafka 填充) | | CDC 链路 | Debezium 监听 MySQL binlog → Kafka(`mysql.cdc.*` topic)→ DataAna 消费写 ClickHouse | | BFF 扩展 | Teacher BFF 加知识图谱查询;Student BFF 加学情诊断查询(降级查 MySQL 主库 + 升级查 CH 宽表) | **关键技术决策**: - **题库检索延后到 P5**:P4 Content 服务题库只做 CRUD,P5 引入 ES 直接实现检索,避免 MySQL FULLTEXT → ES 迁移成本 - **双轨读策略**:实时性要求高的查 MySQL 主库(如刚提交的作业成绩),聚合统计查 ClickHouse 宽表(延迟 1-5s 可接受) - **Neo4j 写入**:Content 服务写 MySQL 同时发事件,独立 worker 消费事件同步 Neo4j(避免双写不一致) - **CDC 实现后回写黄金模板** **退出标准**:教师查看知识图谱前置依赖(Neo4j 秒级返回)→ 学生查看学情诊断(ClickHouse 宽表 5s 内返回)→ CDC 链路延迟 < 5s。 ### 4.4 P5 沟通与 AI 层(M14-M16) **目标**:建 Msg 服务 + Push Gateway + AI 网关;全文检索迁 ES。 **交付物**: | 组件 | 内容 | |------|------| | Msg 服务(TS/NestJS) | 会话/消息 CRUD + 调 Push Gateway 推送 + 通知偏好 | | Push Gateway(Go) | WebSocket 长连接管理 + 消费 Kafka 广播 + Redis PubSub 跨实例同步 | | AI 网关(Python/FastAPI) | LLM Provider 适配(OpenAI/Anthropic)+ Prompt 模板管理 + 流式 SSE + 用量计费 | | ES | 题库全文检索(从 MySQL 同步)+ 全局搜索 API | | Notifications 模块 | 沿用旧项目 dispatcher 模式,多渠道(站内/SMS/邮件/微信) | | BFF/前端扩展 | Teacher BFF 加 AI 辅助出题 mutation;teacher-portal 加 SSE 流式 AI 对话 | **关键技术决策**: - **Push Gateway 用 Go**:单节点支撑 10w+ 连接,业务服务只需发 Kafka 消息 - **AI 网关用 Python**:LLM SDK 生态(langchain/litellm)成熟,Prompt 版本管理友好 - **离线消息**:Push Gateway 仅推在线用户,离线消息存 MySQL,上线时拉取 - **流式 SSE**:AI 网关 → BFF → 前端,三层透传,BFF 不缓冲 - **长连接模式实现后回写黄金模板** **退出标准**:教师发广播通知 → 全在线学生实时收到(Push Gateway)→ AI 辅助出题流式返回 → 题库全文检索 < 200ms。 ### 4.5 P6 硬化层(M17-M18) **目标**:生产硬化,达到可部署状态。 **交付物**: | 组件 | 内容 | |------|------| | Service Mesh | Istio 服务网格(mTLS + 流量治理 + 可观测) | | 配置中心 | Consul 接入,配置热更新(限流阈值、功能开关) | | 全链路可观测 | OpenTelemetry + Jaeger(trace)+ Prometheus(metrics)+ Loki(logs) | | 限流/熔断 | Gateway 层限流(令牌桶)+ 服务间熔断(Envoy) | | 灰度发布 | Istio 流量拆分(金丝雀) | | K8s 部署 | 每服务 K8s manifest + HPA 自动扩缩容 | | 生产 CI/CD | Git tag 触发镜像构建 + 滚动部署 | | 灾备 | MySQL 主从 + Redis 哨兵 + Kafka 多副本 | **降级方案**:若 P6 时间紧张,Service Mesh 可降级为 K8s 原生 Service + Ingress,Istio 延后。 **退出标准**:单服务可独立扩缩容(HPA 生效)→ 全链路 trace 可追 → 模拟单服务宕机不影响核心链路 → 99.9% 可用性压测通过。 ### 4.6 阶段依赖与并行机会 ```mermaid graph LR P1[P1 地基] --> P2[P2 身份] P2 --> P3[P3 核心教学] P3 --> P4[P4 内容分析] P3 --> P5[P5 沟通AI] P4 --> P6[P6 硬化] P5 --> P6 ``` **并行机会**:P4 与 P5 理论上可并行(都依赖 P3 的事件),但 1 人项目建议串行避免上下文切换。 ### 4.7 跨阶段不变约束 每阶段都必须遵守: - 契约先行(先改 proto,后写实现) - 文档同步(004 + 模块 README + arch.db + known-issues 实时更新) - CI 全绿才能合入 main - 每阶段末打 tag - Server/Handler 接口必须权限校验 - 单文件行数遵循语言规范(TS ≤ 500/800/1000,Go ≤ 800,Python ≤ 800) --- ## 5. 跨阶段横切关注点 ### 5.1 错误处理与响应规范 #### 5.1.1 错误分类体系 ```mermaid graph TB subgraph Domain["领域错误(业务可预期)"] ValErr[ValidationError
400] NotFound[NotFoundError
404] PermErr[PermissionDeniedError
403] Conflict[ConflictError
409] BizErr[BusinessError
400] end subgraph Infra["基础设施错误(非预期)"] DBErr[DatabaseError
500] UpstreamErr[UpstreamServiceError
502] TimeoutErr[TimeoutError
504] InternalErr[InternalError
500] end subgraph Contract["契约错误"] ProtoErr[ContractViolationError
500] SerialErr[SerializationError
400] end ``` **统一错误基类**(每语言一份,从 proto 生成): - TS:`ApplicationError` 基类 + 子类 - Go:`AppError` struct + 错误码常量 - Python:`AppError` 异常基类 + 子类 **错误码规范**:`{服务前缀}_{错误类型}_{资源}`,如 `IAM_PERM_USER`、`CORE_EDU_VAL_EXAM`。错误码在 proto 中定义,三端共享。 #### 5.1.2 响应信封(统一跨服务) 所有 HTTP/GraphQL/gRPC 响应统一信封: ```typescript interface Result { success: boolean data?: T error?: { code: string // IAM_PERM_USER message: string // 用户可读消息(i18n key) details?: unknown // 字段级错误详情 traceId: string // 链路追踪 ID } } ``` - gRPC 用 `google.rpc.Status` + `details` 承载业务错误 - HTTP/Gateway 层做 gRPC Status → HTTP 状态码映射 - BFF/GraphQL 用 `union` 类型表达错误 ### 5.2 可观测性三支柱 P1 即建立基础,每阶段强化: | 支柱 | P1 基础 | P6 硬化 | | ----------- | ---------------------------------------------------- | ---------------------------- | | **Logs** | 结构化 JSON 日志(pino/winston/zap)+ `traceId` 注入 | Loki 集中查询 + 日志保留策略 | | **Metrics** | Prometheus client 暴露 `/metrics`(QPS/延迟/错误率) | Grafana 仪表盘 + 告警规则 | | **Traces** | OpenTelemetry SDK 注入 trace(Gateway→服务→DB) | Jaeger 全链路追踪 + 采样策略 | **P1 最小可观测集**(不引入完整栈,但 SDK 注入到位): - 每服务结构化日志,含 `traceId`/`spanId`/`userId`/`service` - 每服务暴露 `/metrics` endpoint - OpenTelemetry SDK 初始化,trace 上下文跨服务传播(W3C TraceContext header) **P6 引入完整后端**:Loki + Grafana + Jaeger + Prometheus,通过 docker-compose 起齐。 ### 5.3 安全架构 #### 5.3.1 认证链路 ```mermaid sequenceDiagram participant C as Client participant GW as API Gateway participant IAM as IAM 服务 participant Svc as 业务服务 participant DB as MySQL C->>IAM: 登录(credentials + 2FA) IAM->>DB: 验证密码 + 2FA IAM->>DB: 查角色 + 权限 + 视口 IAM->>IAM: 签发 JWT(RS256) IAM-->>C: JWT + refreshToken C->>GW: 请求 + JWT GW->>GW: 公钥验签 JWT GW->>GW: 检查路由权限位图 alt 权限不足 GW-->>C: 403 else 通过 GW->>Svc: 转发 + 注入 x-user-context Svc->>Svc: requirePermission(perm) Svc->>DB: 执行(带 DataScope 过滤) end ``` **关键安全决策**: - JWT 用 RS256(非对称),IAM 私钥签发,Gateway/服务用公钥校验,无需调 IAM - JWT payload:`{ userId, roles, permissions(bitmap), dataScope, exp }` - Token TTL:access 15min / refresh 7day,refresh 用 Redis 黑名单失效 - 破坏性操作独立权限点(如 `AUDIT_LOG_PURGE` ≠ `AUDIT_LOG_READ`,沿用旧项目规则) #### 5.3.2 数据范围过滤(DataScope) 沿用旧项目 6 级 DataScope,扩展为 IAM 服务统一解析: | 类型 | 适用角色 | 数据范围 | | --------------- | --------------------- | -------- | | `all` | admin | 全部 | | `grade_managed` | grade_head / 教导主任 | 管辖年级 | | `class_taught` | teacher / 教研组长 | 所教班级 | | `class_members` | student | 所在班级 | | `children` | parent | 关联孩子 | | `owned` | 所有角色 | 自己创建 | DataScope 由 IAM 解析后注入 JWT,业务服务读取后下推到 SQL WHERE 条件。 #### 5.3.3 其他安全约束 - 服务间通信:P1-P5 用明文 gRPC(内网信任),P6 引入 mTLS - 环境变量:用 `@t3-oss/env-nextjs`(TS)+ `viper`(Go)+ `pydantic-settings`(Python)校验 - 密钥管理:P1-P5 用 `.env` + docker secrets,P6 引入 Vault - SQL 注入:ORM 参数化查询(Drizzle/GORM/SQLAlchemy),禁止字符串拼接 - XSS:微前端用 React 默认转义 + CSP header - 速率限制:P1 Gateway 基础限流,P6 引入 Envoy 全局限流 ### 5.4 测试策略 #### 5.4.1 测试金字塔 ```mermaid graph TB subgraph E2E["E2E 测试(< 10%)"] Playwright[Playwright
关键用户旅程] end subgraph Integ["集成测试(30%)"] Contract[契约测试
Pact + proto] Service[服务集成
Testcontainers] end subgraph Unit["单元测试(60%)"] Domain[领域逻辑
纯函数] Handler[Handler/Controller] end Unit --> Integ --> E2E ``` #### 5.4.2 各阶段测试要求 | 阶段 | 单元测试 | 集成测试 | E2E | | ---- | --------------------------- | ---------------------- | -------------- | | P1 | arch-scan 工具链 | classes 切片契约测试 | 浏览器创建班级 | | P2 | IAM 权限解析逻辑 | IAM→Gateway 契约 | 登录流程 | | P3 | 批改业务逻辑 + Outbox relay | CoreEdu→Kafka 事件契约 | 考试全生命周期 | | P4 | 知识图谱查询 + 学情分析 | CDC 链路验证 | 学情诊断展示 | | P5 | Push 连接管理 + AI Prompt | Msg→Push 事件契约 | 广播 + AI 对话 | | P6 | - | 全链路压测 | 灾备演练 | #### 5.4.3 覆盖率门槛 | 层级 | 覆盖率要求 | | ----------------------- | ---------- | | 领域逻辑(纯函数) | ≥ 80% | | 服务 Handler/Controller | ≥ 60% | | 基础设施代码 | ≥ 40% | | 整体 | ≥ 60% | CI 在 lint → test 后强制检查覆盖率,低于门槛阻断合并。 #### 5.4.4 契约测试(关键) 服务间通信用 proto 契约,**契约测试是集成测试核心**: - `packages/shared-proto/` 用 `buf breaking` 检测 breaking change - 消费端驱动契约测试(Pact):消费端定义期望,提供端验证 - P3 起每事件类型有契约测试(`homework.graded` 事件的 schema 验证) ### 5.5 i18n 策略 沿用旧项目 next-intl 模式,扩展到多服务: - 前端:next-intl(微前端共享翻译资源包) - 后端错误消息:错误码 → i18n key 映射,前端翻译 - BFF/服务不返回翻译后文本,返回 i18n key + 参数 ### 5.6 配置管理 **三层配置**: 1. **环境变量**(`.env` / docker secrets):基础设施连接、密钥 2. **配置文件**(`config/{env}.yaml`):业务参数(限流阈值、功能开关静态默认) 3. **配置中心**(Consul,P6 启用):运行时热更新参数 每服务启动时合并三层:默认值 < 配置文件 < 环境变量 < 配置中心(P6)。 --- ## 6. 文档体系与 arch.db 多语言扩展 ### 6.1 文档体系全景 ```mermaid graph TB subgraph Design["架构设计文档(设计意图)"] Doc004[004_architecture_impact_map.md
多服务版架构设计意图] Doc0010[0010_architecture.md
理想蓝图(迁移)] end subgraph Code["代码结构文档(arch.db)"] ArchDB[arch.db
多语言代码元数据] ArchScan[arch-scan
TS+Go+Python 扫描器] ArchQuery[arch-query
违规检测/依赖查询] end subgraph Module["模块文档(服务级)"] ModuleReadme[docs/modules/{service}/README.md
8 章模板] end subgraph Experience["经验文档"] KnownIssues[known-issues.md
索引式场景→技术映射] WorkLog[工作经验日志
50 条上限] end subgraph Standards["规范文档"] Coding[coding-standards.md
多语言编码规范] GitWF[git-workflow.md
分支/提交规范] ProjectRules[project_rules.md
AI 工作强制流程] end subgraph Planning["规划文档"] Roadmap[roadmap/
tech-debt/decoupling/pending] Specs[superpowers/specs/
设计 spec] end Design --> Code Code --> Module Module --> Experience Standards --> Code Planning --> Design ``` **文档分层原则**(与旧项目一致): - **设计意图**(004)与**代码现状**(arch.db)分离互补 - **模块文档**(README)是服务级入口 - **经验文档**(known-issues)是索引式速查 - **规范文档**强制 AI 与人类工作流程 ### 6.2 004 架构设计文档(多服务版) 移植旧 004 模板,扩展为多服务架构。目录结构: ``` 004_architecture_impact_map.md ├─ 1. 项目概览(系统边界 + 规模指标) ├─ 2. 技术栈选型(按语言分节:Go/TS/Python) ├─ 3. 分层架构(Client → Edge → Service → Bus → Storage → Infra) ├─ 4. 服务依赖全景图(mermaid + 依赖深度统计) ├─ 5. 认证与权限架构(IAM + RS256 JWT + 视口 4 层模型 + DataScope) ├─ 6. 数据访问与缓存架构(CQRS + Outbox + CDC + 双轨读) ├─ 7. 事件驱动架构(Kafka topic 清单 + 事件 schema 约定) ├─ 8. 跨服务协作机制(gRPC 契约 + Outbox 事件 + Temporal 编排) ├─ 9. 核心业务流程(考试全生命周期等,跨服务 sequence diagram) ├─ 10. 可观测性架构(Logs/Metrics/Traces 三支柱) ├─ 11. API 与实时通信(Gateway 路由 + SSE + Push Gateway) ├─ 12. 架构约束与设计原则(多语言版硬性约束) ├─ 13. 架构决策记录(ADR) └─ 14. 附录(arch.db 查询入口 + 关键参数影响链) ``` **与旧 004 的差异**: - 第 3 章从"三层架构"扩展为"六层架构"(Client/Edge/Service/Bus/Storage/Infra) - 新增第 7 章"事件驱动架构"(旧项目无此章) - 第 8 章从"跨模块协作"扩展为"跨服务协作"(含 gRPC 契约 + Temporal 编排) - 新增第 10 章"可观测性架构" ### 6.3 模块 README 8 章模板(多服务版) 沿用旧项目 8 章模板,适配微服务特性。每个服务一份 README: ``` docs/modules/{service}/README.md ├─ 1. 模块职责(一句话 + 边界) ├─ 2. 技术栈(语言/框架/依赖) ├─ 3. 架构图(mermaid graph TB:服务内部组件) ├─ 4. 核心流程图(mermaid sequenceDiagram:关键业务流程) ├─ 5. 对外契约(proto 文件 + gRPC 方法清单 + 事件 topic) ├─ 6. 依赖关系(上游依赖服务 + 下游被依赖 + 数据库/中间件) ├─ 7. 架构约束(服务特有约束 + 横切关注点落地方式) └─ 8. 架构决策(服务特有 ADR + 黄金模板复用清单) ``` **黄金模板服务(classes)README 是范本**,后续服务复制后修改第 1/3/4/5/6 章,第 2/7/8 章大部分复用。 ### 6.4 arch.db 多语言扩展(关键改造) 旧 arch-scan 仅支持 TS。新扫描器扩展支持 Go + Python,统一写入 arch.db。 #### 6.4.1 arch.db schema 扩展 ```sql -- 新增 language 字段 ALTER TABLE symbols ADD COLUMN language TEXT; -- 'ts' | 'go' | 'python' ALTER TABLE modules ADD COLUMN language TEXT; -- 新增 service 字段(微服务标识) ALTER TABLE modules ADD COLUMN service TEXT; -- 'api-gateway' | 'iam' | 'core-edu' | ... -- 新增 contract 字段(proto 契约) CREATE TABLE contracts ( id INTEGER PRIMARY KEY, proto_file TEXT, service_name TEXT, method_name TEXT, request_type TEXT, response_type TEXT, breaking_change BOOLEAN DEFAULT 0 ); -- 新增 event 字段(Kafka 事件) CREATE TABLE events ( id INTEGER PRIMARY KEY, topic TEXT, event_type TEXT, -- 'domain' | 'cdc' producer_service TEXT, consumer_services TEXT, -- JSON array schema_proto TEXT ); ``` #### 6.4.2 多语言扫描器架构 ``` scripts/arch-scan/ ├─ scanner.ts # 主入口(协调三语言扫描) ├─ scanners/ │ ├─ ts-scanner.ts # TS 扫描(沿用旧版,ts-morph) │ ├─ go-scanner.ts # Go 扫描(tree-sitter-go) │ └─ py-scanner.ts # Python 扫描(tree-sitter-python) ├─ proto-scanner.ts # proto 契约扫描(buf) ├─ query.ts # 查询命令(沿用旧版,扩展新表) └─ arch.db # 统一元数据库 ``` **Go 扫描方案**:用 `tree-sitter-go`(Node.js 绑定)解析 Go AST,提取函数/方法/类型/接口/import。 **Python 扫描方案**:用 `tree-sitter-python` 提取函数/类/方法/import。 #### 6.4.3 查询命令扩展 ```bash # 沿用旧命令 npm run arch:scan # 全量扫描 npm run arch:query -- sql "" # 自定义 SQL npm run arch:query -- module # 模块依赖 npm run arch:query -- violations # 架构违规 # 新增命令 npm run arch:query -- service # 服务级依赖 npm run arch:query -- contracts # proto 契约清单 npm run arch:query -- breaking-changes # 契约 breaking change 检测 npm run arch:query -- events # Kafka 事件清单 npm run arch:query -- event-flow # 事件生产者→消费者链路 npm run arch:query -- cross-lang-deps # 跨语言调用(如 Gateway 调 TS 服务) ``` #### 6.4.4 架构违规检测规则(多语言版) | 违规类型 | 检测方式 | 适用语言 | | -------------------------------- | ------------------------------------ | ----------------------------------- | | 服务间直连数据库(绕过对方 API) | 扫描 import + DB 连接配置 | TS/Go/Python | | 契约 breaking change 未升级版本 | buf breaking + arch.db 比对 | proto | | 事件 schema 不一致 | proto 扫描 vs 事件生产者/消费者 | proto | | 跨服务循环依赖 | 服务依赖图环检测 | 全部 | | 单文件超长 | 行数统计 | TS≤500/800/1000, Go≤800, Python≤800 | | Server/Handler 缺权限校验 | 扫描 requirePermission 装饰器/中间件 | TS/Go/Python | | 硬编码密钥/密码 | 正则扫描 | 全部 | | 跨语言类型不一致 | proto 生成类型 vs 实际使用 | TS/Go/Python | ### 6.5 project_rules.md(多语言版) 移植旧 project_rules.md,扩展多语言/微服务规则: ``` project_rules.md ├─ 1. 架构图优先规则(arch.db 先行) ├─ 2. arch.db 元数据库规则(多语言扫描) ├─ 3. 编码规范(TS/Go/Python 分节) │ ├─ 3.1 代码质量规则(行数/错误处理/日志) │ ├─ 3.2 架构分层规则(服务边界/gRPC 契约) │ ├─ 3.3 服务标准结构(黄金模板复制) │ ├─ 3.4 TypeScript 规则(沿用旧版) │ ├─ 3.5 Go 规则(新增:error 处理/接口设计/包结构) │ ├─ 3.6 Python 规则(新增:类型注解/FastAPI 规范) │ ├─ 3.7 命名规范(多语言) │ ├─ 3.8 契约规范(proto 先行/buf 校验) │ └─ 3.9 安全规范(JWT/DataScope/SQL 注入) ├─ 4. 提交规范(Conventional Commits + 多语言 scope) ├─ 5. 问题记录规则(known-issues 索引式) └─ 6. AI 工作强制流程(多语言版上下文加载/执行/经验沉淀) ``` ### 6.6 known-issues.md(多语言索引) 沿用旧项目索引式格式,扩展多语言/微服务分区: ``` known-issues.md ├─ 全局经验 │ ├─ Next.js 配置与运行时(旧项目迁移) │ ├─ Go 服务开发(新增) │ ├─ Python 服务开发(新增) │ ├─ Docker Compose 本地基础设施(新增) │ ├─ Kafka 事件总线(新增) │ ├─ gRPC 契约管理(新增) │ └─ 多语言 arch.db 扫描(新增) ├─ 模块经验 │ ├─ api-gateway(Go) │ ├─ iam(TS) │ ├─ classes(TS,黄金模板) │ ├─ ... └─ 工作经验日志(50 条上限,按时间倒序) ``` ### 6.7 文档同步强制流程(与旧项目等价) **改码必同步图**(强制): 1. 修改源码后运行 `npm run arch:scan` 更新 arch.db 2. 若架构设计意图变化,更新 004 3. 若服务接口/事件变化,更新模块 README 第 5 章 4. 若发现新"场景→技术"映射,更新 known-issues 5. 若新加横切关注点模式,回写黄金模板 **需要同步的场景**(扩展多语言): - 新增/删除/重命名导出函数、组件、Hook、类型(TS/Go/Python) - 修改函数签名(参数、返回类型) - 修改权限点或角色-权限映射 - 新增/删除数据库表 - 新增/删除 gRPC 方法或 proto message - 新增/删除 Kafka topic 或事件类型 - 修改服务间依赖关系 - 新增服务 ### 6.8 P1 文档交付清单 P1 阶段必须交付的文档(黄金模板范本): | 文档 | 状态 | 来源 | | ------------------------------------------------------------------------------- | --------------------- | --------------------- | | `004_architecture_impact_map.md` | 多服务版骨架(14 章) | 旧 004 扩展 | | `0010_architecture.md` | 迁移自旧仓库 | 直接复制 | | `docs/modules/api-gateway/README.md` | 8 章完整 | 黄金范本(Go) | | `docs/modules/classes/README.md` | 8 章完整 | 黄金范本(TS) | | `docs/standards/coding-standards.md` | 多语言版 | 旧规范扩展 | | `docs/standards/git-workflow.md` | 分支策略 + commitlint | 旧 CONTRIBUTING 扩展 | | `docs/troubleshooting/known-issues.md` | 索引式骨架 | 旧模板扩展 | | `project_rules.md` | 多语言版 | 旧 project_rules 扩展 | | `arch.db` | 多语言扫描器 | 旧 arch-scan 扩展 | | `LICENSE` / `CHANGELOG.md` / `CONTRIBUTING.md` / `SECURITY.md` / `.env.example` | 大仓标配 | 旧项目已有 | --- ## 7. 技术风险与缓解策略 ### 7.1 人员风险 #### R1: 1 人瓶颈(高风险) **表现**:单点故障(生病/倦怠/上下文丢失),18 个月周期长,知识遗忘风险。 **缓解**: - **文档即记忆**:004 + 模块 README + known-issues 工作日志必须实时更新,AI 可从文档恢复上下文 - **小里程碑**:每 2-4 周一个可验证交付物,避免长周期失焦 - **黄金模板**:复制而非重写,降低单服务工作量 - **arch.db 即上下文**:每次开工先 `arch:scan` + `arch:query`,AI 快速恢复全局认知 - **分支策略**:feature 分支短生命周期(< 1 周),避免长期分支合并冲突 #### R2: AI 生成质量(中风险) **表现**:多语言生成质量参差(Go/Python 可能弱于 TS),跨语言类型不一致,幻觉 API。 **缓解**: - **契约先行强制**:proto 定义唯一源,AI 生成代码必须基于 proto,CI 用 buf breaking 拦截 - **黄金模板约束**:AI 复制模板而非自由生成,降低幻觉空间 - **每语言单独验证**:Go/Python 代码生成后必须 `go vet` / `ruff` + 单元测试通过 - **arch:scan 验证**:每次 AI 生成后跑 `arch:query -- violations`,拦截架构违规 - **小步生成**:单次 AI 生成不超过一个服务的一个模块,便于 review ### 7.2 技术风险 #### R3: 多语言工具链复杂度(高风险) **表现**:3 语言 × 3 套工具链 × 3 套 CI,维护成本 3 倍。 **缓解**: - **统一 monorepo 工具链**:pnpm workspace 统一入口,`package.json` scripts 封装多语言命令 - **共享 arch.db**:统一元数据,避免三套文档体系 - **共享契约**:proto 生成三端代码,类型一致性由工具保证 - **CI 模板复用**:三语言 CI workflow 模板化,仅改服务名 - **Dockerfile 模板**:多阶段构建模板复用 - **限制依赖**:每语言限制框架数量(TS=NestJS+Drizzle,Go=Gin+GORM,Python=FastAPI+SQLAlchemy) #### R4: 分布式系统复杂度(高风险) **表现**:服务发现/负载均衡/分布式事务/链路追踪/熔断降级,1 人难以驾驭。 **缓解**: - **P1-P5 单机 Docker**:不引入 K8s,docker-compose 内网信任,简化网络 - **P6 才上 Service Mesh**:Istio 接管网络治理,业务代码无感知 - **最终一致性优先**:Outbox + 事件,避免分布式事务(2PC/Saga) - **双轨读降级**:实时查主库 + 聚合查宽表,CH 故障降级查 MySQL - **P3 Outbox 试点**:仅 CoreEdu 用 Outbox,验证后再推广 - **可观测先行**:P1 即注入 OTel SDK,问题可追溯 #### R5: 契约管理(中风险) **表现**:proto breaking change 导致消费端故障,版本管理混乱。 **缓解**: - **buf breaking CI 强制**:PR 阶段检测 breaking change,必须升版本号 - **proto 版本化**:包名带版本(`classes.v1`、`classes.v2`),新旧版本共存 - **契约测试(Pact)**:消费端驱动,黄金模板即包含 Pact 配置 - **单一契约源**:所有服务间通信必须经 proto,禁止 REST/gRPC 混用 - **事件 schema 版本化**:Kafka 事件带 `schema_version` 字段,消费端按版本处理 #### R6: 数据一致性(中风险) **表现**:Outbox relay 故障导致事件丢失;CDC 延迟导致宽表数据滞后;Neo4j 与 MySQL 双写不一致。 **缓解**: - **Outbox relay 高可用**:P3 单实例够用,P6 多实例 + 幂等消费 - **CDC 延迟监控**:Debezium 暴露 lag metrics,超阈值告警 - **双写避免**:Neo4j/ES 不直接双写,由消费 Kafka 事件同步,天然最终一致 - **幂等消费**:所有事件消费者必须幂等(基于 event_id 去重) - **对账机制**:P6 引入定期对账任务(MySQL 主库 vs CH 宽表 vs Neo4j) ### 7.3 范围风险 #### R7: 范围蔓延(高风险) **表现**:每阶段"顺便加一点",18 个月变 24 个月。 **缓解**: - **阶段退出标准硬约束**:每阶段退出标准必须全部满足才进入下一阶段 - **不做清单**:每阶段明确定义"不做"项,记入 spec - **tech-debt 兜底**:发现的新需求记入 `roadmap/tech-debt.md`,不在当前阶段实现 - **月度回顾**:每月对照 spec 检查进度,偏离超 20% 触发范围调整决策 - **YAGNI 原则**:未明确要求的功能不做,即便"看起来很简单" #### R8: 黄金模板过重(中风险) **表现**:P1 黄金模板包含全部横切关注点,可能导致 P1 膨胀到 4-5 个月。 **缓解**: - **P1 范围严控**:classes 服务仅 CRUD,不实现复杂业务逻辑 - **横切关注点最小实现**:P1 仅实现基础版(如限流仅固定窗口,P6 才换令牌桶) - **可复制性验证**:P1 退出标准含"30 分钟复制跑起新服务",若不达标先优化模板再进 P2 - **回写而非前置**:阶段特有模式(Outbox/CDC/长连接)在对应阶段实现后回写,P1 不预实现 ### 7.4 基础设施风险 #### R9: Docker 本地资源(中风险) **表现**:全量 docker-compose(MySQL+Redis+Kafka+Zookeeper+Debezium+CH+Neo4j+ES+Temporal+Consul)内存占用可能超 16GB。 **缓解**: - **最小开发集**:`docker-compose.minimal.yml` 仅 MySQL+Redis,日常开发用 - **按阶段启服务**:P1 仅起 MySQL+Redis;P3 加 Kafka+Zookeeper;P4 加 Debezium+CH+Neo4j;P5 加 ES;P6 加 Consul+Istio - **资源限制**:docker-compose 每服务配置 `mem_limit`,避免单服务吃满内存 - **云资源备选**:若本地跑不动,P4 起可考虑云上 dev 环境(腾讯云/阿里云 K8s dev 集群) #### R10: P6 生产部署(高风险) **表现**:P1-P5 本地 Docker 跑通,P6 上 K8s + Service Mesh 可能大量适配问题。 **缓解**: - **P1 起容器化**:每服务从 P1 即 Dockerfile + docker-compose,避免 P6 重新容器化 - **P3 起健康检查**:每服务暴露 `/health` + `/metrics`,K8s 探针就绪 - **P5 起无状态化**:服务状态外置(Redis/MySQL),为 K8s 扩缩容准备 - **P6 前置验证**:P5 末尾用 minikube 或 k3s 本地验证 K8s 清单,提前暴露问题 - **P6 范围可裁剪**:若 P6 时间紧张,Service Mesh 可降级为 K8s 原生 Service + Ingress,Istio 延后 ### 7.5 风险-阶段矩阵 | 风险 | P1 | P2 | P3 | P4 | P5 | P6 | | -------------- | --- | --- | --- | --- | --- | --- | | R1 1人瓶颈 | ◐ | ◐ | ● | ● | ● | ● | | R2 AI 质量 | ◐ | ◐ | ◐ | ◐ | ◐ | ◐ | | R3 多语言 | ● | ◐ | ◐ | ● | ● | ◐ | | R4 分布式 | ○ | ○ | ● | ● | ● | ● | | R5 契约 | ● | ◐ | ◐ | ◐ | ◐ | ◐ | | R6 一致性 | ○ | ○ | ● | ● | ◐ | ◐ | | R7 范围 | ◐ | ◐ | ● | ● | ● | ◐ | | R8 模板过重 | ● | ○ | ○ | ○ | ○ | ○ | | R9 Docker 资源 | ◐ | ◐ | ◐ | ● | ● | ● | | R10 生产部署 | ○ | ○ | ○ | ○ | ◐ | ● | 图例:● 高风险 ◐ 中风险 ○ 低风险 **P1 重点防控**:R8(模板过重)、R3(多语言工具链)、R5(契约管理) **P3-P5 重点防控**:R4(分布式复杂度)、R6(一致性)、R7(范围蔓延) **P6 重点防控**:R10(生产部署)、R1(1人瓶颈累积) ### 7.6 风险监控机制 - **每阶段开始前**:对照风险-阶段矩阵,识别本阶段高风险项,制定缓解动作 - **每阶段末尾**:known-issues 工作日志记录新发现的风险与缓解经验 - **月度**:检查 R7(范围蔓延),对照 spec 进度 - **季度**:全面风险回顾,必要时调整 spec 与路线图 --- ## 8. 验收标准 ### 8.1 整体验收(P6 末尾) | 维度 | 验收项 | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 架构完整度 | 0010 蓝图全部组件落地(6 领域微服务[IAM/CoreEdu/Content/DataAna/Msg/AI] + 2 基础设施服务[API Gateway/Push Gateway] + 3 BFF + 4 微前端 + 5 存储 + 事件总线 + Service Mesh) | | 文档体系 | 004 多服务版 + 8 服务 README(含 outbox-relay)+ 多语言 project_rules + arch.db 多语言扫描 + known-issues | | 可观测性 | 全链路 trace + Grafana 仪表盘 + Loki 日志查询 | | 安全 | RS256 JWT + DataScope 6 级 + mTLS + 限流熔断 | | 测试 | 单元 + 集成 + 契约 + E2E 四类,覆盖率达标 | | 可用性 | 单服务宕机不影响核心链路,99.9% 可用性压测通过 | | 可扩展性 | 单服务可独立扩缩容(HPA 生效) | ### 8.2 各阶段验收 见第 3 节(P1)与第 4 节(P2-P6)各阶段退出标准。 --- ## 9. 不在本次范围 - **数据迁移**:旧 Next.js 项目数据迁移到新系统(通过 CDC/ETL,独立项目) - **旧系统下线**:新系统上线后旧系统的退役计划(独立决策) - **生产环境部署**:P6 仅生产硬化与 K8s 清单,实际部署目标环境(云/自建)未定 - **用户培训**:新系统的用户培训与文档(独立项目) - **性能压测**:仅 P6 做 99.9% 可用性基础压测,深度性能调优独立项目 - **安全审计**:仅实现安全架构,第三方安全审计独立项目 --- ## 10. 实施约束 - 每阶段开始前 `git commit` 一次快照(用户要求"实施前提交备份") - 每阶段完成后 `git commit` + `git tag` - 每阶段必须通过 CI(lint + test + build + arch:scan) - 每阶段完成后更新 `docs/troubleshooting/known-issues.md` 工作经验日志 - 每阶段若架构意图变化,同步更新 `004_architecture_impact_map.md` - 全程不改 `project_rules.md` 除非有新的强制规则 - 发现新需求一律记入 `roadmap/tech-debt.md`,不在当前阶段实现