Java云原生实战:构建弹性微服务熔断系统
一、系统架构设计
请求监控 → 异常检测 → 熔断触发 → 降级处理 → 自动恢复
二、核心功能实现
1. 熔断器配置
@Configuration public class CircuitBreakerConfig { @Bean public CircuitBreakerRegistry circuitBreakerRegistry() { return CircuitBreakerRegistry.of( CircuitBreakerConfig.custom() .failureRateThreshold(50) // 失败率阈值 .slowCallRateThreshold(50) // 慢调用阈值 .slowCallDurationThreshold(Duration.ofSeconds(2)) .waitDurationInOpenState(Duration.ofSeconds(30)) .permittedNumberOfCallsInHalfOpenState(5) .slidingWindowType(SlidingWindowType.COUNT_BASED) .slidingWindowSize(10) .build() ); } @Bean public CircuitBreaker productServiceBreaker( CircuitBreakerRegistry registry) { return registry.circuitBreaker("productService"); } }
2. 熔断保护服务
@Service public class ProductService { private final CircuitBreaker circuitBreaker; private final ProductClient productClient; @Autowired public ProductService(CircuitBreaker productServiceBreaker, ProductClient productClient) { this.circuitBreaker = productServiceBreaker; this.productClient = productClient; } public Product getProduct(String id) { return circuitBreaker.executeSupplier( () -> productClient.getProduct(id), throwable -> getProductFromCache(id) // 降级方法 ); } private Product getProductFromCache(String id) { // 从缓存获取降级数据 } }
3. 熔断状态监听
@Component public class CircuitBreakerListener { @PostConstruct public void init() { CircuitBreakerRegistry registry = CircuitBreakerRegistry.ofDefaults(); registry.getEventPublisher() .onEntryAdded(entryAddedEvent -> { CircuitBreaker cb = entryAddedEvent.getAddedEntry(); cb.getEventPublisher() .onStateTransition(event -> { log.info("熔断器 {} 状态变更: {} → {}", cb.getName(), event.getStateTransition().getFromState(), event.getStateTransition().getToState()); }); }); } }
三、高级功能实现
1. 动态配置更新
@RefreshScope @Configuration public class DynamicCircuitBreakerConfig { @Value("${circuitbreaker.config.failureRateThreshold:50}") private int failureRateThreshold; @Bean @RefreshScope public CircuitBreakerConfig circuitBreakerConfig() { return CircuitBreakerConfig.custom() .failureRateThreshold(failureRateThreshold) // 其他配置... .build(); } }
2. 熔断指标监控
@RestController @RequestMapping("/metrics") public class CircuitBreakerMetricsController { @GetMapping("/circuit-breakers") public Map getCircuitBreakerMetrics() { return CircuitBreakerRegistry.ofDefaults().getAllCircuitBreakers() .stream() .collect(Collectors.toMap( CircuitBreaker::getName, cb -> { Map metrics = new HashMap(); metrics.put("state", cb.getState()); metrics.put("failureRate", cb.getMetrics().getFailureRate()); metrics.put("bufferedCalls", cb.getMetrics().getNumberOfBufferedCalls()); return metrics; } )); } }
四、实战案例演示
1. 全局异常处理
@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(CallNotPermittedException.class) public ResponseEntity handleCircuitBreakerOpen(CallNotPermittedException ex) { return ResponseEntity.status(503) .body("服务暂时不可用,请稍后重试"); } }
2. 性能测试数据
测试场景:1000次并发调用 正常响应时间:120ms 熔断触发时间:500ms 降级响应时间:15ms 系统吞吐量下降:25%