Kafka 探險 - 源碼環境搭建

這個 Kafka 的專題,我會從系統總體架構,設計到代碼落地。和你們一塊兒槓源碼,學技巧,漲知識。但願你們持續關注一塊兒見證成長!

我相信:技術的道路,十年如一日!十年磨一劍!git

前言

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

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

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

源碼下載

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

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

image.png

解壓工程&安裝插件

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

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

image.png

倉庫初始化

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

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

構建項目

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

完事之後開始進行 Gradle 構建

image.png 

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

image.png

啓動

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

vmOptions -> -Dkafka.logs.dir=/Users/lwen/logs/kafka # 這個目錄須要修改一下,是 kafka 消息文件目錄 program arguments -> config/server.properties # kafka 的配置文件路徑

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

image.png

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

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

image.png

排查問題

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

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

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

cmd+shift+f8 打開斷點窗口

image.png

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

image.png

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

image.png

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

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

安裝 ZK

brew install zookeeper

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

brew services start zookeeper

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

zkServer start

再次啓動

image.png

嘮叨

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

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

另外:你們也能夠關注下個人微信公衆號哦~ 技術分享和我的思考都會第一時間同步!

image.png

相關文章
相關標籤/搜索