Skip to content

组合配置(多能力协作)

多个能力可以同时生效,互不冲突。以下示例展示常见的组合方式。

完整组合示例

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']。两者并集覆盖了全部常见方法,所以单条规则同时配 duplicateretry 时,任一方法都只会命中其中一个能力

需要让某方法同时进入两个能力,有两种方式:

  1. 请求级显式配置config.requestGuard 里的显式 duplicate / retry 不受 excludeMethods 限制,会同时生效。
  2. 覆盖默认 excludeMethods:在 rule 或 defaults 里把对应能力的 excludeMethods 改成 [] 或自定义集合。

基于 MIT 许可发布