3. 标准模板结构定义:模板元数据、请求模板、响应模板、错误模板的通用字段设计

标准模板是混沌工程基线核验的契约载体。一个完整的模板由模板元数据、请求模板、响应模板和错误模板四个部分组成。本章定义每个部分的通用字段及其设计原则,确保模板在不同微服务、不同协议(HTTP/gRPC/消息队列)之间具备一致的解析能力。

3.1 模板元数据(Template Metadata)

模板元数据描述模板本身的身份、版本、归属和生命周期信息,是模板检索、版本管理和基线匹配的入口。通用字段如下:

字段名 类型 必填 说明
template_id string 是 全局唯一模板标识,推荐格式:{service}.{api}.{version}
name string 是 模板可读名称,如“订单查询基线模板”
version string 是 语义化版本号,遵循 major.minor.patch
service string 是 所属微服务名称,用于路由和归属判断
api_path string 是 接口路径或操作标识,如 /v1/orders/{id}
method string 是 HTTP 方法(GET/POST/PUT/DELETE)或 RPC 方法名
protocol string 是 协议类型:http、grpc、mq
status enum 是 模板状态:active、deprecated、archived
created_at datetime 是 模板创建时间(ISO 8601)
updated_at datetime 否 最后更新时间
tags map[string]string 否 自定义标签,用于环境、团队、场景分类
设计要点: template_id 应具备幂等性,相同 template_id 且 version 相同时,模板内容必须完全一致。混沌工程平台通过 service + api_path 快速定位待注入的基线模板。

3.2 请求模板(Request Template)

请求模板定义混沌工程注入时发送的请求结构,包括请求头、查询参数、请求体和校验规则。通用字段如下:

字段名 类型 必填 说明
headers map[string]string 否 请求头键值对,支持 {{variable}} 占位符
query_params map[string]string 否 URL 查询参数,支持动态注入
body object 否 请求体 JSON Schema 或示例值
body_type string 否 请求体格式:json、form、protobuf
variable_definitions array 否 占位符变量定义列表,包含 name、type、default、range
validation_rules array 否 请求前置校验规则,如字段必填、类型、长度限制
示例:请求模板片段(JSON)
{
  "headers": {
    "Content-Type": "application/json",
    "X-Request-Id": "{{request_id}}"
  },
  "query_params": {
    "page": "{{page}}",
    "size": "{{size}}"
  },
  "body": {
    "order_id": "{{order_id}}",
    "status": "{{status}}"
  },
  "variable_definitions": [
    {
      "name": "order_id",
      "type": "string",
      "default": "ORD-2024-001",
      "range": null
    },
    {
      "name": "page",
      "type": "integer",
      "default": 1,
      "range": [1, 1000]
    }
  ]
}

3.3 响应模板(Response Template)

响应模板定义基线核验时对返回结果的期望结构,用于比对实际响应与基线之间的差异。通用字段如下:

字段名 类型 必填 说明
status_code integer 是 期望的 HTTP 状态码或 gRPC 状态码
headers map[string]string 否 期望的响应头键值对,支持通配符 *
body_schema object 否 响应体 JSON Schema,定义字段类型、必填、枚举值
body_example object 否 响应体示例值,用于快速比对
latency_max_ms integer 否 期望最大响应延迟(毫秒),超时则标记为基线偏离
comparison_mode enum 是 比对模式:exact(精确匹配)、schema(结构匹配)、lenient(宽松匹配)
ignore_fields array[string] 否 比对时忽略的字段路径,如 $.timestamp
注意: comparison_mode 为 exact 时,实际响应必须与 body_example 完全一致;schema 模式只校验结构不校验具体值;lenient 模式允许额外字段存在。混沌实验通常使用 schema 模式,避免因动态值(如时间戳、随机 ID)导致误报。

3.4 错误模板(Error Template)

错误模板定义混沌工程注入时预期可能出现的错误场景,用于验证系统在异常条件下的容错行为。通用字段如下:

字段名 类型 必填 说明
error_code string 是 错误码,如 ORDER_NOT_FOUND、INTERNAL_ERROR
http_status integer 是 对应的 HTTP 状态码,如 404、500
message_pattern string 否 错误消息的正则表达式或通配符模式
retryable boolean 是 该错误是否可重试
impact_level enum 是 影响等级:critical、major、minor、info
expected_behavior string 否 预期系统行为描述,如“返回降级数据”、“触发熔断”
error_body_schema object 否 错误响应体的 JSON Schema
示例:错误模板片段(JSON)
{
  "error_code": "ORDER_SERVICE_TIMEOUT",
  "http_status": 504,
  "message_pattern": ".*timeout.*",
  "retryable": true,
  "impact_level": "critical",
  "expected_behavior": "触发网关重试机制,最多重试3次后返回降级响应",
  "error_body_schema": {
    "type": "object",
    "required": ["code", "message"],
    "properties": {
      "code": { "type": "string", "enum": ["ORDER_SERVICE_TIMEOUT"] },
      "message": { "type": "string" },
      "request_id": { "type": "string" }
    }
  }
}

3.5 四模板关系与核验流程

下图展示了四个模板在混沌工程基线核验中的协作关系:

标准模板四元组与基线核验流程 模板元数据 身份 · 版本 · 归属 请求模板 入参 · 变量 · 校验 响应模板 期望结构 · 比对模式 错误模板 错误码 · 影响等级 混沌核验引擎 基线核验报告 错误模板仅在异常场景 触发时参与核验比对

3.6 通用字段设计原则

  • 最小必填原则: 每个模板只定义最少的必填字段,其余字段提供默认值或允许为空,降低模板编写门槛。
  • 向前兼容原则: 新增字段时不得破坏已有模板的解析逻辑,旧模板缺失新字段时使用默认值。
  • 可扩展原则: 所有模板支持 extensions 字段(map[string]any),用于承载业务自定义属性。
  • 可追溯原则: 模板元数据中的 version 和 updated_at 必须随每次变更递增,确保基线版本可追溯。
  • 环境隔离原则: 通过 tags 字段区分开发、测试、预发、生产环境的模板配置,避免环境间基线污染。
实践建议: 在混沌工程平台中,建议将四模板存储为独立的 YAML 文件,通过 template_id + version 进行关联。平台启动时预加载所有活跃模板,运行时仅根据 service 和 api_path 匹配对应的模板四元组,减少运行时解析开销。