MST

星途 面试题库

面试题:微服务架构下Resilience4J断路器的自定义策略

假设你正在开发一个高并发的微服务系统,使用Resilience4J作为断路器框架。现在需要针对不同的业务接口设置不同的熔断策略,比如部分接口要求在连续5次失败后熔断,熔断时间为10秒;而另一部分接口在失败率达到60%后熔断,熔断时间为20秒。请描述如何通过代码实现这些自定义的熔断策略。
39.6万 热度难度
后端开发微服务架构

知识考点

AI 面试

面试题答案

一键面试
  1. 引入依赖: 确保项目中已引入Resilience4J相关依赖,例如在Maven项目中:
<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-circuitbreaker</artifactId>
    <version>1.7.1</version>
</dependency>
  1. 配置不同的熔断策略: 在Spring Boot项目中,可以通过application.yml文件配置不同的熔断策略。
resilience4j.circuitbreaker:
  instances:
    interface1:
      registerHealthIndicator: true
      failureRateThreshold: 100 # 连续5次失败,这里通过连续失败次数计算失败率为100%
      minimumNumberOfCalls: 5
      slidingWindowSize: 5
      waitDurationInOpenState: 10s
    interface2:
      registerHealthIndicator: true
      failureRateThreshold: 60
      minimumNumberOfCalls: 10 # 这里设置10次调用统计失败率,可根据实际调整
      slidingWindowSize: 10
      waitDurationInOpenState: 20s
  1. 在代码中使用不同的熔断策略: 通过CircuitBreakerRegistry获取不同配置的断路器。
import io.github.resilience4j.circuitbreaker.CircuitBreaker;
import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    private final CircuitBreaker circuitBreaker1;
    private final CircuitBreaker circuitBreaker2;

    @Autowired
    public MyService(CircuitBreakerRegistry circuitBreakerRegistry) {
        this.circuitBreaker1 = circuitBreakerRegistry.circuitBreaker("interface1");
        this.circuitBreaker2 = circuitBreakerRegistry.circuitBreaker("interface2");
    }

    public void callInterface1() {
        CircuitBreaker.decorateSupplier(circuitBreaker1, () -> {
            // 调用接口1的业务逻辑
            return null;
        }).get();
    }

    public void callInterface2() {
        CircuitBreaker.decorateSupplier(circuitBreaker2, () -> {
            // 调用接口2的业务逻辑
            return null;
        }).get();
    }
}

以上代码实现了针对不同业务接口设置不同熔断策略。通过配置文件定义不同的熔断规则,在代码中根据名称获取对应的断路器并应用到具体的业务接口调用上。