resilience4j + весенний экземпляр CircuitBreaker - PullRequest
0 голосов
/ 23 апреля 2019

Я хотел бы использовать Resilience4j для работы с отказоустойчивостью, я использую CircuitBreaker и TimerLimit.

Я хотел бы отделить бизнес-логику поведения отказоустойчивости, чтобы не "испачкать" мой бизнес-код.

Итак, я думаю использовать шаблон Command для выполнения моих методов, которые будут обрабатываться, как Hystrix с HystrixCommand.

Пример:

public class MyCommand {

    private static final CircuitBreaker circuitBreaker;
    private Long param1, param2;
    private MyService myService;
    private static final TimeLimiter timeLimiter;

    static {
        long ttl = 50000;
        TimeLimiterConfig configTimerLimit
                = TimeLimiterConfig.custom().timeoutDuration(Duration.ofMillis(ttl)).build();
        timeLimiter = TimeLimiter.of(configTimerLimit);

        // I got the configuration from a class that I created.
        circuitBreaker = CircuitBreaker.of("my", CircuitBreakerConfigOptions.defaultForExternalService());
    }

    public MyCommand(Long param1, Long param2, MyService myService) {
        this.param1 = param1;
        this.param2 = param2;
        this.myService = myService;
    }

    public String run() {
        Callable<String> stringCallable = TimeLimiter.decorateFutureSupplier(timeLimiter,
                () -> CompletableFuture.supplyAsync(() -> myService.hello(param1, param2)));

        Callable<String> callable = CircuitBreaker.decorateCallable(circuitBreaker, stringCallable);

        return Try.of(callable::call).recover(t -> fallback(t)).get();
    }

    protected String fallback(Throwable throwable) {
        Callable<String> stringCallable = TimeLimiter.decorateFutureSupplier(timeLimiter,
                () -> CompletableFuture.supplyAsync(() -> myService.otherHello(param1, param2)));

        return Try.of(stringCallable::call).getOrElse("Fallback");
    }
}

Вызов в моем контроллере:

@ApiOperation(value = "Only to test")
@GetMapping(value = "/execute", produces = MediaType.APPLICATION_JSON)
public String execute() {
    return new MyCommand(1L, 2L, new MyService()).run();
}

Мои сомнения:

1 - В этом случае CircleBreaker действительно должен быть статическим, потому что я понял, что один и тот же объект должен быть разделен между тем же методом, который вы хотитек угрозе, я прав?

2 - Как много у меня экземпляров этого приложения, CircleBreaker работает индивидуально для каждого экземпляра?Я прав?

1 Ответ

0 голосов
/ 21 июня 2019

Поскольку кажется, что вы используете Spring Boot, вы можете использовать стартовый модуль resilience4j-spring-boot-2, который также поддерживает аннотации.

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

...