我正在编写一个断路器包装器,它应该封装 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)