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 匹配对应的模板四元组,减少运行时解析开销。