小言_互联网的博客

Resilience4j 框架源码解析(1):简介及调试环境搭建

951人阅读  评论(0)
  1. 简介
  2. 调试环境搭建
    2.1 安装设置 Gradle
    2.2 安装 Resilience4j
    2.3 运行
  3. 入手点
    3.1 代码结构
    3.2 代码量
    3.3 源码分析方法
  4. 小结
  5. 参考文档

1.简介

Resilience4j 是受Hystrix启发而做的新一代轻量级熔断器,基于Java8的函数式编程开发。

Resilience4j 只依赖一个Vavr包(函数式库),不需要再引入其他包,所以相对于Hystrix是轻量级的。同时resilience4j的模块化程度更好,很容易的扩展附加模块,同时也是学习如何组织模块化项目结构的一个绝佳范例。

目前Resilience4j包括熔断(CircuitBreaker)、限流(RateLimiter)、隔离(BulkHead)、重试(Retry)、缓存(Cache)、执行时间限制(TimeLimiter)等模块及一些附加模块(Add-on modules)。

2.调试环境搭建

2.1 安装及设置 Gradle

项目使用Gradle管理依赖包,调试环境里需要安装及设置Gradle,具体步骤,推荐阅读:Mac OS X 安装及配置 Gradle

2.2 安装 Resilience4j

github 地址:https://github.com/resilience4j/resilience4j

# 拉取源码
git clone https://github.com/resilience4j/resilience4j

拉取源码,即安装成功。

2.3 运行

源码分析前,一定要先运行试试,一般的开源产品都会有基准测试,再不济也会有单元测试。

我们先随便找一个模块试试看,比如,CircuitBreakerBenchmark

运行报错了! 没关系,开始查问题,于是按照网上说的:

  • 尝试安装了Idea的jmh插件,还是不行!?
  • 看到说gradle 5.5以上的jmh要用0.5.0版本,修改后报找不到,还是不行!?
  • 据说是缺包,于是增加了 jmh-core 和 ,还是不行!?
  • 再找,说要用gradle —stop 和 gradle --no-daemon jmh,还是不行!?

最后终于在 StackOverFlow 里搜索时,看到了下面这段话:

终于豁然开朗,打开IDE配置后,成功生效。

其实,正确的做法分两步:

一是配置编译插件。 编辑最外层的 build.gradle,找到编译处增加:

compile "org.openjdk.jmh:jmh-core:1.21"
compile "org.openjdk.jmh:jmh-generator-annprocess:1.21"

注意:如果是在test目录,可以使用testCompile,如果是在主目录,则需要使用compile。

二是打开IDE配置,开启Annotation Processors,路径如下:

Preferences -> Build,Excution,Deployment - > Compiler -> Annotation Processors

可能你以前配置过JMH,也不会报这个错,虽然这是个小错,但是充分证明了再开始源码研究前,运行一次是很有必要。

这时我们再运行基准测试和单元测试试试,基本没有报错。但实际上再仔细观察会发现,还是有错。没关系,其实也是给我们提了一个醒,开源框架要实际用到生产中,还有一段叫实践落地的路要走。这里先不分析错误,只是大致看一下,心里大致有个底就好。

3. 切入点

3.1 代码结构

源码分析少不了整体代码结构的分析,我们先来看看 Resilience4j 的整体代码结构,如下图:

手动数了一下,一共 32 个模块,我稍微整理了下,其中:

核心模块,有7个:

  • resilience4j-core: 一些通用核心接口定义
  • resilience4j-circuitbreaker: 模块:熔断
  • resilience4j-ratelimiter: 模块:限流
  • resilience4j-bulkhead: 模块:隔离(两种隔离:和线程池隔离)
  • resilience4j-retry: 自动重试,有同步或异步的两种机制
  • resilience4j-cache: 响应缓存,主要是扩展 circuitbreaker 模块
  • resilience4j-timelimiter: 超时处理,也是扩展 circuitbreaker 模块

扩展模块,有18个:

  • resilience4j-reactor: 实现对 Spring Reactor 的操作支持
  • resilience4j-rxjava2: 实现对 RxJava2 的操作支持
  • resilience4j-micrometer: Micrometer 指标支持
  • resilience4j-metrics: Dropwizard 指标支持
  • resilience4j-prometheus: Prometheus 监控报警系统指标支持
  • resilience4j-spring: Spring 支持
  • resilience4j-spring-boot: Spring Boot 1.X Starter集成,可不看
  • resilience4j-spring-boot2: Spring Boot 2.X Starter集成
  • resilience4j-spring-boot-common: Spring Boot 通用支持
  • resilience4j-spring-cloud: Spring Cloud 支持
  • resilience4j-spring-cloud2: Spring Cloud 2 支持
  • resilience4j-spring-cloud-common: Spring Cloud 通用支持
  • resilience4j-feign: 适配Spring Cloud的Feign
  • resilience4j-ratpack: http框架 Ratpack Starter 集成
  • resilience4j-retrofit: 适配Retrofit。一个网络加载框架。底层是使用OKHttp封装的
  • resilience4j-vertx: Vertx 框架支持
  • resilience4j-consumer: 官方说是 Circular Buffer Event 的 consumer,待分析
  • resilience4j-kotlin: 支持 Kotlin coroutines

其他模块,有8个:

  • resilience4j-all: hello world 例子
  • resilience4j-annotations: 核心模块功能使用的注解
  • resilience4j-bom: 空目录
  • resilience4j-circularbuffer: 没看出来在哪儿用
  • resilience4j-documentation: 文档说明
  • resilience4j-framework-common: 主要是一些自动配置ConfigurationProperties的支持
  • resilience4j-test: 没有写完的测试模块,估计是想要把测试放在一起吧

除去划线的,剩下的就是接下来要分析的相关模块,从重点模块开始发散开来。

3.2 代码量


从图中我们可以看到,代码总行数:6w+。对于一个框架来说,的确算少的,像jodd一个基础java工具包都是20w+的代码量。

有同学看见代码行数少,开始窃喜,其实少不见得是好事,很有可能还是坏事。

因为一旦深入就会发现,框架里大量的使用了Java 8的「函数编程特性」来编码,代码是精简了,但是读起来会有点费劲。

3.3 源码分析方法

有很多同学,一看到代码就兴奋,恨不得一下就能读完,然而实际上,这样的做法并不可取。

我们真的需要读完所有源码吗?实际上,没有必要,需要什么看什么,缺什么找什么。

带着目的去读,不断结合实践去读,才能更有效的分析源码。

源码分析的捷径就是没有捷径。

我常用的笨办法就是,多问自己几个问题,再看源码。比如:

  • 为什么现在大厂都喜欢用流控降级?什么时候不适用?
  • 这个开源框架用了什么设计模式?底层原理又是那些?能带给我们哪些启示?
  • 为什么作者使用了函数编程特性?有什么技巧可以借鉴?
  • 框架用到了哪些数据结构和算法?
  • 如果是我来设计流控降级系统该怎么设计?有哪些关键点要注意?
  • 轻量级一定好吗?解决了哪些问题?又带来了哪些问题?

有时问题不见得都能得到解决,但是这个思考的过程却很珍贵,而写下对源码的分析也是对这种思考的一种记录。

4.小结

文章简要介绍了 Resilience4j 框架,并完成了调试环境的搭建,在运行过程中遇见了一个小问题,并着手解决。然后,从代码模块结构入手,做好源码分析的前期准备工作。

5.参考文档


转载:https://blog.csdn.net/mickjoust/article/details/100939974
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场