Я хотел бы использовать 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 работает индивидуально для каждого экземпляра?Я прав?