Kafka 探險 - 源碼環境搭建

前言

在閱讀源碼以前,首先要作的就是搭建一套源碼調試環境,這是最基本的一步,不要以爲麻煩或者簡單就不去作,也許你會像我同樣搭源碼的過程當中獲得一些教訓和經驗。同時在後面閱讀源碼的過程當中,不少看不懂的地方 debug 一下也許就明朗了。git

記錄了搭建 Kafka 源碼環境的簡單過程,爲你們提供一個步驟參考,同時記錄搭建環境中可能會遇到的問題及解決方案。apache

這個環境搭建過程也會提到一個很是實用,而且不少人都不知道的源碼 debug 技巧,對閱讀源碼和 debug 系統頗有幫助哦!架構

源碼下載

筆者下載的 Kafka 版本是 0.11.0.1 ,源碼下載地址是 :https://kafka.apache.org/downloadsapp

下載時選擇,源碼下載:maven

4ff39c868a75619ad9e73db63888474d.jpeg

解壓工程&安裝插件

解壓下載好的源碼包,直接使用 Idea 打開項目便可。另外因爲 Kafka 代碼是 Scala 寫的,因此須要安裝一個 Scala 插件。ide

到 Idea 的插件市場下載 Scala 插件,這個插件不只僅有語法提示並且能夠幫你下載 Scala SDK,切換 SDK 很是方便,必裝!gradle

3622721761129ff1048720a54739d22f.jpeg

倉庫初始化

養成一個好習慣,對於這種直接下載的源碼包,先用 git 進行初始化,後續有什麼改動也可以進行回溯,防止直接把源碼改瓢了,以前作的註釋也很難再拷貝出來。ui

git add . && git commit -m 'init'

構建項目

修改項目根目錄下的 build.gradle ,將全部的 mavenCentral() 替換成 maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'} 加快 gradle 導入包的速度。url

完事之後開始進行 Gradle 構建spa

9c4b6a642c4ca7d3c07da0a76e9d633a.jpeg

構建完成後,全部的 Kafka 些模塊會被自動導入,以下圖是導入完成時的工程模塊結構

4dace86e6d4dfd1d9c7e1beb700392ae.jpeg

啓動

找到 kafka.Kafka 這個類,而後運行 Main 方法,添加啓動參數

# 這個目錄須要修改一下,是 kafka 消息文件目錄vmOptions ->  -Dkafka.logs.dir=/Users/lwen/logs/kafka   

# kafka 的配置文件路徑  program arguments ->  config/server.properties

下圖展現配置完畢時的參數


e7afdd8ad809704e5d2cde22f875ef74.jpeg

我遇到了不少編譯警告⚠️,不過只要還能繼續編譯就不用 care。

使人悲傷的是程序啓動不起來,main 方法直接退出了,沒有任何的提示。

a9bc51c275d596181d2d7d753f4be084.jpeg

排查問題

遇到上面那個問題後,找不到任何的日誌看出是由於什麼致使的,當時看網上的教程是把 log4j 配置文件拷貝到 kafka 目錄,日誌就能生效,可是我嘗試過了也不 OK。

因此我就開始 debug,找出爲何這個地方會出現 exit with 1 ,這裏介紹一個調試源碼的技巧:咱們看到代碼是遇到了異常才退出的,可是咱們沒有異常堆棧和錯誤提示,能夠確定的是程序確定遇到異常了。

因此咱們在 Idea 中,斷點全部會發生異常的位置具體操做:

cmd+shift+f8 打開斷點窗口

104af722fc63f07d091526cc3e32579c.jpeg

勾選上 Any Exception ,並在 Catch Class Filter 中去掉 ClassNotFoundException 由於在程序運行的時候會有雙親委派的類加載過程,確定會觸發 ClassNotFoundException 。這樣配置之後,程序拋出任何非 ClassNotFoundException 的位置都會停下來


6f139e63a627e7999d3f30be56e9ad46.jpeg

以 debug 的方式啓動程序,最後我發現程序在 initZk() 的地方異常了,那就很清晰了,zk 配置問題


21eb8675298a535499fe41689e27c39d.jpeg


這個有點坑!主要是由於沒有開啓日誌,因此一行日誌沒有直接拋出異常結束進程了,後來我也找到打印日誌的方法,按照我上面的啓動參數配置就能夠。

因此緣由是沒有啓動 zk,那麼下一步就是安裝 zk。

安裝 ZK

brew install  zookeeper

安裝完了之後啓動 zk ,我採用的是 後臺運行的方式:

brew services start zookeeper

固然也能夠直接前臺啓動,看到日誌輸出:

zkServer start

再次啓動


3c0c2df0a96df4e3ef8df4e10ec28058.jpeg

嘮叨

原本覺得搭建源碼挺簡單的,可是仍是本身把本身坑了一把。日誌沒配,zk 沒配。不過好在這個過程當中,就算沒有任何日誌和堆棧也能分析到問題的緣由,也是調試的一個小技巧,至關實用。

下篇文章要開始分析 Producer 的架構啦,首先咱們會嘗試本身實現一個 Producer ,而後再和官方的對比,看看優秀的代碼在設計中更關注的點以及是如何實現的。

相關文章
相關標籤/搜索