遵循入门指南(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();
    }
}


Controller :

@RestController
public class ServiceController {

    @Autowired
    private  AlbumService albumService;


    @GetMapping("/albums")
    ResponseEntity<String> getAlbums() {
       return albumService.getAlbums();
    }

}


和服务类:
@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 ResponseEntity<String> getDefaultAlbumList(Exception ex) throws URISyntaxException, IOException {
        log.info("Recovered: " + ex.getMessage());
        return new ResponseEntity<>(new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("fallback-album-list.json").toURI()))), HttpStatus.OK);
    }
}

最后在这里是应用程序文件:
resilience4j:
  circuitbreaker:
    configs:
      default:
        registerHealthIndicator: true
        slidingWindowSize: 10
        minimumNumberOfCalls: 5
        permittedNumberOfCallsInHalfOpenState: 3
        automaticTransitionFromOpenToHalfOpenEnabled: true
        waitDurationInOpenState: 5s
        failureRateThreshold: 50
        eventConsumerBufferSize: 10
    instances:
      albumService:
        baseConfig: default

management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always
  metrics:
    distribution:
      percentiles-histogram:
        http:
          server:
            request: true
        resielence4j:
          circuitbreaker:
            calls: true

我介绍了一个随机误差,以70%的概率测试断路器。但是,电路永远不会断开,而且我总是会出错。
我不知道我在想什么!有什么帮助吗?

最佳答案

发现了问题!
我忘记了将spring-aop作为依赖项!
如果有人遇到相同的问题,这是我的pom.xml:

<?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.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>r4j</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>r4j</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <repositories>
        <repository>
            <id>jcenter</id>
            <url>https://jcenter.bintray.com/</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>net.andreinc.mockneat</groupId>
            <artifactId>mockneat</artifactId>
            <version>0.3.9</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>io.github.resilience4j</groupId>
            <artifactId>resilience4j-spring-boot2</artifactId>
            <version>1.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
            <version>2.3.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.3.0.RELEASE</version>
        </dependency>
    </dependencies>

</project>

关于java - Spring 引导2上的Resilience4j-断路器未打开,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61917010/

10-10 19:27