共计 1895 个字符,预计需要花费 5 分钟才能阅读完成。
这个 Kafka 的专题,我会从零碎整体架构,设计到代码落地。和大家一起杠源码,学技巧,涨常识。心愿大家继续关注一起见证成长!
我置信:技术的路线,十年如一日!十年磨一剑!
前言
在浏览源码之前,首先要做的就是搭建一套源码调试环境,这是最根本的一步,不要感觉麻烦或者简略就不去做,兴许你会像我一样搭源码的过程中失去一些教训和教训。同时在前面浏览源码的过程中,很多看不懂的中央 debug 一下兴许就清朗了。
记录了搭建 Kafka 源码环境的简略过程,为大家提供一个步骤参考,同时记录搭建环境中可能会遇到的问题及解决方案。
这个环境搭建过程也会提到一个十分实用,并且很多人都不晓得的源码 debug 技巧,对浏览源码和 debug 零碎很有帮忙哦!
源码下载
笔者下载的 Kafka 版本是 0.11.0.1,源码下载地址是:https://kafka.apache.org/downloads
下载时抉择,源码下载:
解压工程 & 装置插件
解压下载好的源码包,间接应用 Idea 关上我的项目即可。另外因为 Kafka 代码是 Scala 写的,所以须要装置一个 Scala 插件。
到 Idea 的插件市场下载 Scala 插件,这个插件不仅仅有语法提醒而且能够帮你下载 Scala SDK,切换 SDK 十分不便,必装!
仓库初始化
养成一个好习惯,对于这种间接下载的源码包,先用 git 进行初始化,后续有什么改变也可能进行回溯,避免间接把源码改瓢了,之前做的正文也很难再拷贝进去。
git add . && git commit -m ‘init’
构建我的项目
批改我的项目根目录下的 build.gradle,将所有的 mavenCentral()
替换成 maven{url 'http://maven.aliyun.com/nexus/content/groups/public/'}
放慢 gradle 导入包的速度。
完事当前开始进行 Gradle 构建
构建实现后,所有的 Kafka 些模块会被主动导入,如下图是导入实现时的工程模块构造
启动
找到 kafka.Kafka 这个类,而后运行 Main 办法,增加启动参数
vmOptions -> -Dkafka.logs.dir=/Users/lwen/logs/kafka # 这个目录须要批改一下,是 kafka 音讯文件目录 program arguments -> config/server.properties # kafka 的配置文件门路
下图展现配置结束时的参数
我遇到了很多编译正告⚠️,不过只有还能持续编译就不必 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。
装置 ZK
brew install zookeeper
装置完了当前启动 zk,我采纳的是 后盾运行的形式:
brew services start zookeeper
当然也能够间接前台启动,看到日志输入:
zkServer start
再次启动
唠叨
原本认为搭建源码挺简略的,然而还是本人把本人坑了一把。日志没配,zk 没配。不过好在这个过程中,就算没有任何日志和堆栈也能剖析到问题的起因,也是调试的一个小技巧,相当实用。
下篇文章要开始剖析 Producer 的架构啦,首先咱们会尝试本人实现一个 Producer,而后再和官网的比照,看看优良的代码在设计中更关注的点以及是如何实现的。
另外:大家也能够关注下我的微信公众号哦~ 技术分享和集体思考都会第一工夫同步!