springboot 與 resilience4j 集成


原創轉載請注明出處: https://www.cnblogs.com/agilestyle/p/15166657.html

 

Maven Dependency

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

 

CircuitBreaker

https://resilience4j.readme.io/docs/circuitbreaker

# Resilience4j CircuitBreaker config
resilience4j.circuitbreaker.configs.default.sliding-window-size=100
resilience4j.circuitbreaker.configs.default.permitted-number-of-calls-in-half-open-state=10
resilience4j.circuitbreaker.configs.default.wait-duration-in-open-state=10000
resilience4j.circuitbreaker.configs.default.failure-rate-threshold=60
resilience4j.circuitbreaker.configs.default.event-consumer-buffer-size=10
resilience4j.circuitbreaker.configs.default.register-health-indicator=true
resilience4j.circuitbreaker.instances.xxx-web-client.base-config=default

 

Retry

https://resilience4j.readme.io/docs/retry

# Resilience4j Retry config
resilience4j.retry.instances.xxxSvc.max-retry-attempts=3
resilience4j.retry.instances.xxxSvc.wait-duration=800ms
resilience4j.retry.instances.xxxSvc.retry-exceptions=org.fool.exception.ApplicationException

Note:設置拋出 ApplicationException 時才會觸發 retry

 

Test

Trigger CircuitBreaker

@RequestMapping("/test/{userId}")
@CircuitBreaker(name = "xxx-web-client", fallbackMethod = "fallbackTest")
@Retry(name = "xxxSvc", fallbackMethod = "fallbackTest")
public String test(@PathVariable String userId) {
    String result = null;

    System.out.println("mock business logic with userId: " + userId);
    int i = 1 / 0;

    return result;
}

private String fallbackTest(String userId, RuntimeException e) {
    System.err.println("fallbackTest invoked with userId: " + userId + ", exception:" + e);
    return null;
}

Console Output

mock business logic with userId: 1
fallbackTest invoked with userId: 1, exception:java.lang.ArithmeticException: / by zero

Note: 沒有 retry,直接進入熔斷方法

 

Trigger Retry

@RequestMapping("/test/{userId}")
@CircuitBreaker(name = "xxx-web-client", fallbackMethod = "fallbackTest")
@Retry(name = "xxxSvc", fallbackMethod = "fallbackTest")
public String test(@PathVariable String userId) throws ApplicationException {
    String result = null;

    System.out.println("mock business logic with userId: " + userId);

    try {
        int i = 1 / 0;
    } catch (Exception e) {
        throw new ApplicationException("exception happen");
    }

    return result;
}

private String fallbackTest(String userId, RuntimeException e) {
    System.err.println("fallbackTest invoked with userId: " + userId + ", exception:" + e);
    return null;
}

Console Output

mock business logic with userId: 1
mock business logic with userId: 1
mock business logic with userId: 1

Note: 這條 log 會輸出 3 次,即 retry 了 3 次,並且沒有進入熔斷方法

 

Reference

https://resilience4j.readme.io/docs/getting-started-3

 


歡迎點贊關注和收藏

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM