2. 接口调用规范设计原则

在混沌工程基线核验场景中,接口调用规范是保障实验注入、状态采集、结果判定一致性的核心契约。本章围绕 RESTful 设计原则、幂等性设计、版本控制策略 和 错误码规范 四个维度展开,为后续模板驱动核验提供可执行的接口契约基线。

2.1 RESTful 设计原则

混沌工程控制面与靶场之间的所有交互接口必须遵循 RESTful 风格,以资源为中心、以 HTTP 动词为操作语义。基线核验要求接口路径、请求方法、响应状态码三者严格对齐,避免歧义。

资源类型 GET(查询) POST(创建/触发) PUT(全量替换) DELETE(删除)
实验模板 /templates/{id} /templates /templates/{id} /templates/{id}
混沌实验 /experiments/{id} /experiments /experiments/{id} /experiments/{id}
基线指标 /baselines/{scope} /baselines /baselines/{scope} /baselines/{scope}
核验报告 /reports/{expId} /reports — /reports/{expId}
基线核验要点: 所有 POST 请求必须返回 201 Created 及资源完整 URI;所有 GET 请求必须支持 ?fields= 参数实现字段裁剪,减少混沌实验高频轮询时的带宽开销。
RESTful 资源与操作映射 RESTful 资源与操作映射 实验模板 混沌实验 基线指标 核验报告 HTTP 操作映射 GET 查询 POST 创建 PUT 替换 DELETE 删除 每个资源路径对应唯一语义,禁止在 GET 请求中使用 request body 传递查询条件

2.2 幂等性设计

混沌实验注入、基线采集、核验触发等操作在网络抖动或控制面重试时,必须保证多次调用与单次调用的副作用一致。幂等性设计直接决定基线核验结果的可靠性。

  • GET / HEAD / OPTIONS:天然幂等,响应可缓存。
  • PUT / DELETE:语义幂等,服务端需按资源当前状态处理,重复执行不产生额外副作用。
  • POST:非幂等,必须引入 幂等键(Idempotency-Key) 机制。
幂等键实现规范: 客户端在 POST 请求头中携带 Idempotency-Key: <UUID>,服务端缓存该键及其响应结果(TTL 至少 24 小时)。重复请求携带相同键时,直接返回缓存响应,不重复执行实验注入或基线写入。
// 幂等键处理伪代码(服务端中间件)
func IdempotencyMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        if r.Method == http.MethodPost {
            key := r.Header.Get("Idempotency-Key")
            if key == "" {
                http.Error(w, "Missing Idempotency-Key", http.StatusBadRequest)
                return
            }
            if cached, ok := cache.Get(key); ok {
                // 直接返回缓存结果,不执行实际逻辑
                w.WriteHeader(cached.StatusCode)
                w.Write(cached.Body)
                return
            }
            // 记录响应到缓存后再返回
            recorder := &responseRecorder{ResponseWriter: w}
            next.ServeHTTP(recorder, r)
            cache.Set(key, recorder.Result(), 24*time.Hour)
        } else {
            next.ServeHTTP(w, r)
        }
    })
}

2.3 版本控制策略

混沌工程基线核验接口必须支持平滑演进,避免因模板或实验定义变更导致核验管道断裂。推荐采用 URL 路径版本 与 请求头版本 双轨策略。

策略 示例 适用场景 基线核验影响
URL 路径版本 /v1/experiments → /v2/experiments 重大不兼容变更(如请求结构重写) 核验脚本需显式指定版本号,支持多版本并行核验
请求头版本 Accept: application/vnd.chaos.v2+json 字段增减、可选参数调整 核验工具通过协商内容类型自动适配,降低脚本维护成本
查询参数版本 /experiments?version=2 临时兼容过渡期 不推荐用于基线核验,易被缓存污染导致版本混淆
版本废弃规则: 每个大版本至少保持 6 个月并行期,废弃前必须在响应头 Deprecation: true 和 Sunset: <RFC1123 日期> 中明确告知客户端。基线核验调度器应订阅版本废弃事件,提前迁移核验模板。
版本控制双轨策略 版本控制双轨策略 混沌控制面 (客户端) URL 路径版本 请求头版本 靶场服务端 路由分发 版本协商 兼容适配 基线核验模板必须声明所依赖的 API 版本范围,服务端返回版本映射表供核验工具自动选择

2.4 错误码规范

统一的错误码体系是混沌工程基线核验自动化判定的基础。所有接口错误响应必须遵循固定 JSON 结构,并按照 功能模块 + 错误类型 + 具体原因 三级编码。

// 标准错误响应结构
{
  "error": {
    "code": "EXP-4001",
    "message": "实验模板参数校验失败",
    "details": {
      "field": "duration_seconds",
      "reason": "值 0 不在允许范围 [10, 3600] 内",
      "constraint": "min=10, max=3600"
    },
    "trace_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
  }
}
错误码前缀 模块 HTTP 状态码 示例
TMP- 模板管理 400 / 404 / 409 TMP-4002 模板引用循环
EXP- 实验执行 400 / 500 / 503 EXP-5001 注入器内部错误
BAS- 基线管理 400 / 404 / 412 BAS-4120 基线数据过期
RPT- 核验报告 400 / 404 / 422 RPT-4221 核验指标缺失
AUTH- 认证授权 401 / 403 AUTH-4030 靶场访问被拒绝
错误码可扩展规则: 错误码为 8 位定长字符串(前缀 3 位 + 连字符 + 4 位数字)。数字部分:1xxx 为请求参数类错误,2xxx 为资源状态类错误,3xxx 为权限类错误,4xxx 为依赖服务错误,5xxx 为内部错误。基线核验工具根据错误码前缀和数字范围自动决定重试、告警或终止。