走近Kafka之源碼閱讀環(huán)境的構(gòu)建
構(gòu)建準(zhǔn)備:
- [Ubuntu 18 安裝] Linux衍生系統(tǒng)
- [Java 1.8+ 版本安裝] Java環(huán)境
-
[Gradle 5.6.4 版本安裝]
- Kafka源代碼編譯構(gòu)建工具
- [Git安裝] 代碼管理
- [zookeeper 安裝] kafka集群構(gòu)建/調(diào)試使用
- [Scala 2.12.10 安裝] 閱讀源代碼和遠(yuǎn)程調(diào)試使用
-
[IntelliJ Idea安裝] 閱讀源代碼和遠(yuǎn)程調(diào)試使用
- 安裝scala和lombok插件
- 由于某些網(wǎng)絡(luò)運(yùn)營(yíng)商屏蔽了IntelliJ 系列的dns映射,所以無(wú)法下載插件的小伙伴可以到[網(wǎng)盤(pán)下載],提取碼: 5e52.解壓后,將兩個(gè)文件夾放到對(duì)應(yīng)的InteliJ的插件目錄下,比如:/home/${user}/.IdeaIC2019.3/config/plugins目錄下,重新啟動(dòng)IntelliJ即可。
開(kāi)始構(gòu)建
創(chuàng)建工作目錄:
mkdir kafka_code_location,
創(chuàng)建一個(gè)目錄作為Kafka源代碼下載目錄,比如kafka_code_location將 [kafka] 項(xiàng)目倉(cāng)庫(kù)fork到自己的github
切換到工作目錄:
cd kafka_code_location,
從自己的github中pull kafka的源代碼,git clone git@github.com:${username}/kafka.git分支準(zhǔn)備:進(jìn)入kafka代碼目錄,
cd kafka;
切換到kafka 2.4分支,git checkout 2.4;
從此分支構(gòu)建自己的分支,git checkout -b your_branch_base_2.4-
主要編譯命令說(shuō)明
./gradlew jar構(gòu)建 jar包并運(yùn)行./gradlew srcJar構(gòu)建源碼包./gradlew aggregatedJavadoc構(gòu)建javadoc文檔./gradlew clean清理并構(gòu)建./gradlew idea構(gòu)建項(xiàng)目./gradlew eclipse構(gòu)建項(xiàng)目
執(zhí)行 ./gradlew idea-
導(dǎo)入項(xiàng)目到 IntelliJ 中
打開(kāi) IntelliJ,選擇“打開(kāi)工程”,選擇 kafka 目錄即可。
核心目錄:
core:Broker工程代碼。clients:Client工程代碼以及一些公共代碼。streams:Streams工程代碼。connect:Connect工程框架代碼以及FileConnector代碼。
推薦的代碼模塊學(xué)習(xí)順序
-
log其中定義了Broker底層消息和索引保存機(jī)制以及物理格式。-
Log、LogSegment和LogManager等幾個(gè)類(lèi),主要定義了Kafka底層的消息存儲(chǔ)機(jī)制。
-
controller主要實(shí)現(xiàn)的是Kafka Controller的所有功能,KafkaController.scala文件,它封裝了Controller的所有事件處理邏輯-
coordinator中group包代碼,coordinator包有group和transaction。- 前者封裝的是
Consumer Group所用的Coordinator,后者封裝的是支持Kafka事務(wù)的Transaction Coordinator。
了解Broker是如何管理Consumer Group的。GroupMetadataManager和GroupCoordinator類(lèi),它們定義了Consumer Group的元數(shù)據(jù)信息以及管理這些元數(shù)據(jù)的狀態(tài)機(jī)機(jī)制。
- 前者封裝的是
network代碼和server包下的部分代碼。Broker主要看KafkaApis.scala。處理請(qǐng)求的主要功能封裝clients:略org.apache.kafka.common.record這個(gè)包下面主要是Kafka消息實(shí)體類(lèi),比如用于在內(nèi)存中傳輸?shù)?code>MemoryRecords類(lèi)以及用于在磁盤(pán)上保存的FileRecords類(lèi)。org.apache.kafka.common.network重點(diǎn)關(guān)注Selector、KafkaChannel,建議更加注重Selector,它們是實(shí)現(xiàn)Client 和 Broker之間網(wǎng)絡(luò)傳輸?shù)闹匾獧C(jī)制。很多網(wǎng)絡(luò)異常問(wèn)題就是這個(gè)包中拋出的!org.apache.kafka.clients.producer它是 Producer 的代碼實(shí)現(xiàn)包,可重點(diǎn)選擇幾個(gè)類(lèi)學(xué)習(xí)即可,比如KafkaProducer、Sender 或者 RecordAccumulator等。org.apache.kafka.clients.consumer它是 Consumer 的代碼實(shí)現(xiàn)包。同org.apache.kafka.clients.producer,重點(diǎn)閱讀KafkaConsumer、AbstractCoordinator 和 Fetcher等類(lèi)即可。
后續(xù)
- 后續(xù)將會(huì)使用這個(gè)環(huán)境對(duì)kafka源代碼進(jìn)行學(xué)習(xí)分享