推荐答案
在 TypeScript 中,可以通过装饰器来实现熔断和降级功能。熔断和降级是微服务架构中常用的容错机制,用于在服务出现故障或超时时,快速失败并返回默认值或降级逻辑,避免系统雪崩。
实现步骤
- 定义熔断器装饰器:通过装饰器包装目标方法,实现熔断逻辑。
- 定义降级装饰器:通过装饰器包装目标方法,实现降级逻辑。
- 组合使用:将熔断器和降级装饰器组合使用,确保在服务不可用时执行降级逻辑。
示例代码
// www.javascriptcn.com code example
// 熔断器装饰器
function CircuitBreaker(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
let isOpen = false;
let failureCount = 0;
const failureThreshold = 3;
const resetTimeout = 5000;
descriptor.value = function (...args: any[]) {
if (isOpen) {
throw new Error("Service is unavailable due to circuit breaker.");
}
try {
const result = originalMethod.apply(this, args);
failureCount = 0; // 重置失败计数
return result;
} catch (error) {
failureCount++;
if (failureCount >= failureThreshold) {
isOpen = true;
setTimeout(() => {
isOpen = false;
}, resetTimeout);
}
throw error;
}
};
return descriptor;
}
// 降级装饰器
function Fallback(fallbackFunction: Function) {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
try {
return originalMethod.apply(this, args);
} catch (error) {
return fallbackFunction.apply(this, args);
}
};
return descriptor;
};
}
// 示例服务类
class MyService {
@CircuitBreaker
@Fallback(() => "Fallback response")
async fetchData() {
// 模拟服务调用
throw new Error("Service error");
}
}
// 使用示例
const service = new MyService();
service.fetchData().then(console.log).catch(console.error); // 输出: Fallback response本题详细解读
熔断器装饰器
熔断器装饰器 CircuitBreaker 通过包装目标方法,实现了以下功能:
- 失败计数:当方法调用失败时,增加失败计数。
- 熔断机制:当失败计数达到阈值时,打开熔断器,阻止后续调用。
- 自动恢复:在设定的超时时间后,自动关闭熔断器,允许再次尝试调用。
降级装饰器
降级装饰器 Fallback 通过包装目标方法,实现了以下功能:
- 异常捕获:捕获目标方法抛出的异常。
- 降级逻辑:在捕获到异常时,执行降级逻辑并返回降级结果。
组合使用
通过将 CircuitBreaker 和 Fallback 装饰器组合使用,可以在服务不可用时快速失败并执行降级逻辑,从而保证系统的稳定性和可用性。
应用场景
这种装饰器模式适用于微服务架构中的服务调用,特别是在高并发场景下,能够有效防止因某个服务故障导致的系统雪崩。