vlambda博客
学习文章列表

【你好Resilience4j】一:Resilience4j之初体验

为什么要使用Resilience4j

看到我们这部分文章的同学肯定是对Netflix Hystrix 有一定了解的。Netflix Hystrix 作为SpringCloud最早支持的一种容错解决方案,已经进入了维护阶段。虽然目前还有大量应用在使用Hystrix 长远来看Hystrix退出历史舞台 仅仅是时间问题。并且SpringCloud和Netflix Hystrix都给出了替代方案 那就是Resilience4j。所以学习Resilience4j很有必要,并且它也很值得你学。因为笔者认为它的代码简洁 大量使用了函数式编程,可以说源码质量也是比较高的,对于想学习并想深入学习Java函数式编程的同学是一个很好的机会。

Resilience4j介绍

Resilience4j是受
Netflix Hystrix启发的轻量级,易于使用的容错库,但专为Java 8和函数式编程而设计。轻巧,因为该库仅使用Vavr,而Vavr没有任何其他外部库依赖项。相比之下,Netflix Hystrix对Archaius具有编译依赖性,而Archaius具有更多的外部库依赖性,例如Guava和Apache Commons Configuration。

Resilience4j提供了高阶函数(装饰器),以使用断路器,速率限制器,重试或隔板来增强任何功能接口,lambda表达式或方法引用。您可以在任何功能接口,lambda表达式或方法引用上堆叠多个装饰器。优点是您可以选择所需的装饰器,而不必选择其他任何东西。

Resilience4j 梓2016年发布第一个版本之后到现在最新版本V1.6.1。该系列文章选用的版本是1.6.1版本。

Resilience4j模块

核心模块
resilience4j-circuitbreaker:电路断开
resilience4j-ratelimiter:速率限制
resilience4j-bulkhead:隔板
resilience4j-retry:自动重试(同步和异步)
resilience4j-cache:结果缓存
resilience4j-timelimiter:超时处理
附加模块
resilience4j-retrofit:对retrofit的支持
resilience4j-feign:对feign的支持
resilience4j-consumer:对consumer的支持
resilience4j-kotlin:Kotlin支持
框架模块
resilience4j-spring-boot:spring boot1.x支持
resilience4j-spring-boot2:Spring Boot 2.x支持

模块太多 我就不一一列举了。我们只关心核心模块就好了。

初体验

下面是Resilience4j官网的一个例子。

CircuitBreaker circuitBreaker = CircuitBreaker
.ofDefaults("backendService");
Retry retry = Retry
.ofDefaults("backendService");
Bulkhead bulkhead = Bulkhead
.ofDefaults("backendService");

Supplier<String> supplier = () -> backendService
.doSomething(param1, param2)
Supplier<String> decoratedSupplier = Decorators.ofSupplier(supplier)
.withCircuitBreaker(circuitBreaker)
.withBulkhead(bulkhead)
.withRetry(retry)
.decorate();
String result = Try.ofSupplier(decoratedSupplier)
.recover(throwable -> "Hello from Recovery").get();
String result = circuitBreaker
.executeSupplier(backendService::doSomething);
ThreadPoolBulkhead threadPoolBulkhead = ThreadPoolBulkhead
.ofDefaults("backendService");
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);
TimeLimiter timeLimiter = TimeLimiter.of(Duration.ofSeconds(1));

CompletableFuture<String> future = Decorators.ofSupplier(supplier)
.withThreadPoolBulkhead(threadPoolBulkhead)
.withTimeLimiter(timeLimiter, scheduledExecutorService)
.withCircuitBreaker(circuitBreaker)
.withFallback(asList(TimeoutException.class,
CallNotPermittedException.class,
BulkheadFullException.class),
throwable -> "Hello from Recovery")
.get().toCompletableFuture();

看看就好了 ,我现在解释也没有太大的必要。反正知道 它能干这些事 代码能这样写就好了。

作者寄语

Resilience4j代码写的很优雅简洁,当然注释也简洁, 这会给我们阅读源码造成很大的困扰。当然除此之外 它完全基于java8之上构建的 使用的语法全部都是 函数式语法。甚至java8的函数式语法都不能满足它,它还需要借助Vavr来完成更复杂的函数编程。所以学习Resilience4j还是需要一些函数式编程功底的。如果没有这方面经验的同学可以先了解了解。