规范与外部 API/服务的集成方式,确保集成可靠、可维护、可降级,避免第三方服务故障拖垮自己的系统,同时管理好密钥和成本。
- 集成新的第三方 API/服务时(支付、邮件、短信、地图、AI 等)
- 第三方服务变更 API 版本时
- 第三方服务出现故障/降级时
- 评估是否替换现有第三方服务时
- 管理 API 密钥和配额时
评估维度:
| 维度 | 关注点 |
|---|---|
| 功能匹配 | 是否满足需求?覆盖度多少? |
| 可靠性 | SLA 承诺?历史故障记录? |
| 性能 | 延迟?吞吐量?限流策略? |
| 成本 | 免费额度?计费方式?预估月费? |
| 安全 | 数据传输加密?合规认证? |
| 文档质量 | 文档是否清晰完整?有无 SDK? |
| 锁定风险 | 迁移成本?数据可导出? |
| 替代方案 | 有无备选?自研可行性? |
评估结论模板:
## 第三方服务评估:[服务名]
- 用途:[解决什么问题]
- 候选方案:[列出 2-3 个]
- 选定方案:[最终选择]
- 选择理由:[为什么选这个]
- 风险评估:[主要风险及应对]
- 成本预估:[月/年费用]
- 退出策略:[如何迁移/替换]核心原则:
- 隔离:第三方调用封装在独立模块/适配层
- 降级:第三方不可用时系统核心功能仍可用
- 超时:所有外部调用必须设置超时
- 重试:幂等操作可重试,非幂等需谨慎
- 熔断:连续失败时快速失败,不拖垮系统
适配层模式:
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ 业务逻辑 │ ──→ │ 适配层/网关 │ ──→ │ 第三方 API │
│ (不直接调用) │ │ (封装+降级) │ │ (外部服务) │
└─────────────┘ └──────────────┘ └─────────────┘
适配层职责:
- 统一请求/响应格式转换
- 错误处理和重试逻辑
- 超时和熔断控制
- 日志记录
- 降级/兜底逻辑
- API 版本兼容
密钥管理规则:
- 永远不要硬编码 API Key
- 使用环境变量或密钥管理服务
- 不同环境使用不同密钥
- 密钥定期轮换
- 最小权限原则(只申请需要的 scope)
- 密钥泄露立即轮换
配置结构:
# .env(不提交到版本控制)
PAYMENT_API_KEY=sk_live_xxx
PAYMENT_API_SECRET=xxx
PAYMENT_WEBHOOK_SECRET=whsec_xxx
PAYMENT_TIMEOUT_MS=5000
PAYMENT_RETRY_COUNT=3错误分类:
| 类型 | 示例 | 处理方式 |
|---|---|---|
| 暂时性错误 | 超时、429、503 | 重试(指数退避) |
| 永久性错误 | 400、401、404 | 记录日志、返回友好错误 |
| 服务不可用 | 连接失败、DNS 错误 | 熔断 + 降级 |
| 数据错误 | 响应格式变化 | 告警 + 兜底 |
降级策略:
- 缓存兜底:返回上次成功的缓存数据
- 功能降级:关闭依赖第三方的非核心功能
- 队列缓冲:请求入队,服务恢复后重试
- 静态兜底:返回默认/静态内容
- 用户提示:友好告知用户稍后重试
重试策略:
重试次数:最多 3 次
退避策略:指数退避 + 随机抖动
第 1 次:1s + random(0-500ms)
第 2 次:2s + random(0-500ms)
第 3 次:4s + random(0-500ms)
幂等性:仅对 GET 或幂等操作重试
Webhook 安全:
- 验证签名(HMAC)
- 验证来源 IP(如果提供)
- 使用 HTTPS 端点
- 幂等处理(同一事件可能重复发送)
Webhook 处理流程:
1. 验证签名
2. 快速返回 200(不阻塞)
3. 异步处理业务逻辑
4. 记录原始 payload(用于排查)
5. 处理失败时重试/告警
监控指标:
- 调用成功率(目标 > 99%)
- 平均响应时间
- 错误率及错误类型分布
- 配额使用率
- 费用趋势
成本管理:
- 设置用量告警(达到预算 80% 时通知)
- 了解计费模型(按次/按量/包月)
- 缓存减少不必要调用
- 批量操作减少请求次数
- 定期审查是否有更优方案
API 版本升级:
- 关注第三方变更通知/Changelog
- 在适配层做版本兼容
- 新版本先在测试环境验证
- 灰度切换(如果支持)
- 确认稳定后移除旧版本代码
退出/替换策略:
- 适配层设计时考虑可替换性
- 数据定期导出备份
- 了解数据迁移方案
- 保持对替代方案的了解
- 集成前有评估记录
- 第三方调用封装在适配层
- 所有外部调用有超时设置
- 实现了重试和熔断机制
- 有降级/兜底方案
- API 密钥通过环境变量管理
- 密钥未提交到版本控制
- Webhook 有签名验证
- 有调用监控和告警
- 了解费用和配额限制
- 有退出/替换策略
| 输出物 | 格式 | 存放位置 |
|---|---|---|
| 服务评估文档 | Markdown | docs/integrations/eval-xxx.md |
| 适配层代码 | 源代码 | src/adapters/ 或 src/services/ |
| 集成配置 | 环境变量 | .env / 密钥管理 |
| 监控面板 | 仪表盘 | 监控平台 |
| 误区 | 正确做法 |
|---|---|
| 业务代码直接调用第三方 API | 通过适配层隔离 |
| 不设超时 | 所有外部调用必须有超时 |
| 第三方挂了自己也挂 | 设计降级方案 |
| 密钥写在代码里 | 环境变量 + 密钥管理 |
| 不验证 Webhook 签名 | 必须验证,防伪造 |
| 无限重试 | 有限重试 + 指数退避 + 熔断 |
| 不考虑替换可能 | 适配层设计保持可替换 |