架构与资源边界
区分后端项目、Release Operation、Artifact、环境、部署、运行治理和数据库迁移。
后端应用的构建面与运行面相互独立:
| 资源 | Owner | 职责 | 是否可变 |
|---|---|---|---|
| Project | Project Service | 后端应用的唯一产品身份,保存源码和 Git 历史 | 可持续修改 |
| Release Operation | Rust Build Service | 从主线 HEAD 发布一个 Cargo 语义版本 | 完成后保留状态和日志 |
| Artifact | Artifact Service | 保存构建成功后登记的统一可部署制品元数据 | 不可变 |
| Environment | Hosted Service | 某个 Project 的开发、测试、生产等运行配置 | 可产生配置修订 |
| Deployment | Hosted Service | 把一个 Artifact 部署到一个环境 | 每次部署形成记录 |
| Endpoint | Hosted Service | 对调用方提供稳定访问地址 | 由部署和路由状态支撑 |
“Hosted Service”是平台提供的托管构建与运行能力,不是需要另行创建的产品资源。项目、环境、部署、
端点以及它们的历史都以真实 projectId 关联;不存在与 Project 并列的 hostedServiceId。
核心不变量是:
同一主线 commit 的 Cargo package.version 发布一次
-> 得到一个不可变 projectVersion
-> 同一个 projectVersion 逐级部署到开发、测试和生产Hosted Service 部署只接收 projectId + projectVersion,不会把 releaseOperationId、buildJobId 或
artifactId 当成部署版本,也不会在部署阶段隐式重新构建。发布成功时,构建服务把
hosted_service_release 登记到独立 Artifact Service;Hosted Service 在自己的边界内按项目版本解析该
不可变制品。Artifact 查询不改变后端所有权,也不是正常部署入口。
配置边界
- 源码和 Artifact 保存与环境无关的程序逻辑。
- 数据库、密钥、第三方 token 和环境差异配置在 Environment 或 Config Provider 中管理。
db-service负责数据库 Instance、Logical Database、Profile 和 Allocation;Hosted Service 能力只在 Project Environment 中保存绑定,并在部署时解析连接配置。- 数据库迁移是与运行 Artifact 同源提交构建出的不可变 Artifact,由 Hosted Service 能力在目标 Environment 的数据库上、运行部署和流量切换之前执行。
- Endpoint 鉴权由环境级 consumer/token 或应用自身鉴权负责。
- 业务用户权限由后端应用自身或上游受信任身份上下文负责。
不要把生产配置打进 Artifact,也不要让构建脚本根据目标环境生成内容不同但版本相同的制品。
业务进程与运行治理边界
Hosted Service 后端必须按可以水平扩展为多个副本设计。Rust 业务进程不拥有实例数量、流量入口或跨副本 治理状态;增加、替换或回收副本不能改变业务合同,也不能要求业务代码增加部署环境分支。
| 层次 | 负责 | 不负责 |
|---|---|---|
| Rust 业务进程 | 业务规则、业务授权、数据一致性、事务、幂等、业务配额,以及健康检查、优雅退出、请求取消和有界资源使用等单进程正确性 | 实例数量、扩缩容、入口负载均衡、通用请求限流、跨副本运行配额和发布调度 |
| Hosted Service 控制面 | Environment 的类型化运行治理配置、配置修订、Slot 绑定、Deployment 编排和治理策略下发 | 在业务进程内复制一套运行治理状态 |
| Slot | 当前可用的 CPU、内存和副本容量权益,以及运行载体约束 | 业务规则或某个请求的业务授权 |
| OpenResty 与运行载体 | Endpoint 路由与鉴权、通用速率和并发保护、负载均衡、进程放置、就绪摘挂流、重启和发布切换 | 依赖业务数据判断的配额、计费权益或领域不变量 |
实例数量、扩缩容策略、资源限制和通用流量策略应由目标 Environment 下的类型化、版本化治理配置统一管理, 并由 Hosted Service 根据 Slot 当前容量和产品目录校验后投影到运行载体。它们不是注入 Rust 进程的普通环境 变量,也不能通过约定任意配置键让业务代码自行解释。当前是否开放某项治理能力、可选值和限制,以工作区 当前 Runtime 方法定义与 Slot 目录为准;能力尚未开放时,普通 Environment 配置不能代替平台治理合同。
凡是需要在多个副本之间保持统一语义的通用运维能力,都必须由外部运行层或权威集中式服务执行。例如单个 OpenResty 实例可以完成本地过载保护,但跨副本的全局精确限流必须使用共享的权威计数能力,不能把每个 Rust 进程的本地计数相加后假装成全局配额。
这条边界不把业务责任移出 Rust 服务。像“某用户每天最多创建多少个业务对象”、积分余额、套餐权益、事务 冲突和上游调用幂等仍依赖业务身份与持久化状态,必须由对应业务 Owner 执行;它们不能被降格为 OpenResty 中的通用请求限流。
代码设计边界
运行资源边界清晰并不代表服务内部可以继续传递无类型数据。Rust 后端必须把 HTTP、消息、数据库 JSON 列和 Artifact 限制在适配器边界;JSON 进入服务后立即反序列化为有明确 Owner、版本和不变量的 Rust 类型,领域和应用逻辑只处理类型化对象。
Contract DTO、领域对象、应用 Command/Query、数据库 Record 和第三方 Payload 必须分开建模,业务转换
使用显式 TryFrom、From、编译器或应用服务完成。完整的目录、依赖方向、Serde、契约演进和测试门禁见
Rust 服务设计约束。