组合配置(多能力协作)
多个能力可以同时生效,互不冲突。以下示例展示常见的组合方式。
完整组合示例
javascript
const requestManager = setupRequestGuard(axios, {
// 全局默认配置
defaults: {
// 防重:默认 block 策略
duplicate: {
strategy: 'block',
message: '请勿重复提交'
},
// 重试:3 次指数退避
retry: {
attempts: 3,
delay: 200,
backoff: 'exponential'
},
// 熔断:5 次失败后熔断
circuitBreaker: {
failCount: 5,
window: 60000,
recoverDelay: 30000
}
},
// 规则系统:精细化控制
rules: [
// 所有 POST 请求开启防重
{ method: 'post', duplicate: true },
// 查询接口:使用 reuse 策略 + 自动重试
{
url: /\/api\/(list|search|query)/,
method: 'get',
duplicate: { strategy: 'reuse' },
retry: { attempts: 2, delay: 500 }
},
// 核心服务:开启熔断保护
{
url: /\/api\/(payment|order)/,
circuitBreaker: {
type: 'domain',
failCount: 3,
recoverDelay: 60000
}
}
]
});
// ============ 请求级:某个接口同时使用多能力 ============
await axios.post('/api/payment/create', paymentData, {
requestGuard: {
// 防重:阻断重复提交
duplicate: { strategy: 'block', message: '支付处理中...' },
// 重试:幂等操作可以安全重试
retry: { attempts: 2, delay: 1000 },
// 熔断:支付服务异常时自动停止
circuitBreaker: { failCount: 3 }
}
});默认 excludeMethods 在规则层互斥
重要:同一条 rule 上 duplicate 与 retry 不会同时对一个方法生效
duplicate 与 retry 的默认排除方法是互补的(这是有意设计:幂等读该重试不该去重,写操作该去重不该盲目重试):
| HTTP 方法 | duplicate 默认 | retry 默认 | 同一 rule 同开 duplicate+retry 的结果 |
|---|---|---|---|
GET / OPTIONS / HEAD | ⛔ 排除 | ✅ 生效 | 只有 retry 生效 |
POST / PUT / PATCH / DELETE | ✅ 生效 | ⛔ 排除 | 只有 duplicate 生效 |
默认值:duplicate excludeMethods: ['GET','OPTIONS','HEAD'],retry excludeMethods: ['POST','PUT','PATCH','DELETE']。两者并集覆盖了全部常见方法,所以单条规则同时配 duplicate 和 retry 时,任一方法都只会命中其中一个能力。
需要让某方法同时进入两个能力,有两种方式:
- 请求级显式配置:
config.requestGuard里的显式duplicate/retry不受excludeMethods限制,会同时生效。 - 覆盖默认
excludeMethods:在 rule 或defaults里把对应能力的excludeMethods改成[]或自定义集合。
