首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Resilience4j断路器不工作

Resilience4j断路器不工作
EN

Stack Overflow用户
提问于 2021-11-29 04:45:22
回答 1查看 599关注 0票数 1

我在使用Spring Cloud Resilience4j实现断路器时遇到了一个问题。

在一些教程之后,我尝试在项目中添加必要的依赖项。此外,我尝试添加配置,但仍然无法打开电路,也无法调用回退方法。

请从不同的文件中找到代码片段。

我是个断路器模式的新手。任何帮助都将受到高度的感谢。

pom.xml

代码语言:javascript
复制
    <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.5.5</version>
   <relativePath/> <!-- lookup parent from repository -->
</parent>
    <properties>
    <java.version>11</java.version>
    <spring-cloud.version>2020.0.4</spring-cloud.version>
    </properties>
    <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
<dependencies>
</project>

应用程序属性

代码语言:javascript
复制
resilience4j.circuitbreaker.instances.test-api.register-health-indicator=true
resilience4j.circuitbreaker.instances.test-api.minimum-number-of-calls=4
resilience4j.circuitbreaker.instances.test-api.failure-rate-threshold=50
resilience4j.circuitbreaker.instances.test-api.permitted-number-of-calls-in-half-open-state=3
resilience4j.circuitbreaker.instances.test-api.wait-duration-in-open-state=30s
resilience4j.circuitbreaker.instances.test-api.automatic-transition-from-open-to-half-open-enabled=true
resilience4j.circuitbreaker.instances.test-api.record-exceptions=com.testapi.exception.ServiceUnavailableError

服务类代码片段

代码语言:javascript
复制
@CircuitBreaker(name = "test-api", fallbackMethod = "storeResponseFallback")
    public TestResponse storeResponse(String apiURL, HttpEntity<String> entityrequest) {

        TestResponse testResponse = new TestResponse();
        Optional<ResponseEntity<TestResponse>> response = Optional.empty();
        Future<ResponseEntity<TestResponse>> responseFuture;

        ExecutorService executor = Executors.newFixedThreadPool(10);

        log.debug("Calling Extrenal API, Request Body: {}", entityrequest.toString());

        try {
            //Service call returns a future
            responseFuture = executor.submit(() -> restTemplate.postForEntity(apiURL, entityrequest, TestResponse.class));
            response = Optional.ofNullable(responseFuture.get());
            log.info("Got response from external API");


            if ((response.isPresent()) && (response.get().hasBody())) {
                testResponse = response.get().getBody();
            }

        } catch (Exception exception) {
            log.error("External api call got failed with an error");
            Thread.currentThread().interrupt();            
            throw new ServiceUnavailableError();
        }


        return testResponse;

    }
    
    
    public TestResponse storeResponseFallback(ServiceUnavailableError ex) {
        log.error("Executing Fallback Method For General exceptions");
        throw new ServiceUnavailableError();
    }

ServiceUnavailableError Java文件

代码语言:javascript
复制
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ServiceUnavailableError extends RuntimeException{
    private static final long serialVersionUID = 2382122402994502766L;

    private String message;

}
EN

回答 1

Stack Overflow用户

发布于 2021-11-29 05:02:48

回退方法的签名错误。它应该包含实际方法的所有参数(在您的示例中,storeResponseFallback是回退方法,storeResponse是实际方法),以及异常。请确保删除try catch块。您不希望自己处理异常,而应该让断路器为您处理它。请看下面的代码,它来自给定的链接https://resilience4j.readme.io/docs/getting-started-3

代码语言:javascript
复制
@CircuitBreaker(name = BACKEND, fallbackMethod = "fallback")
public Mono<String> method(String param1) {
    return Mono.error(new NumberFormatException());
}

private Mono<String> fallback(String param1, IllegalArgumentException e) {
    return Mono.just("test");
}

尝试使用以下yaml文件我在现有代码中使用了以下配置,我使用了yaml而不是属性文件。这似乎保持在打开状态,并且只调用回退方法。

代码语言:javascript
复制
resilience4j.circuitbreaker:
  configs:
    default:
      slidingWindowSize: 4
      permittedNumberOfCallsInHalfOpenState: 10
      waitDurationInOpenState: 10000
      failureRateThreshold: 60
      eventConsumerBufferSize: 10
      registerHealthIndicator: true
    someShared:
      slidingWindowSize: 3
      permittedNumberOfCallsInHalfOpenState: 10
  instances:
    test-api:
      baseConfig: default
      waitDurationInOpenState: 500000
    backendB:
      baseConfig: someShared

下面是更新后的回退方法

代码语言:javascript
复制
public TestResponse storeResponseFallback(String apiURL, String entityrequest, java.lang.Throwable t) {
        log.error("Executing Fallback Method For General exceptions "+t.getMessage());
        return new TestResponse("Frm Fallback");// Making sure to send a blank response
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70149854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档