правильный способ использования resilience4j с WebClient - PullRequest
0 голосов
/ 07 апреля 2020

Я пишу упаковщик выключателя, который должен инкапсулировать 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)
...