java - 将 HystrixCommands 迁移到 Resilience4j
问题描述
鉴于 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 获得的东西,但是以更理智的方式。我真的不喜欢用 a 来启动链,这样我就可以在实际的可调用对象被包装之前Completable.complete()
强制执行。observeOn
解决方案
我认为没有直接替换HystrixCommand
in Resilience4j
。最相似的事情是CircuitBreaker.decorateCompletionStage
or CircuitBreaker.executeCompletionStage
。使用这种方法,您可以装饰CompletableFuture
供应商的任何类型。其他选择是依赖我们与不同异步模块的集成,例如rxjava2
or reactor
。当然,如果这些选项都不适合您,请不要忘记这Resilience4j
是一个非常无主见的、模块化和可组合的库。通过使用我们的 3 个最低级别的方法,您可以将我们的断路器安装到任何类型的并发范例库中:
CircuitBreaker.isCallPermitted
CircuitBreaker.onError
CircuitBreaker.onSuccess
我们的其他核心组件也是如此。我希望这个答案至少有一点帮助。如果您有任何其他问题,我很乐意为您提供帮助。快乐的黑客
推荐阅读
- javascript - 有什么方法可以更改 Chartjs 3.0.0 中标签的字体颜色和大小
- c# - 实体A包含实体B,我如何在不插入B的情况下更新A(因为它已经存在)EF核心
- python - Python Selenium 如何输入登录 ID
- python - 是否可以为 celery 任务分配一个标签,这样就可以一次杀死整个组任务?
- python - 按给定数字重新缩放numpy数组?
- javascript - 创建日期时间客户端或服务器端?
- f# - 仅打印联合类型的案例
- c++ - 使用缩放的部分旋转 C++ 从高斯消除打印正确的矩阵
- spring-boot - 使用 Spring Boot(嵌入式 Tomcat 服务器)+ Heroku 禁用 TLS <1.2
- azure-devops - 当 .yaml 文件中存在特定模板或生成步骤时,在 Azure DevOps 中触发生成管道