Open woshikid opened 2 years ago
使用CircuitBreakerFactory
@Autowired private CircuitBreakerFactory circuitBreakerFactory; // 相当于new RetryTemplate().setRetryPolicy(new CircuitBreakerRetryPolicy()) // 相当于circuitBreakerRegistry.circuitBreaker("id") CircuitBreaker circuitBreaker = circuitBreakerFactory.create("id"); // 相当于retryTemplate.execute() // 相当于circuitBreaker.executeSupplier() String result = circuitBreaker.run(() -> "trying", throwable -> "fallback");
Spring Retry,详见 #169
POM
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-circuitbreaker-spring-retry</artifactId> </dependency>
全局设置
@Bean public Customizer<SpringRetryCircuitBreakerFactory> defaultCustomizer() { // 设置全局默认代理策略,默认为SimpleRetryPolicy return factory -> factory.configureDefault(id -> new SpringRetryConfigBuilder(id).retryPolicy(new SimpleRetryPolicy()).build()); }
特定设置
@Bean public Customizer<SpringRetryCircuitBreakerFactory> slowCustomizer() { // 设置特定id的代理策略 return factory -> factory.configure(builder -> builder.retryPolicy(new SimpleRetryPolicy(1)).build(), "slow"); // 注意:factory.addRetryTemplateCustomizers()的内容在每次circuitBreaker.run()时都会执行 }
Resilience4j,详见 #176
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId> </dependency>
AOP优先级
CircuitBreaker(TimeLimiter())
@Bean public Customizer<Resilience4JCircuitBreakerFactory> defaultCustomizer() { // 设置全局默认熔断/限时策略(或全部使用yml配置) return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id) .circuitBreakerConfig(CircuitBreakerConfig.custom().minimumNumberOfCalls(10).build()) .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(10)).build()) .build()); }
@Bean public Customizer<Resilience4JCircuitBreakerFactory> slowCustomizer() { // 设置特定name的熔断/限时策略(或全部使用yml配置) return factory -> factory.configure(builder -> builder .circuitBreakerConfig(CircuitBreakerConfig.custom().minimumNumberOfCalls(10).build()) .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(10)).build()) .build(), "slow"); // 注意:factory.addCircuitBreakerCustomizer()的内容在每次circuitBreaker.run()时都会执行 }
<dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-bulkhead</artifactId> </dependency>
CircuitBreaker(TimeLimiter(Bulkhead()))
@Bean public Customizer<Resilience4jBulkheadProvider> defaultBulkheadCustomizer() { // 设置全局默认隔离策略(或全部使用yml配置) // 默认优先使用ThreadPoolBulkhead return provider -> provider.configureDefault(id -> new Resilience4jBulkheadConfigurationBuilder() .bulkheadConfig(BulkheadConfig.custom().maxConcurrentCalls(1).build()) .threadPoolBulkheadConfig(ThreadPoolBulkheadConfig.custom().coreThreadPoolSize(1).build()) .build()); }
@Bean public Customizer<Resilience4jBulkheadProvider> slowBulkheadCustomizer() { // 设置特定name的隔离策略(或全部使用yml配置) // 默认优先使用ThreadPoolBulkhead,可通过只设置yml的bulkhead.instances或只设置provider.addBulkheadCustomizer()来使用Bulkhead return provider -> provider.configure(builder -> builder .bulkheadConfig(BulkheadConfig.custom().maxConcurrentCalls(1).build()) .threadPoolBulkheadConfig(ThreadPoolBulkheadConfig.custom().coreThreadPoolSize(1).build()) .build(), "slow"); // 注意:provider.addBulkheadCustomizer()的内容只会执行一次 // 注意:provider.addThreadPoolBulkheadCustomizer()的内容只会执行一次 }
通用API
使用CircuitBreakerFactory
Spring Retry
Spring Retry,详见 #169
POM
全局设置
特定设置
Resilience4j
Resilience4j,详见 #176
POM
AOP优先级
全局设置
特定设置
Bulkhead
POM
AOP优先级
全局设置
特定设置