走近Kafka之源码阅读环境的构建
构建准备:
- [Ubuntu 18 安装] Linux衍生系统
- [Java 1.8+ 版本安装] Java环境
-
[Gradle 5.6.4 版本安装]
- Kafka源代码编译构建工具
- [Git安装] 代码管理
- [zookeeper 安装] kafka集群构建/调试使用
- [Scala 2.12.10 安装] 阅读源代码和远程调试使用
-
[IntelliJ Idea安装] 阅读源代码和远程调试使用
- 安装scala和lombok插件
- 由于某些网络运营商屏蔽了IntelliJ 系列的dns映射,所以无法下载插件的小伙伴可以到[网盘下载],提取码: 5e52.解压后,将两个文件夹放到对应的InteliJ的插件目录下,比如:/home/${user}/.IdeaIC2019.3/config/plugins目录下,重新启动IntelliJ即可。
开始构建
创建工作目录:
mkdir kafka_code_location,
创建一个目录作为Kafka源代码下载目录,比如kafka_code_location将 [kafka] 项目仓库fork到自己的github
切换到工作目录:
cd kafka_code_location,
从自己的github中pull kafka的源代码,git clone git@github.com:${username}/kafka.git分支准备:进入kafka代码目录,
cd kafka;
切换到kafka 2.4分支,git checkout 2.4;
从此分支构建自己的分支,git checkout -b your_branch_base_2.4-
主要编译命令说明
./gradlew jar构建 jar包并运行./gradlew srcJar构建源码包./gradlew aggregatedJavadoc构建javadoc文档./gradlew clean清理并构建./gradlew idea构建项目./gradlew eclipse构建项目
执行 ./gradlew idea-
导入项目到 IntelliJ 中
打开 IntelliJ,选择“打开工程”,选择 kafka 目录即可。
核心目录:
core:Broker工程代码。clients:Client工程代码以及一些公共代码。streams:Streams工程代码。connect:Connect工程框架代码以及FileConnector代码。
推荐的代码模块学习顺序
-
log其中定义了Broker底层消息和索引保存机制以及物理格式。-
Log、LogSegment和LogManager等几个类,主要定义了Kafka底层的消息存储机制。
-
controller主要实现的是Kafka Controller的所有功能,KafkaController.scala文件,它封装了Controller的所有事件处理逻辑-
coordinator中group包代码,coordinator包有group和transaction。- 前者封装的是
Consumer Group所用的Coordinator,后者封装的是支持Kafka事务的Transaction Coordinator。
了解Broker是如何管理Consumer Group的。GroupMetadataManager和GroupCoordinator类,它们定义了Consumer Group的元数据信息以及管理这些元数据的状态机机制。
- 前者封装的是
network代码和server包下的部分代码。Broker主要看KafkaApis.scala。处理请求的主要功能封装clients:略org.apache.kafka.common.record这个包下面主要是Kafka消息实体类,比如用于在内存中传输的MemoryRecords类以及用于在磁盘上保存的FileRecords类。org.apache.kafka.common.network重点关注Selector、KafkaChannel,建议更加注重Selector,它们是实现Client 和 Broker之间网络传输的重要机制。很多网络异常问题就是这个包中抛出的!org.apache.kafka.clients.producer它是 Producer 的代码实现包,可重点选择几个类学习即可,比如KafkaProducer、Sender 或者 RecordAccumulator等。org.apache.kafka.clients.consumer它是 Consumer 的代码实现包。同org.apache.kafka.clients.producer,重点阅读KafkaConsumer、AbstractCoordinator 和 Fetcher等类即可。
后续
- 后续将会使用这个环境对kafka源代码进行学习分享