有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java断路器(弹性4J)在Spring Boot应用程序中不工作

我正在尝试在我的spring boot应用程序中实现断路器。 为了测试断路器的实现,我至少做了2次裸微服务

这是我的密码

微服务A:

应用程序。属性

server.port=8076    
resilience4j.circuitbreaker.instances.recordstore.sliding-window-size=4
resilience4j.circuitbreaker.instances.recordstore.minimum-number-of-calls=2
resilience4j.circuitbreaker.instances.recordstore.failure-rate-threshold=70
resilience4j.circuitbreaker.instances.recordstore.automatic-transition-from-open-to-half-open-enabled=true
#resilience4j.circuitbreaker.instances.recordstore.enable-exponential-backoff=true
resilience4j.circuitbreaker.instances.recordstore.permitted-number-of-calls-in-half-open-state=2
resilience4j.circuitbreaker.instances.recordstore.sliding-window-type=COUNT_BASED
resilience4j.circuitbreaker.instances.recordstore.wait-duration-in-open-state=10
resilience4j.circuitbreaker.instances.recordstore.writable-stack-trace-enabled=true

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.2</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>A</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>A</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>io.github.resilience4j</groupId>
            <artifactId>resilience4j-spring-boot2</artifactId>
            <version>1.7.1</version>
        </dependency>

        <!-- <dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-timelimiter</artifactId> 
            <version>1.7.0</version> </dependency> -->

        <dependency>
            <groupId>io.github.resilience4j</groupId>
            <artifactId>resilience4j-circuitbreaker</artifactId>
            <version>1.7.1</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

  </project>

配置

   @Configuration    
   public class AConfig {
            @Value("${resilience4j.circuitbreaker.instances.recordstore.minimum-number-of-calls}")
    private int minimumNumberOfCalls;       
                
    @Value("${resilience4j.circuitbreaker.instances.recordstore.sliding-window-size}")
    private int slidingWindowSize;
    
    @Value("${resilience4j.circuitbreaker.instances.recordstore.sliding-window-type}")
    private SlidingWindowType slidingWindowType;
    
    @Value("${resilience4j.circuitbreaker.instances.recordstore.wait-duration-in-open-state}")
    private int waitDurationInOpenState;
    
    @Value("${resilience4j.circuitbreaker.instances.recordstore.failure-rate-threshold}")
    private int failureRateThreshold;
            
        
            @Bean
            public RestTemplate restTemplate() {
                return new RestTemplate();
            }
            
            
            @Bean
            public CircuitBreaker circuitBreaker() {
                
                CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
                        .slidingWindowSize(slidingWindowSize)
                        .slidingWindowType(slidingWindowType)
                        .waitDurationInOpenState(Duration.ofSeconds(waitDurationInOpenState))
                        .failureRateThreshold(failureRateThreshold)
                        .writableStackTraceEnabled(true)
                        .enableAutomaticTransitionFromOpenToHalfOpen()
                        .automaticTransitionFromOpenToHalfOpenEnabled(true)
                        .build();
                
                CircuitBreakerRegistry circuitBreakerRegistry = CircuitBreakerRegistry.of(circuitBreakerConfig);
                        
                return circuitBreakerRegistry.circuitBreaker("recordstore", circuitBreakerConfig)  ;
            }
        }

控制器

@RestController
public class AController {

    private static final Logger LOGGER = LoggerFactory.getLogger(AController.class); 

    @Autowired
    RestTemplate restTemplate;

    @Autowired
    CircuitBreaker circuitBreaker;

    @GetMapping("/test/{id}")
    public void test(@PathVariable Integer id) {

        System.out.println(" id :::" + id);

        Supplier<String> supplier = () -> restTemplate.getForObject("http://localhost:8077/read", String.class);
        Supplier<String> decoratedSupplier = circuitBreaker.decorateSupplier(supplier);


        Try<String> response = Try.ofSupplier(decoratedSupplier).recover(throwable -> this.logId(id));

        LOGGER.info("Response for id::: {} ...is.... {}" , id, response);
    }


    private String logId(Integer id) {
        System.out.println("Logging id for RTB");
        return "manual intervention needed";
    }
}

以下是微服务B的代码:

@RestController
public class BController {

    @GetMapping("/read")
    public String read() {
        
        System.out.println("in B");
        return "Successsssssss";
    }
}

这是我的日志。最初,微服务B启动,我发出3个请求,然后我关闭微服务B,再发出6个请求

2021-07-17 17:31:33.197  INFO 9904 --- [           main] com.example.demo.AApplication            : Started AApplication in 3.808 seconds (JVM running for 4.722)
2021-07-17 17:31:53.562  INFO 9904 --- [nio-8076-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-07-17 17:31:53.562  INFO 9904 --- [nio-8076-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2021-07-17 17:31:53.564  INFO 9904 --- [nio-8076-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms
 id :::1
2021-07-17 17:31:53.948  INFO 9904 --- [nio-8076-exec-1] com.example.demo.AController             : Response for id::: 1 ...is.... Success(Successsssssss)
 id :::1
2021-07-17 17:31:57.466  INFO 9904 --- [nio-8076-exec-2] com.example.demo.AController             : Response for id::: 1 ...is.... Success(Successsssssss)
 id :::1
2021-07-17 17:32:11.553  INFO 9904 --- [nio-8076-exec-3] com.example.demo.AController             : Response for id::: 1 ...is.... Success(Successsssssss)
 id :::1
Logging id for RTB
2021-07-17 17:32:21.132  INFO 9904 --- [nio-8076-exec-4] com.example.demo.AController             : Response for id::: 1 ...is.... Success(manual intervention needed)
 id :::2
Logging id for RTB
2021-07-17 17:32:27.915  INFO 9904 --- [nio-8076-exec-5] com.example.demo.AController             : Response for id::: 2 ...is.... Success(manual intervention needed)
 id :::3
Logging id for RTB
2021-07-17 17:32:38.345  INFO 9904 --- [nio-8076-exec-6] com.example.demo.AController             : Response for id::: 3 ...is.... Success(manual intervention needed)
 id :::4
Logging id for RTB
2021-07-17 17:32:42.706  INFO 9904 --- [nio-8076-exec-7] com.example.demo.AController             : Response for id::: 4 ...is.... Success(manual intervention needed)
 id :::5
Logging id for RTB
2021-07-17 17:32:47.001  INFO 9904 --- [nio-8076-exec-8] com.example.demo.AController             : Response for id::: 5 ...is.... Success(manual intervention needed)
 id :::6
Logging id for RTB
2021-07-17 17:32:56.484  INFO 9904 --- [nio-8076-exec-9] com.example.demo.AController             : Response for id::: 6 ...is.... Success(manual intervention needed)

我现在已经投资了4天,无法理解为什么这个简单的东西不起作用。为什么我的电路没有开路。我感到极度缺乏动力。请知道这件事的人帮帮我。我会非常感谢你


共 (0) 个答案