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 ,而后再和官方的对比,看看优秀的代码在设计中更关注的点以及是如何实现的。

相关文章
相关标签/搜索