考虑到Hystrix进入了维护模式,我一直致力于将一个(相当大的)代码库迁移到Resilience4j。
我在Hystrix中大量使用了以下模式:
new HystrixCommand<SomeReturnValue>(DependencyKeys.DEPENDENCY) {
@Override
protected SomeReturnValue run() {
return someExpensiveCall();
}
}
.observe()我想用Resilience4j复制Hystrix的一些功能。
到目前为止,我有以下语法来连接外部调用:
resilience.single(DependencyKeys.DEPENDENCY, this::someExpensiveCall);其中,Resilience类提供single方法:
public <T> Single<T> single(ResilienceKey key, Callable<T> callable) {
return Completable.complete()
.subscribeOn(Schedulers.computation())
.observeOn(configuration.scheduler(key))
.andThen(Single.defer(() -> Single.fromCallable(callable)
.lift(CircuitBreakerOperator.of(configuration.circuitBreaker(key)))
.lift(RateLimiterOperator.of(configuration.rateLimiter(key)))
.lift(BulkheadOperator.of(configuration.bulkhead(key)))
))
.observeOn(Schedulers.computation());
}在不同线程池的断路和运行代码方面,这怎么能更好地类似于Hystrix,但却以一种更理智的方式运行。我真的不喜欢用Completable.complete()启动链,这样我就可以在实际可调用的包装之前强制使用observeOn。
发布于 2019-01-20 12:42:01
我认为HystrixCommand在Resilience4j中没有直接的替代品。最相似的是CircuitBreaker.decorateCompletionStage或CircuitBreaker.executeCompletionStage。使用这种方法,您可以装饰任何类型的CompletableFuture供应商。其他选择是依赖于我们与不同异步模块(如rxjava2或reactor )的集成。当然,如果这些选项都不适合您,请不要忘记,Resilience4j是非常不固执己见、模块化和可组合的库。通过使用我们的3种最低级别的方法,您可以将我们的断路器安装在任何类型的并发范例库中:
CircuitBreaker.isCallPermittedCircuitBreaker.onErrorCircuitBreaker.onSuccess对于我们的其他核心组件也是如此。我希望这个答案至少有一点帮助。如果你还有其他问题,我很乐意帮忙。快乐黑客
https://stackoverflow.com/questions/54238932
复制相似问题