加载中...

这份文档是什么:把 BIE 拆成"组件(用什么库/服务)+ 契约(按什么协议对接)+ 骨架(怎么分层)"三张清单。目的是让你知道——搭一套生产级 DDD 系统,该选哪些零件、零件之间按什么协议说话
已按要求剔除 AI 业务功能llm_runtimememos、LangGraph 编排等),它们单列在文末"可选/AI 专用"里,默认不算核心骨架。

一、骨架(结构,一眼版)

后端 = 模块化单体          前端 = Feature-Sliced Design
app/                       src/
├── core/    技术内核        ├── app/       装配
├── shared/  横切设施        ├── routes/    路由
│   ├── outbox/   事件出箱    ├── widgets/   复合区块
│   ├── observability/ 追踪   ├── features/  用户能做的事
│   └── jobs/     异步任务    ├── entities/  前端限界上下文
└── modules/<ctx>/          └── shared/    底座(api/ui/lib)
    ├── api/          接口        └── api/
    ├── application/  用例(CQRS)      ├── generated/  契约生成(不可改)
    ├── domain/       业务规则        ├── adapters/   防腐层
    └── infrastructure/ 持久化        └── client.ts   统一出入口

结构的两条不变量:边界(每层只依赖该依赖的,工具强制)+ 一致(前后端共用机器契约)。详见 README

二、后端组件清单(基础设施零件)

类别 BIE 选型(真实依赖) 作用 常见替代
Web 框架 FastAPI + uvicorn + python-multipart HTTP 接口、自动产出 OpenAPI Flask / Django / Litestar
ORM / 数据库 SQLAlchemy[asyncio] + asyncpg + psycopg 异步 ORM,接 PostgreSQL Tortoise / SQLModel
迁移 Alembic 数据库 schema 版本管理
缓存 / KV Redis 缓存、限流、分布式锁、token 存储
任务运行时 Taskiq[metrics] + taskiq-redis 异步后台任务、事件消费(worker 进程) Celery / Arq / Dramatiq
可观测 OpenTelemetry(api/sdk + 一堆 instrumentation:fastapi/asyncpg/httpx/redis/sqlalchemy/logging)+ OTLP exporter 全链路追踪、指标、结构化日志
对象存储 aioboto3 + aiofiles S3 兼容存储(MinIO/OSS),文件与产物
HTTP 客户端 httpx + socksio 调外部服务 aiohttp
认证 python-jose[cryptography](JWT)+ passlib[bcrypt](密码哈希) 签发/校验 token、密码加密 pyjwt / authlib
配置 / 序列化 pydantic + pydantic-settings + orjson 配置、DTO 校验、快 JSON
ID 生成 uuid-utils(UUIDv7) 有序唯一 ID(事件/聚合) ulid
实时推送 Centrifugo(独立服务)+ core/centrifugo.py 客户端 服务端 → 浏览器 WebSocket 推送 Socket.IO / 自建 WS
文档处理 python-docx + mistletoe + markitdown Markdown/Word 转换(产物导出)

运行时拓扑(docker compose 真实服务):backend + taskiq-worker + postgres + redis + minio + centrifugo,前面挂 frontend,外加 bootstrap(初始化)。

三、前端组件清单(FSD 零件)

类别 BIE 选型 作用 备注
UI 框架 React + react-dom 视图
服务端状态 @tanstack/react-query 缓存/失效/去重,唯一"服务端真相源" 不往 store 塞服务端数据
客户端状态 zustand 仅放 UI 偏好等"客户端状态"
路由 @tanstack/react-router(+ router-generator/plugin 代码生成路由) 类型安全路由
契约生成 orval(读 OpenAPI 生成 React Query hooks)+ datamodel-code-generator 前端 api 层不手写、零漂移 见契约章
接口 mock msw 按契约 mock,后端没好也能开发 orval 自动生成
HTTP axios(orval 的 customInstance) 统一 baseURL/鉴权/错误 shared/api/client.ts
运行期校验 zod(+ @hookform/resolvers + react-hook-form) 表单 + 响应运行期校验 “相信契约 → 验证契约”
实时 centrifuge(Centrifugo 客户端) 订阅服务端推送 对接后端 outbox→centrifugo
设计系统 shadcn + radix-ui + tailwindcss + cva + clsx + tailwind-merge 组件库与样式 shared/ui
富文本/Markdown tiptap / novel;react-markdown + remark + unified 编辑器、渲染
动画 framer-motion / motion 交互动效
测试 vitest(单测)+ @playwright/test(e2e)+ coverage
Lint/Format Biome + ESLint 代码规范 建议补 FSD 边界 linter

四、协议与契约清单(零件之间"按什么说话")★重点

这是把各组件缝成一个系统的关键——每条都是一份"接口合同":

协议 / 契约 是什么 在 BIE 哪里用 它保证了什么
OpenAPI 后端 HTTP 接口的机器可读规范 FastAPI 自动产出 /openapi.json → orval 生成前端客户端 前后端零漂移:契约即代码,改字段编译期就报错
CloudEvents 1.0 标准化的"事件信封"格式(type/source/subject/data…) shared/outbox 出箱事件的封装;relay 推送时拼 CE JSON 事件跨服务可识别、可路由,不绑定私有格式
W3C TraceContext traceparent 头,跨进程传递链路 ID OpenTelemetry 注入 HTTP;出箱事件表存 traceparent 列;taskiq 中间件透传 全链路可追踪:一次请求串起 HTTP→事件→异步任务
JWT (Bearer) 无状态身份令牌 auth 模块签发;前端 client.ts 注入 Authorization 无状态鉴权,前后端一致的身份契约
架构契约(import-linter) 用配置声明"哪层不许依赖哪层" 后端 pyproject.toml 的 contracts,CI 执法 边界机器执法:分层规则违反即红灯
WebSocket(Centrifugo 协议) 服务端 → 浏览器实时推送 后端 outbox relay → Centrifugo;前端 centrifuge 订阅 channel 实时性,且与业务事件(出箱)解耦
SSE / 流式响应 HTTP 流式返回(逐块) chat 类接口的流式输出 大模型/长任务的渐进式返回
MCP(Model Context Protocol) 给 AI 接外部工具的标准协议 modules/mcp + langchain-mcp-adapters 工具接入标准化(⚠️ 偏 AI,见文末)
AG-UI Protocol Agent ↔ 前端 UI 的交互协议 后端 ag-ui-protocol;前端 @ag-ui/client Agent 交互标准化(⚠️ 偏 AI,见文末)
mock 契约(msw) 按 OpenAPI 生成的假接口 前端 openapi:mock 前后端并行开发,mock 与真契约同源

五、组件 ↔ 契约 ↔ DDD 分层 对应(把三张清单缝起来)

[前端 features/entities]  ──React Query/axios──┐
                                               │ 协议:OpenAPI(orval 生成)
[后端 api 接口层 (FastAPI)] ◄───────────────────┘  契约:JWT 鉴权、统一响应信封
        │
[application 用例层 (CQRS)] ──写──► domain 规则 ──► infrastructure (SQLAlchemy→PostgreSQL)
        │                                                        ▲
        └──发事件──► shared/outbox ──CloudEvents──► relay ──┬──► Centrifugo (WebSocket) ──► 前端
                         (和业务同一事务/UoW)               └──► Taskiq worker (异步消费)
        │
   全程贯穿:OpenTelemetry + W3C TraceContext(HTTP→事件→任务 一条链路)
   全程守护:import-linter(后端边界)/ FSD linter(前端边界,建议补)

六、可选 / AI 专用组件(本骨架默认剔除)

按你的要求,下面这些是 BIE 的 AI 业务功能,不属于"通用生产骨架",需要做 AI 时再加:

组件 / 模块 作用 归类
core/llm_runtime 统一 LLM 运行时(langchain-openai 等) ❌ 剔除
core/memos 长期记忆治理(接 MemOS:neo4j+qdrant) ❌ 剔除
studio/ + chat/infrastructure/graphs LangGraph 编排(langgraph + checkpoint-postgres) ❌ 剔除
modules/mcp + langchain-mcp-adapters MCP 工具接入 ⚠️ AI 相关,可选
ag-ui-protocol / @ag-ui/client Agent-UI 交互协议 ⚠️ AI 相关,可选
tavily-python / volcengine / markitdown 搜索 / 云厂商 / 文档解析 ⚠️ 业务相关,可选

剔除后,剩下的第二~五章那些组件和契约,就是一套与业务无关、可复用到任何项目的生产级 DDD 系统骨架的"零件 + 接口"全集。

七、最小起步该选哪几样

不用一次上全。优先级:

  1. 必备:FastAPI + SQLAlchemy + PostgreSQL + Alembic + pydantic + OpenAPI 契约(FastAPI 自带)+ orval(前端)+ import-linter(边界)。
  2. 要可靠性:加 outbox(CloudEvents 信封)+ UoW(事务)。
  3. 要规模:加 Taskiq(异步)+ Redis(缓存)+ 对象存储。
  4. 要可观测:加 OpenTelemetry(W3C TraceContext 贯穿)。
  5. 要实时:加 Centrifugo(WebSocket)。

🪞 一句话:组件是"零件",协议契约是"零件之间的接口标准"。 选对零件不难,难的是让它们按统一契约说话——OpenAPI 缝前后端、CloudEvents 缝事件、TraceContext 缝可观测、import-linter 焊边界。记住这四条契约,这套系统就立住了。

公告栏
这是我的个人知识库。
记录技术,也记录生活 —— 读过的、试过的、想明白的,都堆在这儿。
最新文章
网站资讯
文章数目 :
5
已运行时间 :
本站总字数 :
15.7k
本站访客数 :
本站总访问量 :
最后更新时间 :
全局知识图谱
当前页面 已访问 文章 标签
ESC 关闭 · 滚轮缩放 · 拖拽移动 · Ctrl+G 开关