首页 > 解决方案 > 使用 Resilience4j 和 WebClient 的正确方法

问题描述

我正在编写一个断路器包装器,它应该封装 http 调用(使用 Spring WebClient )。所有的集成服务都将调用 invokeService() 方法,该方法又调用 excecute()。

现在,如果 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)

标签: kotlinspring-webclientresilience4j

解决方案


推荐阅读