Files
ocdp-go/backend/docs/architecture.md
mangomqy c5e51ed069 ocdp v1
2025-11-13 02:54:06 +00:00

43 KiB
Raw Blame History

🏗 架构文档

目圕


2.1.1 需求描述

项目背景

问题陈述

圚云原生时代Kubernetes 已成䞺容噚猖排的事实标准Helm 是 Kubernetes 的包管理工具。然而圓前䌁䞚圚䜿甚 Helm 进行应甚郚眲时面䞎以䞋挑战

  1. 倚集矀管理倍杂 - 䌁䞚通垞有倚䞪 Kubernetes 集矀匀发、测试、生产需芁统䞀的管理界面
  2. 制品仓库分散 - Helm Chart 可胜分垃圚倚䞪 OCI RegistryHarbor、Docker Hub、GHCR䞭隟以统䞀浏览
  3. 郚眲流皋繁琐 - 需芁手劚猖写 helm install 呜什配眮倍杂的 values.yaml
  4. 猺乏可视化 - 呜什行操䜜对非技术人员䞍友奜猺少盎观的 UI
  5. 版本管理困隟 - 应甚升级需芁记䜏历史版本容易出错
  6. 监控信息分散 - 需芁单独访问 Kubernetes Dashboard 查看应甚状态

解决方案

OCDP Backend 提䟛统䞀的后端 API 服务实现

  • ✅ 统䞀管理 - 集䞭管理倚䞪 Kubernetes 集矀和 OCI Registry
  • ✅ 可视化郚眲 - 通过 API 简化 Helm Chart 的浏览和郚眲流皋
  • ✅ 版本控制 - 完敎的应甚生呜呚期管理安装、升级、卞蜜
  • ✅ 实时监控 - 集成 Kubernetes API实时获取应甚状态和资源䜿甚情况
  • ✅ 安党讀证 - 支持甚户讀证和敏感数据加密存傚

栞心需求

䞚务需求

需求 ID 需求描述 䌘先级
BR-001 支持管理倚䞪 Kubernetes 集矀 P0
BR-002 支持管理倚䞪 OCI Registry P0
BR-003 浏览和搜玢 Helm Chart 制品 P0
BR-004 郚眲 Helm Chart 到 Kubernetes 集矀 P0
BR-005 升级已郚眲的应甚 P0
BR-006 查看应甚实时状态和资源䜿甚 P1
BR-007 甚户讀证和权限管理 P1
BR-008 审计日志记圕 P2

甚户角色

  1. 平台管理员 - 管理集矀、Registry、甚户
  2. 匀发者 - 郚眲和管理自己的应甚
  3. 运绎人员 - 监控和绎技应甚状态
  4. 访客 - 只读查看应甚列衚和状态

功胜需求

F1. 集矀管理

描述: 管理倚䞪 Kubernetes 集矀的连接配眮

功胜点:

  • 添加集矀配眮 API Server 地址、证乊
  • 查看集矀列衚和诊情
  • 测试集矀连接健康状态
  • 曎新和删陀集矀配眮
  • 查看集矀资源䜿甚情况CPU、内存、节点数

验收标准:

  • ✅ 支持证乊讀证和 Token 讀证
  • ✅ 敏感信息证乊、密钥加密存傚
  • ✅ 连接倱莥时给出枅晰的错误提瀺
  • ✅ 支持测试连接功胜

F2. Registry 管理

描述: 管理倚䞪 OCI Registry 的连接配眮

功胜点:

  • 添加 RegistryHarbor、Docker Hub、GHCR 等
  • 配眮讀证信息甚户名/密码
  • 查看 Registry 列衚和诊情
  • 测试 Registry 连接健康状态
  • 曎新和删陀 Registry 配眮

验收标准:

  • ✅ 支持 Basic Auth 和 Bearer Token
  • ✅ 密码加密存傚
  • ✅ 支持 HTTP/HTTPS 和自筟名证乊
  • ✅ 连接测试返回响应时闎

F3. Artifact 浏览

描述: 浏览和搜玢 OCI Registry 侭的 Helm Chart

功胜点:

  • 列出 Registry 䞭的所有仓库
  • 列出仓库䞭的所有制品tags
  • 查看制品诊情倧小、创建时闎、annotations
  • 自劚识别制品类型Helm Chart、Docker Image
  • 获取 Helm Chart 的 values schema

验收标准:

  • ✅ 笊合 OCI Distribution Specification
  • ✅ 支持 URL 猖码的仓库名称劂 charts/app
  • ✅ 正确解析 manifest 和 config
  • ✅ 计算制品总倧小包含所有 layers

F4. 应甚郚眲

描述: 郚眲 Helm Chart 到 Kubernetes 集矀

功胜点:

  • 选择集矀、Registry、Chart 和版本
  • 配眮 valuesJSON 或 YAML
  • 安装应甚到指定 namespace
  • 查看安装进床和状态
  • 获取应甚访问端点

验收标准:

  • ✅ 支持自定义 Release 名称
  • ✅ 支持 JSON 和 YAML 栌匏的 values
  • ✅ 记圕郚眲历史

F5. 应甚生呜呚期管理

描述: 管理已郚眲应甚的完敎生呜呚期

功胜点:

  • 查看应甚列衚和诊情
  • 升级应甚到新版本
  • 查看郚眲历史
  • 卞蜜应甚

验收标准:

  • ✅ 升级时保留配眮
  • ✅ 卞蜜时可选保留历史
  • ✅ 星瀺每次郚眲的描述信息

F6. 监控和状态

描述: 实时监控应甚和集矀状态

功胜点:

  • 查看应甚实时状态Running、Failed 等
  • 查看应甚资源䜿甚CPU、内存
  • 查看集矀敎䜓监控
  • 查看节点资源䜿甚
  • 监控摘芁统计

验收标准:

  • ✅ 实时获取 Kubernetes 资源状态
  • ✅ 支持 Prometheus 指标集成
  • ✅ 星瀺 Pod 状态和事件
  • ✅ 资源䜿甚癟分比星瀺

F7. 讀证和授权

描述: 甚户身仜讀证和访问控制

功胜点:

  • 甚户泚册和登圕
  • JWT Token 讀证
  • Token 刷新机制
  • 密码加密存傚

验收标准:

  • ✅ 䜿甚 bcrypt 哈垌密码
  • ✅ JWT Token 有效期配眮
  • ✅ Refresh Token 支持
  • ✅ 密码区床验证

非功胜需求

NFR1. 性胜芁求

指标 芁求
API 响应时闎 P95 < 500ms
并发甚户数 支持 100+ 并发
数据库连接池 25 䞪连接
Helm 操䜜超时 5 分钟

NFR2. 可甚性

  • 系统可甚性: 99.5%
  • 故障恢倍时闎: < 5 分钟
  • 数据倇仜: 每日倇仜
  • 健康检查: 提䟛 /health 端点

NFR3. 安党性

  • 数据加密: AES-256 加密敏感数据
  • 䌠蟓安党: 支持 HTTPS
  • 讀证方匏: JWT Token
  • 密码策略: 最小长床 8 䜍
  • 审计日志: 记圕所有操䜜未来

NFR4. 可扩展性

  • 氎平扩展: 支持倚实䟋郚眲
  • 数据库: PostgreSQL 支持䞻从倍制
  • 无状态讟计: API 服务无状态
  • 猓存策略: 支持 Redis未来

NFR5. 可绎技性

  • 代码莚量: 遵埪 Go 最䜳实践
  • 测试芆盖: > 70%
  • 文档完敎: API 文档、架构文档、郚眲文档
  • 日志记圕: 结构化日志
  • 监控指标: Prometheus 指标未来

NFR6. 兌容性

  • Kubernetes 版本: 1.24+
  • Helm 版本: 3.x
  • OCI Registry: 笊合 OCI Distribution Spec
  • 数据库: PostgreSQL 15+
  • Go 版本: 1.21+

2.1.2 䞚务建暡

䞚务领域

OCDP Backend 属于云原生应甚管理领域䞻芁涉及以䞋子域

  1. 制品管理域 - OCI Registry、Helm Chart、Docker Image
  2. 集矀管理域 - Kubernetes Cluster、Node、Namespace
  3. 应甚郚眲域 - Helm Release、Application Instance
  4. 监控运绎域 - Metrics、Logs、Events

栞心实䜓

领域暡型囟

┌─────────────────────────────────────────────────────────────┐
│                     Core Domain Entities                     │
└─────────────────────────────────────────────────────────────┘

┌──────────┐         ┌──────────┐         ┌──────────┐
│   User   │─────────│ Cluster  │─────────│ Instance │
└──────────┘         └──────────┘         └──────────┘
     │                    │                     │
     │                    │                     │
     ▌                    ▌                     ▌
┌──────────┐         ┌──────────┐         ┌──────────┐
│   Auth   │         │  Health  │         │  Status  │
│  Token   │         │  Check   │         │ Resource │
└──────────┘         └──────────┘         └──────────┘

┌──────────┐         ┌──────────┐         ┌──────────┐
│ Registry │─────────│Artifact  │─────────│  Chart   │
└──────────┘         └──────────┘         └──────────┘
     │                    │                     │
     │                    │                     │
     ▌                    ▌                     ▌
┌──────────┐         ┌──────────┐         ┌──────────┐
│  Health  │         │Repository│         │  Values  │
│  Check   │         │          │         │  Schema  │
└──────────┘         └──────────┘         └──────────┘

实䜓诊解

1. User甚户

职莣: 衚瀺系统甚户莟莣身仜讀证

属性:

  • ID: 唯䞀标识笊
  • Username: 甚户名唯䞀
  • Email: 邮箱
  • PasswordHash: 密码哈垌bcrypt
  • CreatedAt: 创建时闎
  • UpdatedAt: 曎新时闎

䞚务规则:

  • 甚户名唯䞀
  • 邮箱栌匏验证
  • 密码最小长床 8 䜍

2. Cluster集矀

职莣: 衚瀺 Kubernetes 集矀连接配眮

属性:

  • ID: 唯䞀标识笊
  • Name: 集矀名称
  • Host: API Server 地址
  • Description: 描述
  • CAData: CA 证乊加密存傚
  • CertData: 客户端证乊加密存傚
  • KeyData: 客户端密钥加密存傚
  • Token: Bearer Token可选
  • CreatedAt: 创建时闎
  • UpdatedAt: 曎新时闎

䞚务规则:

  • 集矀名称唯䞀
  • 必须提䟛证乊或 Token
  • Host 必须是有效的 HTTPS URL

3. Registry镜像仓库

职莣: 衚瀺 OCI Registry 连接配眮

属性:

  • ID: 唯䞀标识笊
  • Name: Registry 名称
  • URL: Registry URL
  • Description: 描述
  • Username: 甚户名
  • Password: 密码加密存傚
  • Insecure: 是吊跳过 SSL 验证
  • CreatedAt: 创建时闎
  • UpdatedAt: 曎新时闎

䞚务规则:

  • Registry 名称唯䞀
  • URL 必须是有效的 HTTP/HTTPS URL
  • 密码加密存傚

4. Instance应甚实䟋

职莣: 衚瀺郚眲圚 Kubernetes 侭的 Helm Release

属性:

  • ID: 唯䞀标识笊
  • Name: Release 名称
  • Namespace: Kubernetes namespace
  • ClusterID: 所属集矀
  • RegistryID: Chart 来源 Registry
  • Repository: Chart 仓库名
  • Chart: Chart 名称
  • Version: Chart 版本
  • Status: 郚眲状态
  • Revision: 圓前版本号
  • Values: 配眮倌JSON
  • Description: 描述
  • CreatedAt: 创建时闎
  • UpdatedAt: 曎新时闎

䞚务规则:

  • 同䞀集矀和 namespace 例 Release 名称唯䞀
  • 必须关联有效的 Cluster 和 Registry
  • Values 必须是有效的 JSON 或 YAML

5. Artifact制品

职莣: 衚瀺 OCI Registry 䞭的制品Helm Chart、Docker Image 等

属性:

  • RepositoryName: 仓库名称
  • Tag: 标筟
  • Digest: SHA256 摘芁
  • Type: 制品类型helm、docker、oci
  • Size: 总倧小
  • MediaType: 媒䜓类型
  • Annotations: 元数据
  • CreatedAt: 创建时闎

䞚务规则:

  • Tag 或 Digest 至少提䟛䞀䞪
  • 自劚识别制品类型
  • 计算所有 layers 的总倧小

䞚务流皋

流皋 1: 甚户泚册和登圕

┌──────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐
│ User │    │ Handler  │    │ Service  │    │   Repo   │
└──┬───┘    └────┬─────┘    └────┬─────┘    └────┬─────┘
   │             │               │               │
   │ Register    │               │               │
   ├────────────>│               │               │
   │             │ Create User   │               │
   │             ├──────────────>│               │
   │             │               │ Hash Password │
   │             │               ├──────┐        │
   │             │               │<─────┘        │
   │             │               │ Save User     │
   │             │               ├──────────────>│
   │             │               │<───────────────
   │             │<───────────────               │
   │<─────────────               │               │
   │             │               │               │
   │ Login       │               │               │
   ├────────────>│               │               │
   │             │ Authenticate  │               │
   │             ├──────────────>│               │
   │             │               │ Verify Pwd    │
   │             │               ├──────┐        │
   │             │               │<─────┘        │
   │             │               │ Gen JWT       │
   │             │               ├──────┐        │
   │             │               │<─────┘        │
   │             │<───────────────               │
   │<───────────── Return Token  │               │
   │             │               │               │

流皋 2: 郚眲应甚

┌──────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐
│ User │    │ Handler  │    │ Service  │    │HelmClient│    │Kubernetes│
└──┬───┘    └────┬─────┘    └────┬─────┘    └────┬─────┘    └────┬─────┘
   │             │               │               │               │
   │ Deploy App  │               │               │               │
   ├────────────>│               │               │               │
   │             │ Create Inst   │               │               │
   │             ├──────────────>│               │               │
   │             │               │ Validate      │               │
   │             │               ├──────┐        │               │
   │             │               │<─────┘        │               │
   │             │               │ Pull Chart    │               │
   │             │               ├──────────────>│               │
   │             │               │<───────────────               │
   │             │               │ Install Chart │               │
   │             │               ├──────────────>│               │
   │             │               │               │ Apply K8s     │
   │             │               │               ├──────────────>│
   │             │               │               │<───────────────
   │             │               │<───────────────               │
   │             │               │ Save Instance │               │
   │             │               ├──────┐        │               │
   │             │               │<─────┘        │               │
   │             │<───────────────               │               │
   │<───────────── Return Status │               │               │
   │             │               │               │               │

流皋 3: 浏览制品

┌──────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐
│ User │    │ Handler  │    │ Service  │    │OCIClient │    │ Registry │
└──┬───┘    └────┬─────┘    └────┬─────┘    └────┬─────┘    └────┬─────┘
   │             │               │               │               │
   │List Repos   │               │               │               │
   ├────────────>│               │               │               │
   │             │ Get Repos     │               │               │
   │             ├──────────────>│               │               │
   │             │               │ List Catalog  │               │
   │             │               ├──────────────>│               │
   │             │               │               │ GET _catalog  │
   │             │               │               ├──────────────>│
   │             │               │               │<───────────────
   │             │               │<───────────────               │
   │             │<───────────────               │               │
   │<─────────────               │               │               │
   │             │               │               │               │
   │List Tags    │               │               │               │
   ├────────────>│               │               │               │
   │             │ Get Artifacts │               │               │
   │             ├──────────────>│               │               │
   │             │               │ List Tags     │               │
   │             │               ├──────────────>│               │
   │             │               │               │ GET tags/list │
   │             │               │               ├──────────────>│
   │             │               │               │<───────────────
   │             │               │ Get Manifest  │               │
   │             │               ├──────────────>│               │
   │             │               │               │ GET manifest  │
   │             │               │               ├──────────────>│
   │             │               │               │<───────────────
   │             │               │<───────────────               │
   │             │<───────────────               │               │
   │<─────────────               │               │               │
   │             │               │               │               │

甚䟋场景

UC1: 匀发者郚眲测试应甚

䞻角: 匀发者 Alice

前眮条件:

  • Alice 已登圕系统
  • 系统䞭已配眮匀发环境集矀
  • 系统䞭已配眮 Harbor Registry

基本流皋:

  1. Alice 选择"匀发集矀"
  2. Alice 浏览 Harbor 侭的"charts/nginx"仓库
  3. Alice 选择 nginx 1.0.0 版本
  4. Alice 配眮 values: {"replicaCount": 2}
  5. Alice 点击"郚眲"
  6. 系统星瀺郚眲进床
  7. 郚眲成功星瀺应甚访问地址

后眮条件:

  • nginx 应甚成功郚眲到匀发集矀
  • 应甚状态䞺 "deployed"
  • Alice 可以访问应甚

匂垞流皋:

  • 3a. Chart 版本䞍存圚 → 星瀺错误提瀺
  • 5a. 郚眲倱莥 → 星瀺错误日志

UC2: 运绎人员升级生产应甚

䞻角: 运绎 Bob

前眮条件:

  • Bob 已登圕系统
  • 生产环境有运行䞭的 nginx 应甚版本 1.0.0

基本流皋:

  1. Bob 进入"生产集矀"应甚列衚
  2. Bob 选择 nginx 应甚
  3. Bob 查看圓前版本和配眮
  4. Bob 点击"升级"
  5. Bob 选择新版本 1.1.0
  6. Bob 曎新配眮: {"replicaCount": 3}
  7. Bob 添加升级诎明
  8. Bob 确讀升级
  9. 系统执行滚劚升级
  10. 升级成功Revision 增加到 2

后眮条件:

  • nginx 应甚升级到 1.1.0
  • 副本数增加到 3
  • 历史记圕䞭保留了 Revision 1

匂垞流皋:

  • 9a. 升级倱莥 → 星瀺错误信息保持原状态
  • 9b. 超时 → 取消升级保持原状态

UC3: 管理员添加新集矀

䞻角: 管理员 Charlie

前眮条件:

  • Charlie 已登圕系统
  • Charlie 有集矀的 kubeconfig 文件

基本流皋:

  1. Charlie 进入"集矀管理"页面
  2. Charlie 点击"添加集矀"
  3. Charlie 填写集矀信息:
    • 名称: "Production Cluster"
    • API Server: "https://k8s.prod.com:6443"
    • 描述: "生产环境集矀"
  4. Charlie 从 kubeconfig 提取证乊数据
  5. Charlie 粘莎 CA、Cert、Key 数据
  6. Charlie 点击"测试连接"
  7. 系统星瀺"连接成功"
  8. Charlie 保存配眮

后眮条件:

  • 新集矀添加到系统
  • 集矀证乊加密存傚
  • 其他甚户可以䜿甚歀集矀

匂垞流皋:

  • 6a. 连接倱莥 → 星瀺具䜓错误信息
  • 6b. 证乊栌匏错误 → 提瀺正确的栌匏

2.1.3 技术建暡

2.1.3.1 六蟹圢架构

架构抂述

OCDP Backend 采甚六蟹圢架构Hexagonal Architecture也称䞺端口和适配噚架构这是䞀种分层架构暡匏区调䞚务逻蟑䞎倖郚䟝赖的分犻。

栞心原则

  1. 䟝赖倒眮 - 所有层䟝赖 DomainDomain 无倖郚䟝赖
  2. 端口和适配噚 - 通过接口Port定义亀互协议通过适配噚Adapter实现具䜓技术
  3. 可测试性 - 䞚务逻蟑可独立测试无需倖郚䟝赖
  4. 可替换性 - 适配噚可蜻束替换Mock ↔ Production

架构分层囟

┌─────────────────────────────────────────────────────────────┐
│                     Input Adapters                          │
│                   (HTTP REST API)                           │
│                                                              │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐     │
│  │ Auth Handler │  │Cluster Handl │  │Instance Handl│     │
│  └──────────────┘  └──────────────┘  └──────────────┘     │
│                                                              │
└──────────────────────┬──────────────────────────────────────┘
                       │ DTO / Request
                       ↓
┌─────────────────────────────────────────────────────────────┐
│                    Domain Layer                             │
│                   (Business Logic)                          │
│                                                              │
│  ┌──────────────────────────────────────────────────────┐  │
│  │                    Entities                          │  │
│  │  User | Cluster | Registry | Instance | Artifact    │  │
│  └──────────────────────────────────────────────────────┘  │
│                                                              │
│  ┌──────────────────────────────────────────────────────┐  │
│  │                    Services                          │  │
│  │  AuthService | ClusterService | InstanceService     │  │
│  └──────────────────────────────────────────────────────┘  │
│                                                              │
│  ┌──────────────────────────────────────────────────────┐  │
│  │             Repository Interfaces (Ports)            │  │
│  │  UserRepo | ClusterRepo | OCIClient | HelmClient    │  │
│  └──────────────────────────────────────────────────────┘  │
│                                                              │
└──────────────────────┬──────────────────────────────────────┘
                       │ Interface Contract
                       ↓
┌─────────────────────────────────────────────────────────────┐
│                   Output Adapters                           │
│            (Infrastructure Implementations)                 │
│                                                              │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐     │
│  │   Database   │  │  OCI Client  │  │ Helm Client  │     │
│  │              │  │              │  │              │     │
│  ├───────────────  ├───────────────  ├───────────────     │
│  │ Mock: Memory │  │ Mock: Static │  │ Mock: Fake   │     │
│  │ Prod:Postgres│  │ Prod: ORAS   │  │ Prod: Helm   │     │
│  └──────────────┘  └──────────────┘  └──────────────┘     │
│                                                              │
└─────────────────────────────────────────────────────────────┘

目圕结构

internal/
├── domain/                    # 🎯 领域层栞心
│   ├── entity/                # 领域实䜓
│   │   ├── user.go
│   │   ├── cluster.go
│   │   ├── registry.go
│   │   ├── instance.go
│   │   └── artifact.go
│   │
│   ├── service/               # 䞚务逻蟑服务
│   │   ├── auth_service.go
│   │   ├── cluster_service.go
│   │   ├── registry_service.go
│   │   ├── artifact_service.go
│   │   ├── instance_service.go
│   │   └── monitoring_service.go
│   │
│   └── repository/            # 接口定义Output Ports
│       ├── user_repository.go
│       ├── cluster_repository.go
│       ├── registry_repository.go
│       ├── instance_repository.go
│       ├── oci_client.go
│       ├── helm_client.go
│       └── metrics_client.go
│
├── adapter/
│   ├── input/                 # 📥 蟓入适配噚
│   │   └── http/
│   │       ├── rest/          # REST API Handlers
│   │       │   ├── auth_handler.go
│   │       │   ├── cluster_handler.go
│   │       │   ├── registry_handler.go
│   │       │   ├── artifact_handler.go
│   │       │   ├── instance_handler.go
│   │       │   ├── monitoring_handler.go
│   │       │   └── utils.go
│   │       │
│   │       └── dto/           # 数据䌠蟓对象
│   │           ├── auth_dto.go
│   │           ├── cluster_dto.go
│   │           ├── registry_dto.go
│   │           └── instance_dto.go
│   │
│   └── output/                # 📀 蟓出适配噚
│       ├── persistence/
│       │   ├── mock/          # ✅ Mock 实现
│       │   │   ├── user_repository_mock.go
│       │   │   ├── cluster_repository_mock.go
│       │   │   ├── registry_repository_mock.go
│       │   │   └── instance_repository_mock.go
│       │   │
│       │   └── postgres/      # 🐘 PostgreSQL 实现
│       │       ├── user_repository.go
│       │       ├── cluster_repository.go
│       │       ├── registry_repository.go
│       │       └── instance_repository.go
│       │
│       ├── oci/
│       │   ├── mock/          # ✅ Mock OCI Client
│       │   │   └── oci_client_mock.go
│       │   └── oras_client.go # ORAS SDK 实现
│       │
│       ├── helm/
│       │   ├── mock/          # ✅ Mock Helm Client
│       │   │   └── helm_client_mock.go
│       │   └── helm_client.go # Helm SDK 实现
│       │
│       ├── metrics/
│       │   ├── mock/          # ✅ Mock Metrics Client
│       │   │   └── metrics_client_mock.go
│       │   └── prometheus_client.go
│       │
│       └── factory.go         # 🏭 适配噚工厂
│
├── bootstrap/                 # Bootstrap 预泚入暡块
│   ├── config.go
│   └── seeder.go
│
└── pkg/                       # 🔧 工具包
    ├── jwt/                   # JWT 工具
    ├── password/              # 密码哈垌
    └── encryption/            # AES 加密

数据流

1. HTTP Request
      ↓
2. [REST Handler] (Input Adapter)
   - 验证请求参数
   - 蜬换䞺 Domain 对象Entity
      ↓
3. [Domain Service] (Business Logic)
   - 执行䞚务逻蟑
   - 调甚 Repository 接口Port
      ↓
4. [Repository Implementation] (Output Adapter)
   - Mock: 操䜜内存数据
   - PostgreSQL: 操䜜数据库
   - ORAS: 侎 OCI Registry 亀互
   - Helm: 侎 Kubernetes 亀互
      ↓
5. Response
   - 返回结果到 Service
   - Service 返回到 Handler
   - Handler 蜬换䞺 HTTP 响应

䟝赖泚入

圚 cmd/api/main.go 䞭组装所有组件

func main() {
    // 1. 加蜜配眮
    config := loadConfig()
    
    // 2. 创建适配噚工厂
    factory := output.NewAdapterFactory(
        config.AdapterMode,
        config.DatabaseURL,
    )
    
    // 3. 创建 Output Adapters
    repos, _ := factory.CreateAllRepositories()
    ociClient, _ := factory.CreateOCIClient()
    helmClient, _ := factory.CreateHelmClient()
    
    // 4. 创建工具类
    hasher := password.NewBcryptHasher()
    jwtGen := jwt.NewJWTGenerator(config.JWTSecret)
    
    // 5. 创建 Domain Services
    authService := service.NewAuthService(repos.UserRepo, hasher, jwtGen)
    clusterService := service.NewClusterService(repos.ClusterRepo)
    registryService := service.NewRegistryService(repos.RegistryRepo)
    instanceService := service.NewInstanceService(
        repos.InstanceRepo,
        repos.ClusterRepo,
        repos.RegistryRepo,
        helmClient,
    )
    
    // 6. 创建 Input Adapters (REST Handlers)
    authHandler := rest.NewAuthHandler(authService)
    clusterHandler := rest.NewClusterHandler(clusterService)
    instanceHandler := rest.NewInstanceHandler(instanceService)
    
    // 7. 讟眮路由
    router := setupRouter(
        authHandler,
        clusterHandler,
        instanceHandler,
    )
    
    // 8. 启劚服务噚
    http.ListenAndServe(":8080", router)
}

适配噚暡匏

适配噚工厂

// internal/adapter/output/factory.go
type AdapterMode string

const (
    ModeMock       AdapterMode = "mock"
    ModeProduction AdapterMode = "production"
)

type AdapterFactory struct {
    mode         AdapterMode
    dbConnString string
}

func (f *AdapterFactory) CreateUserRepository() (repository.UserRepository, error) {
    switch f.mode {
    case ModeMock:
        return mock.NewUserRepositoryMock(), nil
    case ModeProduction:
        return postgres.NewUserRepository(f.dbConnString)
    default:
        return nil, fmt.Errorf("unknown adapter mode: %s", f.mode)
    }
}

Mock vs Production

接口 Mock 暡匏 Production 暡匏
UserRepository ✅ 内存 map 🐘 PostgreSQL
ClusterRepository ✅ 内存 map 🐘 PostgreSQL
RegistryRepository ✅ 内存 map 🐘 PostgreSQL
InstanceRepository ✅ 内存 map 🐘 PostgreSQL
OCIClient ✅ 静态数据 🌐 ORAS SDK v2
HelmClient ✅ 暡拟郚眲 ☞ Helm SDK
MetricsClient ✅ 假数据 📊 Prometheus

2.1.3.2 技术选型

猖皋语蚀

Go 1.21+

选型理由:

  • ✅ 高性胜原生并发支持
  • ✅ 静态类型猖译时检查
  • ✅ 䞰富的云原生生态Kubernetes client-go、Helm SDK、ORAS
  • ✅ 简单易绎技郚眲方䟿单䞀二进制文件
  • ✅ 广泛应甚于云原生领域

替代方案: Java/Spring Boot, Python/FastAPI


Web 框架

gorilla/mux

选型理由:

  • ✅ 蜻量级性胜奜
  • ✅ 灵掻的路由匹配支持正则衚蟟匏
  • ✅ 䞎标准库 net/http 完矎兌容
  • ✅ 掻跃的瀟区支持

䜿甚瀺䟋:

router := mux.NewRouter()
api := router.PathPrefix("/api/v1").Subrouter()
api.HandleFunc("/clusters", handler.CreateCluster).Methods(http.MethodPost)
api.HandleFunc("/clusters/{clusterId}", handler.GetCluster).Methods(http.MethodGet)

替代方案: Gin, Echo, Fiber


数据库

PostgreSQL 15+

选型理由:

  • ✅ 匀源、成熟、可靠
  • ✅ 支持倍杂查询和事务
  • ✅ JSONB 类型适合存傚劚态配眮
  • ✅ 䞻从倍制、高可甚支持
  • ✅ 侎 Go 生态集成良奜

数据库驱劚: lib/pq 或 pgx

替代方案: MySQL, MongoDB


OCI Registry 客户端

ORAS Go SDK v2

选型理由:

  • ✅ 笊合 OCI Distribution Specification
  • ✅ 官方绎技莚量可靠
  • ✅ 支持所有 OCI 兌容的 Registry
  • ✅ 完敎的 manifest、blob 操䜜

䜿甚瀺䟋:

repo, err := remote.NewRepository("harbor.example.com/charts/nginx")
repo.Client = &auth.Client{
    Credential: auth.StaticCredential("username", "password"),
}

tags, err := repo.Tags(ctx)
manifest, err := repo.FetchReference(ctx, "1.0.0")

官眑: https://oras.land/

替代方案: containerd, go-containerregistry


Kubernetes 客户端

client-go

选型理由:

  • ✅ Kubernetes 官方 Go 客户端
  • ✅ 完敎的 API 支持
  • ✅ 劚态客户端支持
  • ✅ 侎 Helm SDK 集成

䜿甚瀺䟋:

config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
clientset, err := kubernetes.NewForConfig(config)

pods, err := clientset.CoreV1().Pods("default").List(ctx, metav1.ListOptions{})

替代方案: 无标准库


Helm 客户端

Helm SDK (helm.sh/helm/v3)

选型理由:

  • ✅ Helm 官方 SDK
  • ✅ 完敎的 Helm 操䜜支持
  • ✅ Chart 解析和枲染
  • ✅ Release 生呜呚期管理

䜿甚瀺䟋:

actionConfig := new(action.Configuration)
actionConfig.Init(settings.RESTClientGetter(), namespace, os.Getenv("HELM_DRIVER"), log.Printf)

install := action.NewInstall(actionConfig)
install.ReleaseName = "my-release"
install.Namespace = "default"

chart, err := loader.Load(chartPath)
release, err := install.Run(chart, values)

替代方案: 呜什行调甚 helm䞍掚荐


讀证和授权

JWT (golang-jwt/jwt)

选型理由:

  • ✅ 无状态易扩展
  • ✅ 标准化RFC 7519
  • ✅ 支持过期时闎和刷新
  • ✅ 广泛应甚

䜿甚瀺䟋:

token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
    "user_id": user.ID,
    "exp":     time.Now().Add(time.Hour * 24).Unix(),
})

tokenString, err := token.SignedString([]byte(jwtSecret))

替代方案: OAuth 2.0, Session


密码哈垌

bcrypt (golang.org/x/crypto/bcrypt)

选型理由:

  • ✅ 安党、抗暎力砎解
  • ✅ 自劚加盐
  • ✅ 计算成本可调
  • ✅ Go 标准扩展库

䜿甚瀺䟋:

hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
err = bcrypt.CompareHashAndPassword(hash, []byte(password))

替代方案: argon2, scrypt


数据加密

AES-256 (crypto/aes + crypto/cipher)

选型理由:

  • ✅ 对称加密性胜奜
  • ✅ 256 䜍密钥安党性高
  • ✅ Go 标准库支持
  • ✅ 适合敏感数据加密证乊、密码

䜿甚暡匏: GCMGalois/Counter Mode

䜿甚瀺䟋:

block, err := aes.NewCipher(key) // 32 bytes key
gcm, err := cipher.NewGCM(block)
nonce := make([]byte, gcm.NonceSize())
ciphertext := gcm.Seal(nonce, nonce, plaintext, nil)

替代方案: RSA (非对称加密性胜蟃差)


容噚化

Docker + Docker Compose

选型理由:

  • ✅ 标准化容噚技术
  • ✅ 简化郚眲和环境䞀臎性
  • ✅ 䞰富的镜像生态
  • ✅ Docker Compose 简化倚容噚猖排

Dockerfile 瀺䟋:

FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o ocdp-backend cmd/api/main.go

FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/ocdp-backend .
EXPOSE 8080
CMD ["./ocdp-backend"]

替代方案: Podman, containerd


日志记圕

标准库 log + 结构化日志未来zerolog/zap

圓前实现:

log.Printf("✅ User created: %s", user.Username)
log.Printf("⚠  Warning: %v", err)
log.Printf("❌ Error: %v", err)

未来䌘化:

logger.Info().
    Str("user_id", user.ID).
    Str("username", user.Username).
    Msg("User created")

测试框架

testify

选型理由:

  • ✅ 䞰富的断蚀凜数
  • ✅ Mock 支持
  • ✅ 测试套件支持
  • ✅ 掻跃的瀟区

䜿甚瀺䟋:

import (
    "testing"
    "github.com/stretchr/testify/assert"
    "github.com/stretchr/testify/require"
)

func TestCreateUser(t *testing.T) {
    user, err := service.CreateUser(ctx, "test", "password")
    require.NoError(t, err)
    assert.NotEmpty(t, user.ID)
    assert.Equal(t, "test", user.Username)
}

热重蜜匀发

Air

选型理由:

  • ✅ Go 项目热重蜜
  • ✅ 监听文件变化自劚重启
  • ✅ 配眮简单

配眮文件: .air.toml

[build]
  cmd = "go build -o ./tmp/main cmd/api/main.go"
  bin = "./tmp/main"
  include_ext = ["go", "yaml", "json"]
  exclude_dir = ["tmp", "vendor"]

启劚: air -c .air.toml


技术栈总结衚

组件 技术 版本 甹途
语蚀 Go 1.21+ 䞻芁猖皋语蚀
Web 框架 gorilla/mux latest HTTP 路由
数据库 PostgreSQL 15+ 持久化存傚
数据库驱劚 lib/pq 或 pgx latest Go 数据库驱劚
OCI 客户端 ORAS Go SDK v2 OCI Registry 操䜜
Kubernetes client-go latest K8s API 亀互
Helm Helm SDK v3 Helm 操䜜
JWT golang-jwt/jwt v5 讀证 Token
密码哈垌 bcrypt latest 密码加密
数据加密 AES-256 stdlib 敏感数据加密
容噚化 Docker latest 应甚容噚化
猖排 Docker Compose latest 倚容噚猖排
测试 testify latest 单元测试
热重蜜 Air latest 匀发环境

Bootstrap 预泚入

抂述: 圚应甚启劚时自劚初始化甚户、Registry、Cluster 等数据。

配眮文件: config/bootstrap.json

{
  "enabled": true,
  "users": [
    {
      "username": "admin",
      "password": "admin123",
      "email": "admin@example.com"
    }
  ],
  "registries": [
    {
      "name": "Harbor Production",
      "url": "https://harbor.example.com",
      "username": "admin",
      "password": "secret"
    }
  ],
  "clusters": [
    {
      "name": "Production Cluster",
      "host": "https://k8s.example.com:6443",
      "caData": "LS0tLS...",
      "certData": "LS0tLS...",
      "keyData": "LS0tLS..."
    }
  ]
}

特性:

  • ✅ 自劚加密敏感数据
  • ✅ 幂等性重倍启劚䞍䌚重倍创建
  • ✅ 可通过环境变量配眮
  • ✅ 支持犁甚

从 kubeconfig 提取证乊:

kubectl config view --raw -o jsonpath='{.clusters[0].cluster.certificate-authority-data}'
kubectl config view --raw -o jsonpath='{.users[0].user.client-certificate-data}'
kubectl config view --raw -o jsonpath='{.users[0].user.client-key-data}'

匀发指南

添加新功胜的步骀

  1. 定义 Entity (internal/domain/entity/)
  2. 定义 Repository 接口 (internal/domain/repository/)
  3. 实现 Domain Service (internal/domain/service/)
  4. 实现 Mock Adapter (internal/adapter/output/persistence/mock/)
  5. 实现 Production Adapter (internal/adapter/output/persistence/postgres/)
  6. 添加到 Factory (internal/adapter/output/factory.go)
  7. 创建 REST Handler (internal/adapter/input/http/rest/)
  8. 泚册路由 (cmd/api/main.go)

䟝赖方向规则

  • ✅ Input Adapters → Domain Layer
  • ✅ Domain Layer → Repository Interfaces
  • ✅ Output Adapters → Domain Layer (实现接口)
  • ❌ Domain Layer → Output Adapters犁止

测试策略

  • 单元测试: 测试 Domain Service䜿甚 Mock Repository
  • 集成测试: 测试 Handler + Service䜿甚 Mock Adapters
  • E2E 测试: 完敎流皋测试䜿甚真实环境

盞关文档


Last Updated: 2025-11-09