CalcGuide · 技术博客主页 / 一页纸学习计划
🔥极高

API 契约与生产运行:OpenAPI、版本化和可观测

分类:Web 与后端 · 路径:docs/topics/openapi-operations/README.md

#rest#api#http#openapi

覆盖 OpenAPI 3.1、JSON Schema、兼容演进、文档工具、日志指标 tracing

父主题

REST API 设计与实现:从资源建模到可观测 API

子主题(0)

API 契约与生产运行:OpenAPI、版本化和可观测

0. 元信息

1. 学习路线

OpenAPI → lint/mock/SDK → compatibility → versioning → deploy → logs/metrics/tracing

2. 阶段周数分配

精简子主题不固定周数。按 §3 顺序完成,卡住时回到 RFC、契约样例和可重复请求。

3. 九阶段表

阶段核心知识实践产出学会标准
1术语与边界术语表不混淆相邻概念
2HTTP/标准语义请求矩阵能引用规范解释
3数据与状态schema/状态图正常与冲突可区分
4安全边界威胁清单非法路径被拒绝
5失败语义错误目录客户端能稳定处理
6兼容策略变更表能识别 breaking change
7工具验证curl/collection可重复运行
8自动检查契约测试修改后会报警
9小项目可运行交付第三方可复现

4. 第一周任务

精简版省略固定日程。做一个最小正常请求,再补认证失败、非法输入、冲突、重试与超时。

5. 阶段通用验收

精简版省略;每个产出至少保留命令、预期、实际与版本。

6. 最终验收

精简版省略;以 §3 第 9 阶段和 §9.4 问题口述检查为准。

7. 综合项目

精简版省略;成果并入父主题电商商品 / 订单 API。

本主题贡献

交付物清单

  1. oas/main.yaml:OpenAPI 3.1 主契约(聚合 3 个子主题),含 components.securitySchemeswebhooksx-codeSamplesx-tagGroups
  2. oas/.spectral.yaml + CI 截图:spectral / redocly / openapi-spec-validator 三个 lint 全通过;CI 跑完 0 error;
  3. clients/ts/ + clients/go/openapi-generator 生成 TS-Fetch + Go 客户端,含单元测试 1 个示例调用(含 traceparent 头与 Idempotency-Key);
  4. compat/diff.md + release-checklist.mdoasdiff breaking 报告 + 发布清单 8 条(含 SDK tag、deprecation 头、trace 串联、Spectral 0 error、Schemathesis 抽样、runbook 与 examples 对齐)。

验收标准

8. 推荐资料

精简版省略;使用 §9.3 和 §9.6 Source。

9. 学习资料汇聚(v0.3 自包含)

9.1 背景与动机

覆盖 OpenAPI 3.1、JSON Schema、兼容演进、文档工具、日志指标 tracing。API 一旦被客户端依赖,错误的语义会变成多年兼容成本。我们用规范、可运行样例和失败测试约束选择。

9.2 概念地图

flowchart LR
  Design[设计] --> Contract[HTTP/OpenAPI 契约]
  Contract --> Runtime[实现/网关]
  Runtime --> Client[客户端]
  Runtime --> Evidence[日志/指标/trace]
  Test[契约与失败测试] -.验证.-> Contract
  Test -.验证.-> Runtime

这张图把设计、实现、调用和证据串起来。任何规则都要能落到契约或运行时检查。

9.3 基础知识讲解

9.3.1 论文 / 规范

9.3.2 书

9.3.3 博客 / 文档

9.3.4 人物

9.3.5 方法

9.4 经典问题与经典案例

问题为什么重要最简答案
contract-first 还是 code-first影响客户端正确性和长期兼容写清语义、失败码、重试与测试证据
什么算 breaking change影响客户端正确性和长期兼容写清语义、失败码、重试与测试证据
版本放 path 还是 header影响客户端正确性和长期兼容写清语义、失败码、重试与测试证据
如何避免文档漂移影响客户端正确性和长期兼容写清语义、失败码、重试与测试证据
trace id 如何跨 Webhook影响客户端正确性和长期兼容写清语义、失败码、重试与测试证据
P99 高如何分层定位影响客户端正确性和长期兼容写清语义、失败码、重试与测试证据

9.4.1 实战片段:lint、breaking change、SDK、trace

# .spectral.yaml —— 团队 lint 规则
extends: ["spectral:oas"]
rules:
  oas3-api-servers: error
  operation-operationId: error
  operation-description: warn
  oas3-valid-media-example: error
  info-contact: off
  info-license: off
# 1. 校验契约
spectral lint openapi.yaml --ruleset .spectral.yaml
redocly lint openapi.yaml
openapi-spec-validator openapi.yaml

# 2. 看 breaking change
oasdiff breaking base/openapi.yaml openapi.yaml
npx @redocly/cli diff base/openapi.yaml openapi.yaml --format=markdown > diff.md

# 3. mock server(前端独立联调)
npx @stoplight/prism-cli mock openapi.yaml --port 4010

# 4. 生成客户端
openapi-generator-cli generate \
  -i openapi.yaml -g typescript-fetch -o clients/ts \
  --additional-properties=supportsES6=true,npmName=@acme/api-client

openapi-generator-cli generate \
  -i openapi.yaml -g go -o clients/go \
  --additional-properties=packageName=apiclient

# 5. Dredd / Schemathesis 契约测试
dredd openapi.yaml https://api.example.com --hookfiles=./hooks.js
schemathesis run openapi.yaml --base-url=https://staging.example.com \
  --checks all --hypothesis-max-examples=200
# 6. 兼容演进对照(伪 diff)
POST /v1/orders   ->  POST /v2/orders   # breaking:先并行 6 个月再切
order.id:int      ->  order.id:string   # breaking:类型变更
order.items[]     ->  + order.discounts  # 兼容:新增字段
+ order.taxRate                 # 兼容:新增字段
- order.legacyCode              # breaking:删除字段
# 7. trace context:跨 Webhook、消息、异步任务
curl -i -X POST https://api.example.com/orders \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer ...' \
  -H 'Idempotency-Key: 9f2b6c1a-1f3d-4b8e-9b6c-2a7f0b5c91a2' \
  -H 'traceparent: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01' \
  -H 'tracestate: acme=t61rcWkgMzE' \
  -d '{"productId":"p_1","quantity":2}'

# Webhook 投递时把 traceparent 透传给接收端
curl -X POST https://receiver.example.com/webhook \
  -H 'Content-Type: application/json' \
  -H 'X-Signature: sha256=...' \
  -H 'traceparent: 00-0af7651916cd43dd8448eb211c80319c-c3b8f1c5b6a0d2e0-01' \
  -d @payload.json
# 8. 发布 checklist(CI 跑完后人工/自动确认)
- spectral lint:0 error
- oasdiff breaking:0 行
- schemathesis 抽样:0 unexpected
- 客户端 SDK 已发布 tag,CI 引用的是 digest
- runbook 与 OpenAPI 的 examples 一致
- 旧 major 在网关被路由到旧服务并打 deprecation 头

9.5 学习难点

9.5 学习难点

9.6 技术标准与接口

9.6.1 Entity

名称版本组织状态 / 可访问性
OpenAPI Specification3.1OpenAPI Initiative正式;Apache-2.0 仓库,规范公开
JSON:API1.1JSON:API 社区正式;公开
JSON Schema2020-12JSON Schema / IETF 社区正式;公开
Problem Details for HTTP APIsRFC 7807IETF已被 RFC 9457 更新;RFC 公开
HALdraft-kelly-json-halIETF Internet-Draft / HAL 社区草案;公开

9.6.2 Scope

OpenAPI 描述 HTTP API;JSON Schema 描述数据约束;JSON:API 与 HAL 约定表示和链接;Problem Details 约定机器可读错误。它们不替代业务授权、事务设计或运行时保护。

9.6.3 Structure

OpenAPI 必会 pathsoperationsparametersrequestBodyresponsescomponentssecuritySchemes;JSON Schema 必会 typerequiredproperties、组合与引用;Problem Details 必会 type/title/status/detail/instance

9.6.4 Ecosystem

实现与工具包括 Swagger UI、Redoc、Spectral、OpenAPI Generator、Postman、Insomnia、Bruno、httpie、curl。API gateway 常用 Apigee、AWS API Gateway、Kong、Envoy。工具默认值不是规范。

9.6.5 Depth Tiers

层级可观察能力
L0知道这些标准解决什么问题
L1看懂 schema、operation 和 problem body
L2能正确编写、校验、生成客户端并调用
L3能解释语义、排错兼容/鉴权/缓存/限流问题
L4能设计扩展、治理规则与跨团队演进机制

本计划目标:L3

9.6.6 Source

10. 常见误区

11. 所有知识点分类(统一规则)

  1. 编程语言 2. 数据结构与算法 3. 计算机基础 4. 工程技术 5. Web 与后端 6. 前端与客户端 7. 数据与人工智能 8. 项目与职业能力 9. 安全与可靠性

本计划归属:Web 与后端 主 + 工程技术 辅。

直接依赖(3)

查看知识图谱 · 热度 🔥极高