Microservices Contract Review — 跨服務 API 不一致的 8 個典型漏洞
微服務架構下 spec review 要看的東西。Consumer-Driven Contract Testing、Pact 工作流、跨服務 schema 漂移、版本兼容、事件驅動契約。
💡 本文原刊於 qa.9niche.com,2026-08 併入 9niche.com 懶人包,內容照原文完整搬遷。
目錄
1. 前言
微服務最大的痛不是寫不出來、是「服務 A 改了但 B 不知道」。Spec review 時除了單一 API、還要看跨服務的 contract 是不是會崩。這篇給你完整框架。
2. 為什麼微服務 spec 特別難 review
單體 review 看 1 個檔、微服務看 N × M 個介面。
3. 8 個典型漏洞
4. 漏洞 1: Schema 漂移
Review 該問:
- 新增欄位有 nullable / default?
- Consumer 端有 null check?
- Schema 變更通知流程?
5. 漏洞 2: Enum 擴張
// Provider 加新狀態
type OrderStatus = 'pending' | 'paid' | 'shipped' | 'cancelled' | 'refunded'; // ← 新加
// Consumer 寫法
switch (status) {
case 'pending': return '處理中';
case 'paid': return '已付款';
case 'shipped': return '已出貨';
case 'cancelled': return '已取消';
// ❌ refunded 沒處理 → undefined
}
Review 該問:
- 新增 enum 有對齊 consumer 嗎?
- Default case 處理?
- Enum 拓展屬 breaking change?(不全是、但要分類)
6. 漏洞 3: 版本不同步
Service A (v1) ---calls---> Service B (v2)
↑
v1 早已 deprecate
但 Service A 沒升
Review 該問:
- 版本 deprecation policy?
- 多少 consumer 用 v1?
- Migration 強制 deadline?
7. 漏洞 4: 錯誤碼變
Provider v1: error.code = "INSUFFICIENT_BALANCE"
Provider v2: error.code = "INSUFFICIENT_FUNDS" ← 改了
Consumer:
if (err.code === "INSUFFICIENT_BALANCE") { /* 處理 */ }
// ❌ v2 後永遠跑不到這
Review 該問:
- 錯誤碼有 changelog 嗎?
- 是否視為 breaking change?
8. 漏洞 5: Timeout 不一致
User → API Gateway (60s timeout)
→ Service A (10s)
→ Service B (30s)
→ DB (5s)
User 等了 60s 才看到錯誤、但 Service B 早超 A 的 timeout 了
Review 該問:
- 每層 timeout 是否 propagate?
- 是否設 deadline 一致?
- Retry 策略誰負責?
9. 漏洞 6: Retry 衝突
Review 該問:
- 哪一層 retry?
- Idempotency key?
- Exponential backoff?
10. 漏洞 7: 序列化版本
| 欄位 | Provider | Consumer 期待 |
|---|---|---|
| created_at | 1734567890 (Unix sec) | 2026-06-13T10:00:00Z (ISO) |
| price | 99 | 99.00 |
| status | "paid" | 1 (整數) |
Review 該問:
- 日期一律 ISO 8601?
- 數字 precision 規範?
- Enum 是 string 還是 int?
11. 漏洞 8: 訊息順序(async)
Producer 順序送:
msg1: order.created
msg2: order.paid
msg3: order.shipped
Consumer 收到:
msg3 (網路快)
msg1
msg2
Consumer 處理 msg3 時 → 「order 不存在」
Review 該問:
- 訊息有 sequence number?
- Consumer 有 idempotency?
- Out-of-order 容錯機制?
12. Consumer-Driven Contract Testing (CDC)
Pact 工作流
// Consumer (寫期望)
import { Pact } from '@pact-foundation/pact';
const provider = new Pact({
consumer: 'web-app',
provider: 'user-service',
});
await provider.addInteraction({
state: 'user 123 exists',
uponReceiving: 'a request for user 123',
withRequest: { method: 'GET', path: '/users/123' },
willRespondWith: {
status: 200,
body: { id: 123, email: '[email protected]' },
},
});
# Provider (verify 跑 pact file)
pact-verifier --provider-base-url http://localhost:8080 \
--pact-url ./pacts/web-app-user-service.json
Provider 改 schema 不符合 → CI 直接擋。
13. 微服務 Spec Review Checklist
14. QA 角度的工具
| 工具 | 用途 |
|---|---|
| Pact | REST + async contract test |
| Schemathesis | OpenAPI fuzz testing |
| Dredd | OpenAPI 對 implementation 比對 |
| GraphQL Inspector | GraphQL schema diff |
| Postman Mocks | 模擬 provider |
| WireMock | 自架 mock server |
15. 反模式
16. 給 QA Lead 的 5 句
- 微服務的 bug 不在單一服務、在介面
- Contract test > Integration test 為主、Integration 為輔
- 沒 deprecation policy = 沒 versioning
- Retry 一條鏈只一個地方做
- Trace ID 不傳 = debug 不可能
17. 最後
微服務 spec review 是 QA 在分散式系統的主場。單一服務的 spec review 用既有 Spec Review Checklist、跨服務用這份。導入 Pact + 強制 deprecation policy + 統一 timeout / retry — 三個月後 production incident 砍 80%。
相關連結
一份能在會議前用 15 分鐘掃完整份 spec 的 checklist。從前置條件、邊界、錯誤處理、狀態機到資料一致性,附使用範例。
AI 功能 spec review 完整指南。LLM 不確定性處理、評估指標、Prompt versioning、成本控制、安全護欄、法遵(EU AI Act / GDPR)、Fallback、人工 review 流程。
API spec 跟一般功能 spec 不同。Contract、Error code、Versioning、Auth、Rate limit、Idempotency 六大面向的審查清單,附 REST 設計檢查流程圖。
相關懶人包
2026 QA 趨勢實戰:我看到的 5 個轉變(AI、Shift-Left、Observability)
從手動 QA 到 AI 輔助、從測試金字塔到測試獎盃。這篇分享我這 10+ 年看 QA 從「測完才知道」到「shift-left + AI」的真實觀察。
AI / LLM 功能 Spec Review — 幻覺 / 評估 / 成本 / 法遵 8 個必問
AI 功能 spec review 完整指南。LLM 不確定性處理、評估指標、Prompt versioning、成本控制、安全護欄、法遵(EU AI Act / GDPR)、Fallback、人工 review 流程。
AI Agent 系統測試 — 自主執行 / 工具呼叫 / 多步推理的 QA 策略
測試 AI Agent 完整方法。Tool calling 驗證、Trajectory 評估、Failure mode 分類、無限迴圈防止、成本上限、安全 sandbox、Multi-agent 協作測試。
一般聲明
本站提供之資訊僅供參考,不保證其完整性與正確性。使用者應自行判斷資訊之適用性。