跳转到内容

后端架构

同一份业务代码(@seed/services)部署到两种运行时:

Serverless (api/edge/)Docker (api/bun/)
运行时Cloudflare Workers (V8)Bun
流量80% — 无状态 CRUD20% — WebSocket / Cron / 文件
DB 驱动Neon HTTPNeon TCP
适用低延迟、自动扩缩容长连接、定时任务、大文件

约束:AnyDatabase 类型需兼容 HTTP(Serverless)与 TCP(Docker)两种 Neon 驱动。

Client → CDN → Cloudflare Worker → Hono 中间件链 → Controller → Service → Repository → Drizzle → Neon

中间件按以下顺序执行,各层生命周期职责完全隔离:

TraceId → SecureHeaders → CORS → RateLimiter → Logger → Transform → Session → [路由] → ErrorHandler
中间件职责
TraceId生成请求追踪 ID
SecureHeadersCSP / HSTS / X-Frame-Options
CORS生产环境白名单,禁止反射来源
RateLimiter按 IP 限流
Logger请求日志,敏感字段脱敏(递归 3 层)
Transform成功响应统一包装为 { code, data, message, traceId }
SessionBetter Auth session 注入
ErrorHandler全局异常处理

每个业务模块 3 层,职责边界清晰:

packages/services/src/{name}/
├── {name}.controller.ts # 路由 + Zod 验证 → 只编排,不含逻辑
├── {name}.service.ts # 业务逻辑 → 抛语义化错误,返回 VO
├── {name}.repository.ts # 数据访问 → 仅操作 ORM
├── {name}.schema.ts # 模块专用 Zod schemas
└── {name}.vo.ts # Entity → VO 转换

单向调用:Controller → Service → Repository,禁止反向。

全端 Session-based 认证,Bearer Token 传输。服务端通过 @seed/kit/auth/servercreateAuth() 校验。

Token 存储
SPA (Web)localStorage
Native (Tauri)secure storage