載入中…
實驗準備中…
實驗準備中…
一套专为 Go 后端与 AI 协作设计的渐进式模块化单体架构。
核心原则:模块优先、轻量默认、按需升级、依赖单向、CI 守门。
简单业务采用轻量切片,复杂业务按需升级为六边形切片。以实际业务复杂度决定抽象程度,通过 Go 包边界、公共契约与 CI 约束依赖方向。
架构服务于业务,而不是让业务迁就架构。
以下仅展示架构意图,并非固定模板。禁止机械照搬、提前创建空目录或无用抽象。所有结构按实际需求渐进创建。
myapp/
├── cmd/
│ └── api/
│ └── main.go
│
├── internal/
│ ├── app/
│ │ └── app.go # 全局装配、路由挂载
│ │
│ ├── platform/ # 通用基础设施
│ │ ├── config/
│ │ ├── database/
│ │ ├── logger/
│ │ └── httpx/
│ │
│ ├── user/ # 轻量切片
│ │ ├── entity.go
│ │ ├── service.go
│ │ ├── service_test.go
│ │ ├── repo_pgx.go
│ │ ├── handler.go
│ │ ├── api.go # 按需:公共业务 API
│ │ └── module.go # 按需:模块装配
│ │
│ └── order/ # 六边形切片
│ ├── domain/
│ │ ├── order.go
│ │ └── errors.go
│ │
│ ├── application/
│ │ ├── ports.go
│ │ └── create_order.go
│ │
│ ├── adapters/
│ │ ├── http/
│ │ │ ├── handler.go
│ │ │ └── dto.go
│ │ ├── postgres/
│ │ │ └── repo_pgx.go
│ │ └── payment/
│ │ └── stripe.go
│ │
│ ├── api.go
│ └── module.go
│
├── db/
│ └── queries/
├── migrations/
├── tests/
│ └── integration/
├── docs/
│ └── adr/
├── scripts/
│ └── check-architecture/
├── .github/workflows/ci.yml
├── .golangci.yml
├── AGENTS.md
├── Makefile
├── go.mod
└── go.sum
说明:
app:依赖装配与路由挂载,不承担业务编排。platform:通用基础设施,不承载业务语义。api.go、module.go:仅在存在实际需求时创建。internal 子包或专用公共契约包。出现以下情况时,评估升级六边形:
升级原则:
internal 机制实施封装。api.go 或公共接口。api.go 只是代码组织约定,不提供 Go 文件级访问控制。internal 边界。pgx.Tx、sql.Tx 等具体数据库事务类型。| 场景 | 推荐方式 |
|---|---|
| 同进程业务查询 | 公共业务 API |
| 同进程业务操作 | 公共业务 API |
| 同库强一致操作 | 应用用例 + 受控事务 |
| 可异步业务通知 | 业务事件 |
| 可靠跨系统通信 | Outbox 等可靠消息机制 |
约束:
app.go 仅负责装配,不承担业务流程编排。golangci-lint。scripts/check-architecture。规则:
| 来源 | 允许依赖 | 禁止依赖 |
|---|---|---|
cmd | App、必要启动组件 | 业务内部实现 |
app | 模块装配入口、Platform | 业务规则编排 |
platform | 标准库、基础设施库 | 业务模块 |
| 轻量切片 | 自身、Platform、批准的公共契约 | 其他模块内部实现 |
domain | 标准库、批准的纯逻辑库 | Application、Adapters、业务基础设施 |
application | 自身 Domain、必要契约、纯逻辑依赖 | Adapters、具体基础设施 |
adapters | 自身 Application/Domain、必要基础设施 | 其他模块内部实现 |
| 模块根包 | 自身内部层、装配依赖、批准的公共契约 | 其他模块内部实现 |
api.go 文件名自动认定公共 API。基础配置示例:
version: "2"
linters:
enable:
- depguard
settings:
depguard:
rules:
order-domain:
list-mode: strict
files:
- "internal/order/domain/*.go"
- "internal/order/domain/**/*.go"
allow:
- $gostd
配置原则:
depguard 主要负责指定包范围内的导入准入。allow 使用包路径前缀或精确匹配,不以 * 表示包路径通配符。golangci-lint 版本兼容。scripts/check-architecture 检查,避免重复维护完整规则。此配置仅为 Domain 导入约束示例,不代表完整架构检查。具体文件匹配行为必须在项目中验证。
scripts/check-architecture 是核心架构防线。
go.mod 读取真实模块路径,不得硬编码项目名称。go list -json -deps -test 加载真实包信息。必须检查:
公共契约应通过显式规则识别,不通过文件名或导出标识符推测。
以下情况必须失败:
go list 执行或依赖加载失败。未知结构应报错,但不应将所有合法辅助目录判定为违规。
每条违规应尽可能包含:
Source: internal/order/application/create_order.go
Target: internal/order/adapters/postgres
Rule: application-cannot-import-adapters
Reason:
Application must not depend on concrete adapters.
Fix:
Define a minimal dependency contract owned by
the consumer and inject the implementation.
错误信息应明确:
| 测试场景 | 预期 |
|---|---|
| Application 导入自身 Domain | PASS |
| Application 导入 Adapters | FAIL |
| Domain 导入数据库驱动 | FAIL |
| Platform 导入业务模块 | FAIL |
| 跨模块访问内部 Adapter | FAIL |
| 跨模块使用批准的公共 API | PASS |
| 合法轻量模块包含辅助包 | PASS |
| 新增合法轻量模块 | PASS |
| 混合或异常模块结构 | FAIL |
| 业务模块形成循环 | FAIL |
| 依赖解析失败 | FAIL |
| 规则未覆盖目标源码 | FAIL |
| 已批准的集成测试依赖 | PASS |
| 未批准的生产代码依赖 | FAIL |
阶段一:核心边界
阶段二:六边形约束
阶段三:完整验证
每个阶段启用的规则都必须有对应回归测试。未实现的规则不得声称已被 CI 强制保证。
Pragmatic Hex Slice 遵循以下最终准则:
简单业务保持简单,复杂业务守住边界。
以业务模块组织代码,以复杂度决定分层,以 Go 包边界控制依赖,以 CI 保证约束,以 AI 审批机制控制演进。
让架构随业务演进,而不是让业务迁就架构。