Я пишу упаковщик выключателя, который должен инкапсулировать HTTP-вызовы (используя Spring WebClient). Все службы интеграции будут вызывать метод invokeService (), который, в свою очередь, вызывает Excute ().
Теперь, если execute () успешен, хорошо. Если нет, автоматический выключатель должен срабатывать после n сбоев (в зависимости от конфигурации). Это то, что я сделал. Не уверен, что это будет работать (из-за Mono) и правильный способ сделать это.
@Service
class CircuitBreakerWrapper @Inject constructor(cbService: CircuitBreakerService?)
: BaseHttpExcecutor() {
private var cbService = cbService
fun <R> invokeService(
service: String,
webClient: WebClient,
HttpRequestSpec httpRequestSpec,
cbProperties: CircuitBreakerProperties?,
type: Class<R>?): Mono<R> {
val circuitBreaker = cbService
.registerCircuitBreaker(serviceName, properties)
val supplier: Supplier<Mono<R>> = Supplier {
execute(webClient, httpRequestSpec, type)
}
val decoratedSupplier = CircuitBreaker
.decorateSupplier(circuitBreaker, supplier)
return Try.ofSupplier(decoratedSupplier).get()
}
}
Вот как выглядит execute ():
webClient.method(HttpMethod.GET)
.uri(url, params)
.retrieve()
.bodyToMono(response)