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= 参数实现字段裁剪,减少混沌实验高频轮询时的带宽开销。
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 日期> 中明确告知客户端。基线核验调度器应订阅版本废弃事件,提前迁移核验模板。
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 为内部错误。基线核验工具根据错误码前缀和数字范围自动决定重试、告警或终止。