在閱讀源碼以前,首先要作的就是搭建一套源碼調試環境,這是最基本的一步,不要以爲麻煩或者簡單就不去作,也許你會像我同樣搭源碼的過程當中獲得一些教訓和經驗。同時在後面閱讀源碼的過程當中,不少看不懂的地方 debug 一下也許就明朗了。git
記錄了搭建 Kafka 源碼環境的簡單過程,爲你們提供一個步驟參考,同時記錄搭建環境中可能會遇到的問題及解決方案。apache
這個環境搭建過程也會提到一個很是實用,而且不少人都不知道的源碼 debug 技巧,對閱讀源碼和 debug 系統頗有幫助哦!架構
筆者下載的 Kafka 版本是 0.11.0.1 ,源碼下載地址是 :https://kafka.apache.org/downloadsapp
下載時選擇,源碼下載:maven
解壓下載好的源碼包,直接使用 Idea 打開項目便可。另外因爲 Kafka 代碼是 Scala 寫的,因此須要安裝一個 Scala 插件。ide
到 Idea 的插件市場下載 Scala 插件,這個插件不只僅有語法提示並且能夠幫你下載 Scala SDK,切換 SDK 很是方便,必裝!gradle
養成一個好習慣,對於這種直接下載的源碼包,先用 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
構建完成後,全部的 Kafka 些模塊會被自動導入,以下圖是導入完成時的工程模塊結構
找到 kafka.Kafka 這個類,而後運行 Main 方法,添加啓動參數
# 這個目錄須要修改一下,是 kafka 消息文件目錄vmOptions -> -Dkafka.logs.dir=/Users/lwen/logs/kafka # kafka 的配置文件路徑 program arguments -> config/server.properties
下圖展現配置完畢時的參數
我遇到了不少編譯警告⚠️,不過只要還能繼續編譯就不用 care。
使人悲傷的是程序啓動不起來,main 方法直接退出了,沒有任何的提示。
遇到上面那個問題後,找不到任何的日誌看出是由於什麼致使的,當時看網上的教程是把 log4j 配置文件拷貝到 kafka 目錄,日誌就能生效,可是我嘗試過了也不 OK。
因此我就開始 debug,找出爲何這個地方會出現 exit with 1 ,這裏介紹一個調試源碼的技巧:咱們看到代碼是遇到了異常才退出的,可是咱們沒有異常堆棧和錯誤提示,能夠確定的是程序確定遇到異常了。
因此咱們在 Idea 中,斷點全部會發生異常的位置具體操做:
cmd+shift+f8 打開斷點窗口
勾選上 Any Exception ,並在 Catch Class Filter 中去掉 ClassNotFoundException 由於在程序運行的時候會有雙親委派的類加載過程,確定會觸發 ClassNotFoundException 。這樣配置之後,程序拋出任何非 ClassNotFoundException 的位置都會停下來
以 debug 的方式啓動程序,最後我發現程序在 initZk() 的地方異常了,那就很清晰了,zk 配置問題
這個有點坑!主要是由於沒有開啓日誌,因此一行日誌沒有直接拋出異常結束進程了,後來我也找到打印日誌的方法,按照我上面的啓動參數配置就能夠。
因此緣由是沒有啓動 zk,那麼下一步就是安裝 zk。
brew install zookeeper
安裝完了之後啓動 zk ,我採用的是 後臺運行的方式:
brew services start zookeeper
固然也能夠直接前臺啓動,看到日誌輸出:
zkServer start
原本覺得搭建源碼挺簡單的,可是仍是本身把本身坑了一把。日誌沒配,zk 沒配。不過好在這個過程當中,就算沒有任何日誌和堆棧也能分析到問題的緣由,也是調試的一個小技巧,至關實用。
下篇文章要開始分析 Producer 的架構啦,首先咱們會嘗試本身實現一個 Producer ,而後再和官方的對比,看看優秀的代碼在設計中更關注的點以及是如何實現的。