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

相关文章
相关标签/搜索