常见业务场景
从真实业务出发,开箱即用的配置参考。
场景一:电商下单防重
使用 block 策略 + 自定义 key + 消息提示,防止同一笔订单被重复创建:
javascript
import axios from 'axios';
import { setupRequestGuard } from '@hydd/request-guard';
// 全局接入
const requestManager = setupRequestGuard(axios, {
notify: (payload) => Toast.show(payload.message),
defaults: {
duplicate: {
strategy: 'block',
message: '订单处理中,请勿重复提交'
}
}
});
// 下单接口配置
const submitOrder = async (orderData) => {
return axios.post('/api/order/create', orderData, {
requestGuard: {
duplicate: {
strategy: 'block',
// 以业务订单 ID 作为判重依据,同一订单 ID 只允许提交一次
keyGenerator(config) {
return `order:create:${config.data?.orderId}`;
},
message: '正在提交订单,请稍候'
}
}
});
};场景二:列表查询去重 + 自动重试
使用 reuse 策略 + 规则匹配 + 重试,相同查询自动复用,失败自动重试:
javascript
const requestManager = setupRequestGuard(axios, {
rules: [
{
// 匹配所有列表查询接口
url: /\/api\/(list|search|query)/,
method: 'get',
// 相同查询复用首次结果
duplicate: {
strategy: 'reuse',
compareFields: ['method', 'url', 'params']
},
// 失败自动重试 2 次
retry: {
attempts: 3,
delay: 500,
backoff: 'exponential'
}
}
]
});
// 短时间内多次相同查询,只有第一次真正发出请求
// 失败后自动重试,所有等待方最终拿到相同结果
axios.get('/api/list', { params: { page: 1, size: 20 } });
axios.get('/api/list', { params: { page: 1, size: 20 } });场景三:全局接入 + ARMS 监控 + 熔断保护
完整的生产环境配置示例:
javascript
import { setupRequestGuard, RequestGuardLogger, ConsoleRequestGuardLogger } from '@hydd/request-guard';
// 自定义 Logger:接入 ARMS 远程监控
class ARMSLogger extends RequestGuardLogger {
write(event) {
// event: { level, event, message, namespace, timestamp, data }
__bl?.api(event.event, event.data);
}
}
// 全局接入
const requestManager = setupRequestGuard(axios, {
notify: (payload) => {
Toast.show({ content: payload.message, type: 'warning' });
},
// 日志:生产环境用 ARMS,开发环境用 Console
logger: process.env.NODE_ENV === 'production'
? new ARMSLogger({ devOnly: false, level: 'warn' })
: new ConsoleRequestGuardLogger({ devOnly: true }),
defaults: {
retry: { attempts: 3, delay: 200, backoff: 'exponential' },
circuitBreaker: {
failCount: 5,
window: 60000,
recoverDelay: 30000,
storage: 'session' // 刷新页面后状态保留
}
},
rules: [
// 所有 POST 防重
{ method: 'post', duplicate: true },
// 核心服务开启熔断
{ url: /\/api\/(payment|order|user)/, circuitBreaker: true }
]
});