我正在使用 io.github.resilience4j。1.6.1 版本一切正常,但升级到 1.7.1 版本后,我的应用程序无法运行。请在下面找到我的代码更改。
我的 pom.xml 依赖项
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-core</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
<version>1.7.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
这是 application.propertes 的更改
resilience4j.circuitbreaker.configs.default.registerHealthIndicator=true
resilience4j.circuitbreaker.configs.default.slidingWindowSize= 10
resilience4j.circuitbreaker.configs.default.minimumNumberOfCalls=5
resilience4j.circuitbreaker.configs.default.permittedNumberOfCallsInHalfOpenState= 3
resilience4j.circuitbreaker.configs.default.automaticTransitionFromOpenToHalfOpenEnabled=true
resilience4j.circuitbreaker.configs.default.waitDurationInOpenState=5s
resilience4j.circuitbreaker.configs.default.failureRateThreshold=50
resilience4j.circuitbreaker.configs.default.eventConsumerBufferSize=10
resilience4j.circuitbreaker.configs.shared.slidingWindowSize=100
resilience4j.circuitbreaker.configs.shared.permittedNumberOfCallsInHalfOpenState=30
resilience4j.circuitbreaker.configs.shared.waitDurationInOpenState=1s
resilience4j.circuitbreaker.configs.shared.failureRateThreshold=50
resilience4j.circuitbreaker.configs.shared.eventConsumerBufferSize=10
resilience4j.circuitbreaker.instances.profile.registerHealthIndicator=true
resilience4j.circuitbreaker.instances.profile.slidingWindowSize=10
resilience4j.circuitbreaker.instances.profile.minimumNumberOfCalls=10
resilience4j.circuitbreaker.instances.profile.permittedNumberOfCallsInHalfOpenState=3
resilience4j.circuitbreaker.instances.profile.waitDurationInOpenState=5s
resilience4j.circuitbreaker.instances.profile.failureRateThreshold=50
resilience4j.circuitbreaker.instances.profile.eventConsumerBufferSize=10
resilience4j.retry.configs.default.maxAttempts=3
resilience4j.retry.configs.default.waitDuration=100
resilience4j.retry.instances.profile.baseConfig=default
resilience4j.bulkhead.configs.default.maxConcurrentCalls=30
resilience4j.bulkhead.configs.instances.profile.maxWaitDuration=10ms
resilience4j.bulkhead.configs.instances.profile.maxConcurrentCalls=20
resilience4j.thread-pool-bulkhead.configs.default.maxThreadPoolSize=4
resilience4j.thread-pool-bulkhead.configs.default.coreThreadPoolSize=2
resilience4j.thread-pool-bulkhead.configs.default.queueCapacity=2
resilience4j.thread-pool-bulkhead.instances.profile.maxThreadPoolSize=1
resilience4j.thread-pool-bulkhead.instances.profile.coreThreadPoolSize=1
resilience4j.thread-pool-bulkhead.instances.profile.queueCapacity=1
resilience4j.ratelimiter.configs.default.registerHealthIndicator=false
resilience4j.ratelimiter.configs.default.limitForPeriod=10
resilience4j.ratelimiter.configs.default.limitRefreshPeriod=1s
resilience4j.ratelimiter.configs.default.timeoutDuration=0
resilience4j.ratelimiter.configs.default.eventConsumerBufferSize=100
resilience4j.timelimiter.configs.default.cancelRunningFuture=false
resilience4j.timelimiter.configs.default.timeoutDuration=2s
resilience4j.timelimiter.instances.profile.baseConfig=default
Run Code Online (Sandbox Code Playgroud)
这是控制器 API 的更改
private static final String PROFILE="profile";
@GetMapping("/{programType}/profile")
@AdobeIOAuthentication
@RateLimiter(name = PROFILE)
@TimeLimiter(name = PROFILE)
@CircuitBreaker(name …
Run Code Online (Sandbox Code Playgroud) 当我最初学习 Spring Boot 时,我已经了解了spring cloud netflix hystrix
断路器。有很多选项,例如多个应用程序属性和用于容错的注释基声明。除此之外,它也没有什么重要的阈值。最重要的是,hystrix
数据可以通过hystrix dashboard
提示hystrix streams
。通过使用,turbine
我们可以组合多个hystrix streams
概览微服务。这是我的经验hystrix
。
现在我需要实现一个Resilience4j
基本上支持相同容错行为的要求。我是新手Resilience4j
,我想在开始之前了解这两个容错选项的主要区别。根据我的研究,Resilience4j
这是一个比hystrix
. 我很高兴了解专家的事实并谢谢您。
fault-tolerance circuit-breaker spring-boot hystrix resilience4j
我有一个使用 Hystrix断路器模式的服务,它调用第 3 方服务。在...的帮助下
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")
Run Code Online (Sandbox Code Playgroud)
我已经定义了第 3 方服务的超时。
由于 Hystrix 处于维护模式,因此我正在从 Hystrix 迁移到 Resilience4j 断路器模式。如何在 resiience4j 中实现类似的超时处理。
我知道可以通过使用注释来实现类似的事情,注释是resilience4j-timeLimiter@TimeLimiter
库的一部分。但根据这个问题,我必须将方法的返回类型修改为. 这将涉及对我现有服务的大量代码更改。CompletableFuture
如何使用 Resilience4j 实现这一目标?
我使用 Spring Boot2 starter ( https://resilience4j.readme.io/docs/getting-started-3 ) 在我的项目中实现了resilience4j。
我用 @CircuitBreaker 注释了一个方法,该方法使用 http 客户端来调用外部服务,并且断路器工作正常 - 包括其后备。
我想为其添加单元测试,但是当我运行尝试模拟回退的测试时,没有任何反应 - 抛出异常但不由断路器机制处理。
我找到了一些使用其指标的示例,但它对我来说没有用。
有什么想法吗?
这是我的客户的片段:
@CircuitBreaker(name = "MY_CICUIT_BREAKER", fallbackMethod = "fallback")
public ResponseEntity<String> search(String value) {
ResponseEntity<String> responseEntity = restTemplate.exchange(
searchURL,
HttpMethod.GET,
new HttpEntity(new HttpHeaders()),
String.class,
value);
}
public ResponseEntity<String> fallback(String value, ResourceAccessException ex) {
return "fallback executed";
}
Run Code Online (Sandbox Code Playgroud) 遵循入门指南(https://resilience4j.readme.io/docs/getting-started-3)和演示项目(https://github.com/resilience4j/resilience4j-spring-boot2-demo)我想自己测试它,创建一个更简单的测试应用程序。
这是代码:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ServiceConfiguration {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
Run Code Online (Sandbox Code Playgroud)
控制器:
@RestController
public class ServiceController {
@Autowired
private AlbumService albumService;
@GetMapping("/albums")
ResponseEntity<String> getAlbums() {
return albumService.getAlbums();
}
}
Run Code Online (Sandbox Code Playgroud)
和服务类:
@Slf4j
@Service
public class AlbumService {
@Autowired
private RestTemplate restTemplate;
@CircuitBreaker(name = "albumService", fallbackMethod = "getDefaultAlbumList")
public ResponseEntity<String> getAlbums() {
String url = MockNeat.secure().probabilites(String.class)
.add(0.7, "https://wrong-url.com")
.add(0.3, "https://jsonplaceholder.typicode.com/albums").val();
return new ResponseEntity<>(restTemplate.getForObject(url, String.class), HttpStatus.OK);
}
private …
Run Code Online (Sandbox Code Playgroud) 我有以下配置,用于在运行时创建断路器:
@Configuration
public class CircuitBreakerConfiguration
{
public final static String DEFAULT_CIRCUIT_BREAKER_REGISTRY = "DEFAULT_CIRCUIT_BREAKER_REGISTRY";
private CircuitBreakerConfig getCircuitBreakerConfig()
{
return CircuitBreakerConfig.custom()
.failureRateThreshold(10)
.waitDurationInOpenState(Duration.ofMillis(30000))
.permittedNumberOfCallsInHalfOpenState(2)
.slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED)
.slidingWindowSize(5)
.automaticTransitionFromOpenToHalfOpenEnabled(true)
.recordExceptions(CheckAvailabilityException.class)
.build();
}
@Bean
@Qualifier(DEFAULT_CIRCUIT_BREAKER_REGISTRY)
public CircuitBreakerRegistry getCircuitBreakerRegistry()
{
return CircuitBreakerRegistry.of(getCircuitBreakerConfig());
}
}
Run Code Online (Sandbox Code Playgroud)
我想将这些配置移至我的application.properties
文件中。
我尝试了以下方法来覆盖默认配置:
resilience4j.circuitbreaker.configs.default.sliding-window-size=10
resilience4j.circuitbreaker.configs.default.sliding-window-type=COUNT_BASED
resilience4j.circuitbreaker.configs.default.failure-rate-threshold=50
resilience4j.circuitbreaker.configs.default.wait-duration-in-open-state=30s
resilience4j.circuitbreaker.configs.default.permitted-number-of-calls-in-half-open-state=2
resilience4j.circuitbreaker.configs.default.automatic-transition-from-open-to-half-open-enabled=true
resilience4j.circuitbreaker.configs.default.record-exceptions=com.example.web.domain.checkavailability.exceptions.CheckAvailabilityException
Run Code Online (Sandbox Code Playgroud)
但是,这似乎也没有覆盖默认配置。
是否可以使用resilience4j 在客户端记录重试尝试?
也许通过某种配置或设置。
目前,我正在使用基于Spring boot Webflux注释的resilience4j 。
它运作良好,该项目很棒。
当我们将服务器日志放在服务器端时,为了查看由于重试而进行的相同 http 调用(我们记录时间、客户端 IP、请求 ID 等...)我是否可以拥有客户端日志?
我期待看到类似“Resilience4j - 客户端:第一次尝试因 someException 失败,因参加编号 2 重试而失败。第二次尝试因 someException 失败,因参加编号 3 重试。第三次尝试成功!”
类似的事情。有没有一个属性、一些配置、一些设置可以帮助轻松地做到这一点?无需添加太多锅炉代码。
@RestController
public class TestController {
private final WebClient webClient;
public TestController(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.baseUrl("http://localhost:8443/serviceBgreeting").build();
}
@GetMapping("/greeting")
public Mono<String> greeting() {
System.out.println("Greeting method is invoked ");
return someRestCall();
}
@Retry(name = "greetingRetry")
public Mono<String> someRestCall() {
return this.webClient.get().retrieve().bodyToMono(String.class);
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢
使用Spring Boot为外部调用(例如HTTP)提供断路器是一种很容易实施的常见模式,例如使用resilience4j。
我找不到任何有关通过resilience4j 或其他常见模式对数据库调用执行相同操作的信息,这对我来说是出乎意料的。
假设我们有一个服务,通过简单的 JDBC 连接到传统的 SQL 数据库。如果数据库因任何原因发生故障,我希望能够在控制器级别停止对服务的所有传入请求,直到连接恢复。有没有一种方法可以为通过数据库连接发生的所有事务实现本质上的断路器功能?
Netflix 将 Hystrix 正式置于维护模式(https://github.com/Netflix/Hystrix#hystrix-status),我开始寻找替代方案。当涉及到断路器、隔板、重试等模式时,有一些不错的库,例如resilience4j,但我找不到 Hystrix 可以做的请求崩溃的替代方案。
有人知道可以提供此类功能的库吗?
谢谢,本杰明
我有一个 Spring Boot 应用程序,它使用基于resilience4j AOP 的@CircuitBreaker
s。
现在我想在端点中提供断路器的信息/actuator/health
,但我没有在 JSON 输出中看到文档中描述的details.circuitBtreakers
对象。
相比之下,让动态缓存信息出现在/actuator/metrics
端点中需要少量的自定义连接,但这是有详细记录的。我想知道是否有类似的技巧可以应用于动态定义的@CircuitBreaker
端点注册/actuator/health
。
MyService.java
:
@Service
public class MyService {
@Autowired
private CacheManager cacheManager;
@Autowired
private CacheMetricsRegistrar cacheMetricsRegistrar;
@PostConstruct
public void postConstruct() {
// On-the-fly defined (annotation-based) caches are not auto-registered with micrometer metrics.
final Cache cache = cacheManager.getCache("myCache");
cacheMetricsRegistrar.bindCacheToRegistry(cache);
}
@CircuitBreaker(name = "myCB", fallbackMethod = "fallbackCallAnApi")
public String callAnApi() throws RestClientException {
// ...
} …
Run Code Online (Sandbox Code Playgroud) resilience4j ×10
java ×7
spring-boot ×7
hystrix ×3
aop ×1
cloud ×1
java-8 ×1
resiliency ×1
spring ×1
unit-testing ×1