当前位置: 首页 > 知识库问答 >
问题:

弹性4J断路器中的配置不工作

秦育
2023-03-14

我使用的是Resilience4J断路器,我需要忽略一些自定义异常,所以我需要更改默认配置。我在使用微服务,所以我有一个连接到数据库的微服务,它有一些基本的请求,比如get by id,我还有一个使用这些请求的边缘服务。例如,我需要,如果id不存在,微服务会抛出一个自定义异常,在这种情况下断路器不会打开。

数据库的微服务:

  • 获取请求
@GetMapping("/sales-rep/{id}")
@ResponseStatus(HttpStatus.OK)
public SalesRepDTO getSalesRep(@PathVariable Integer id) {
    return salesRepService.getSalesRep(id);
}

>

  • 服务

    public SalesRepDTO getSalesRep(整数id){

     if(salesRepRepository.existsById(id)) {
    
         SalesRep salesRep = salesRepRepository.findById(id).get();
    
         return new SalesRepDTO(salesRep.getId(), salesRep.getName());
    
     } else {
         throw new SalesRepNotFoundException("Sales rep not found");
     }
    

    }

    边缘服务:

    • 服务
        import com.ironhack.manageAllservice.client.AccountClient;
        import com.ironhack.manageAllservice.client.LeadClient;
        import com.ironhack.manageAllservice.client.SalesRepClient;
        import com.ironhack.manageAllservice.controller.dtos.*;
        import com.ironhack.manageAllservice.controller.dtos.report.OpportunityBySalesRepDTO;
        import com.ironhack.manageAllservice.controller.dtos.report.ReportDTO;
        import com.ironhack.manageAllservice.service.exceptions.SalesRepNotFoundException;
        import com.ironhack.manageAllservice.controller.dtos.report.*;
        import com.ironhack.manageAllservice.service.interfaces.IManageAllService;
        import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
        import io.github.resilience4j.timelimiter.TimeLimiterConfig;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JCircuitBreakerFactory;
        import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JConfigBuilder;
        import org.springframework.cloud.client.circuitbreaker.CircuitBreaker;
        import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory;
        import org.springframework.cloud.client.circuitbreaker.Customizer;
        import org.springframework.context.annotation.Bean;
        import org.springframework.http.HttpStatus;
        import org.springframework.stereotype.Service;
        import org.springframework.web.server.ResponseStatusException;
    
        import java.time.Duration;
        import java.util.ArrayList;
        import java.util.HashMap;
        import java.util.List;
        
        @Service
        public class ManageAllService implements IManageAllService {
    
    
        @Autowired
        private CircuitBreakerFactory circuitBreakerFactory;
    
        @Bean
        public Customizer<Resilience4JCircuitBreakerFactory> globalCustomConfiguration() {
    
            CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
                    .failureRateThreshold(50)
                    .waitDurationInOpenState(Duration.ofMillis(1000))
                    .slidingWindowSize(2)
                    .ignoreExceptions(SalesRepNotFoundException.class)
                    .build();
            TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
                    .timeoutDuration(Duration.ofSeconds(4))
                    .build();
    
            return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
                    .circuitBreakerConfig(circuitBreakerConfig)
                    .timeLimiterConfig(timeLimiterConfig)
                    .build());
        }
    
        public SalesRepDTO getSalesRepById(Integer id) {
    
            CircuitBreaker circuitBreaker = circuitBreakerFactory.create("salesRep-service");
    
            SalesRepDTO salesRepDTO = circuitBreaker.run(()->salesRepClient.getSalesRep(id),
                    throwable -> postSalesRepFallBack());
            return salesRepDTO;
        }
    

    SalesRepNotFoundException。类是我想忽略的异常,但断路器没有更改配置。有什么建议吗?

  • 共有1个答案

    西门磊
    2023-03-14

    我建议您看看我们的Spring Boot 2 starter:https://resilience4j.readme.io/docs/getting-started-3

    我们的Spring Boot starter允许您将配置提取到配置文件中,并使用注释。

     类似资料:
    • 我正面临使用Spring Cloud Resilience 4j的断路器实现的问题。 在一些教程之后,我尝试在项目中添加必要的依赖项。此外,尝试添加配置,但电路仍然没有打开,并且没有调用回退方法。 对于用例,我正在从我的服务调用外部 API,如果该外部 API 关闭,那么在几次调用后,我需要启用断路器。 请从不同的文件中找到代码片段。 我是断路器模式的新手。我们将非常感谢您的帮助。 pom.xml

    • 我有一个关于带Resilience4J(不仅仅是Resilience4J)的Spring Cloud断路器的快速问题。 这两个项目都非常棒。然而,目前,我们经常以撤退告终。这意味着,当第三方服务真的很好时,我们最终还是会选择后退。 这可能是我自己的问题,因此,我想问一个特定配置的问题。 我想告诉当前配置做以下操作:断路器。(我将使用好的,坏的,和一半好/一半坏的状态。 > 当状态是一半好/一半坏:

    • 我想用Resilience4j来处理容错,我用的是断路器和定时器限制。 我想分离业务逻辑的容错行为,不要“弄脏”我的业务代码。 2-我如何有这个应用程序的许多实例,断路器为每个实例单独工作?我是对的?

    • 断路器将处于闭合或半断开状态无限时间,直到达到最小的呼叫次数,对吗?有什么办法我可以设置什么时候没有调用在数量的时间,它将转为关闭状态?另外,在半开状态下,是否有可能使最小呼叫数大于允许的呼叫数?谢谢。

    • 我可以看到,我可以使用以下代码以编程方式将状态设置为强制打开:CircuitBreaker强制打开状态 但是有没有一种方法可以设置一个属性,在应用程序启动时立即将状态设置为此,以便可以与测试一起使用呢?

    • 我想将我的断路器配置从application.yml文件移到某个配置java文件作为bean声明信标,这使得application.yml文件变得很大,我是否可以从applciation.yml中删除配置并使用配置注释来定义断路器配置。我有配置java文件,代码如下: 在我的服务文件中,我正在注释断路器的方法,如 在目前的实现中,我的断路器无法达到开路状态。请给我一些建议