通过维护一个滑动窗口内的错误计数器,并在每次请求前检查该计数是否超过预设阈值来实现熔断。具体做法是定义一个包含成功与失败计数的状态对象,在 fetch 的 then 和 catch 中分别更新计数并清理过期数据,当失败率高于设定值时直接抛出异常或返回默认值以阻断后续请求。

如何初始化熔断器并配置阈值参数
需要创建一个管理状态的类或工厂函数,接收最大允许失败次数作为参数。初始化时重置所有计数器,确保从干净的状态开始监控接口健康度。

class CircuitBreaker {
constructor(maxFailures = 5) {
this.maxFailures = maxFailures;
this.failures = [];
this.successes = [];
}
reset() {
this.failures = [];
this.successes = [];
}
recordSuccess() {
this.successes.push(Date.now());
this.reset();
}
recordFailure() {
this.failures.push(Date.now());
}
isOpen() {
const now = Date.now();
const windowSize = 60000; // 1 minute
this.failures = this.failures.filter(t => now - t < windowSize);
this.successes = this.successes.filter(t => now - t < windowSize);
return this.failures.length >= this.maxFailures;
}
}如何在 fetch 调用中集成熔断逻辑
在发起网络请求前调用 isOpen 方法判断状态,若熔断器开启则跳过实际请求并返回错误,否则执行请求并根据结果记录状态。
立即学习“Java免费学习笔记(深入)”;

async function fetchWithCircuit(url, breaker) {
if (breaker.isOpen()) {
throw new Error('Circuit is open');
}
try {
const response = await fetch(url);
if (!response.ok) throw new Error('HTTP error');
breaker.recordSuccess();
return await response.json();
} catch (error) {
breaker.recordFailure();
throw error;
}
}
const breaker = new CircuitBreaker(3);
try {
const data = await fetchWithCircuit('/api/data', breaker);
console.log(data);
} catch (e) {
console.error(e.message);
}基于连续三次失败后的具体行为表现是什么
当连续发生三次失败且都在一分钟窗口内时,isOpen 将返回 true,此时再次调用请求会立即抛出 "Circuit is open" 异常,不会触发任何网络 I/O 操作,从而保护后端服务免受雪崩效应影响。


















