ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring - Resilience4j circuit breaker example
    Spring 2024. 1. 9. 22:20
    반응형

    Resilience4j는 내결함성(fault tolerance) 라이브러리다.

     

    Netflix Hystrix는 더이상 개발되지 않아 Resilience4j 사용을 권장하고 있습니다. 

     

     

    Resilience4j는 다음과 같은 모듈을 제공합니다.

     

    - circuitbreaker

    - ratelimiter

    - bulkhead

    - retry

    - timelimiter

    - cache

     

     

     

    CircuitBreaker Config

    import io.github.resilience4j.circuitbreaker.CircuitBreaker;
    import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import java.time.Duration;
    
    @Configuration
    public class CircuitBreakerConfig {
    
        @Bean
        public CircuitBreaker circuitBreaker() {
            CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
                .failureRateThreshold(50) // Threshold for opening the circuit
                .waitDurationInOpenState(Duration.ofMillis(1000)) // Time the circuit will stay open before resetting
    			.build();
    
            return CircuitBreaker.of("myCircuitBreaker", circuitBreakerConfig);
        }
    }

     

     

    - failureRateThreshold: 실패율 임계값(백분율)

    - waitDurationInOpenState: circuitbreaker가 OPEN에서 HALF_OPEN으로 전환하기 전 대기 시간

     

     

     

    호출 예제

    import org.springframework.stereotype.Service;
    import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
    
    @Service
    public class MyService {
    
        @CircuitBreaker(name = "customCircuitBreaker", fallbackMethod = "callFallback")
        public String riskyServiceCall() {
            // Code that might fail or take too long
            // For example, an external API call
            return "Service Response";
        }
    
        public String callFallback(Throwable t) {
            // This method is called if riskyServiceCall fails
            return "Fallback Response";
        }
    }

     

     

    build.gradle 파일

    plugins {
        id 'org.springframework.boot' version '2.6.3' // Replace with your Spring Boot version
        id 'io.spring.dependency-management' version '1.0.11.RELEASE'
        id 'java'
    }
    
    group = 'com.example'
    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = '11' // Replace with your Java version
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-web'
    
        // Resilience4j dependency for Spring Boot
        implementation 'io.github.resilience4j:resilience4j-spring-boot2:1.7.1' // Replace with the latest version
    
        // If you need additional Resilience4j modules, add them here. For example:
        // implementation 'io.github.resilience4j:resilience4j-circuitbreaker:1.7.1'
        // implementation 'io.github.resilience4j:resilience4j-ratelimiter:1.7.1'
        // implementation 'io.github.resilience4j:resilience4j-bulkhead:1.7.1'
        // implementation 'io.github.resilience4j:resilience4j-retry:1.7.1'
    
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
    }
    
    test {
        useJUnitPlatform()
    }
    반응형

    댓글

Designed by Tistory.