核心是将契约变为可执行代码并嵌入研发流水线:统一用openapi 3.0或protobuf定义版本化契约,自动生成代码与测试;消费者用mock验证请求响应,提供者自动校验契约符合性;变更需语义化版本控制与双向审批,保障向后兼容。

核心在于把契约从“文档”变成“可执行代码”,再让验证过程嵌入研发流水线。不依赖人工干预,也不靠环境就绪,契约本身驱动测试生成、执行与反馈。
契约必须以机器可读格式定义并版本化
放弃纯手工维护的 Swagger UI 或 Word 文档。统一采用 OpenAPI 3.0 或 Protobuf IDL 作为唯一契约源,所有服务接口变更必须先提交契约文件(如 user-api.yaml 或 order.proto),再生成代码和测试。
- 契约文件纳入 Git 仓库主干分支,配合 PR 检查:禁止无契约的新增接口,禁止未通过 schema 校验的修改
- 使用 openapi-generator 或 hz new -idl 自动生成 client stub、server handler 和基础测试骨架
- 每个契约文件标注 consumer 和 provider 标签,并关联所属服务名与团队,便于后续归因
消费者端自动生成可运行的 Mock 测试桩
在消费者服务的单元测试中,不调用真实下游,而是基于契约启动轻量 Mock Server,验证自身是否能正确构造请求、解析响应。
- 引入 Pact 或 Spring Cloud Contract 的 DSL,在测试中声明期望的交互(如 “POST /v1/orders 返回 201 + 含 order_id 字段”)
- 运行测试时自动导出 JSON 格式契约文件(pact.json),上传至中央 Pact Broker 或内部契约注册中心
- 失败即阻断:若消费者代码发出的请求结构或接受的响应字段与契约不符,测试直接报错,不生成契约
提供者端每日自动拉取契约并执行验证
提供者服务无需手动编写测试用例。CI 流水线定时(如每天凌晨)从契约中心拉取所有关联契约,启动本地服务实例,逐条发起真实请求并校验响应。
- 使用 contract-verifier 工具或 Hertz 内置的 provider test runner 执行验证
- 验证覆盖三类契约:数据结构(JSON Schema)、状态码与 Header、错误路径(如 400/404 响应体格式)
- 失败结果自动推送告警至对应服务负责人企业微信/钉钉群,并生成差异报告(如 “缺少字段 payment_status,契约要求必填”)
契约演化需双向审批与向后兼容保障
契约不是静态快照,但每次变更必须可控。禁止破坏性修改,新增字段默认可选,删除字段需标记 deprecated 并保留至少一个大版本。
- 引入 semantic versioning + contract diff tool,PR 提交契约变更时自动比对上一版,标出 BREAKING / NON-BREAKING
- 关键契约(如支付、用户中心)启用双签机制:消费者团队 + 提供者团队共同 approve 才能合入
- 灰度发布期间,新旧契约并行运行;监控平台实时统计各契约的实际调用量与错误率,辅助下线决策









