Kafka 2.3.0源码解析之一:把源码工程跑起来
上一篇我们已经kafka源码运行起来了,本篇跟大家介绍下源码工程目录结构,源码工程根目录下包含了若干文件夹和文件,如下图所示:

Kafka工程目录文件夹和文件
kafka是基于Gradle构建的多模块工程,在build.gradle文件中定义了整个工程和各个模块的相关配置,打开IDEA里面的gradle面板,可以看见工程的模块和模块下面的各种类型的Task:

大家可以详细看下build.gradle里面的内容,详细看下各个模块的依赖和相关配置。接下来,将根目录下的各个文件夹给大家做个简单的介绍:
bin目录
Windows和Unix平台下的执行脚本,主要有启动脚本kafka-server-start,创建主题脚本 kafka-topics,发送消息脚本kafka-console-producer,接收消息脚本kafka-console-consumer,大家一开始接触kafka的命令一般都是先从这几个开始。
checkstyle目录
Checkstyle是什么,关于格式化的讨论就不曾中断过,到底什么才是正确的,什么才是错误的,到现在也没有完整的定论。但随着时间发展,渐渐衍生出一套规范出来。没有什么绝对的正确和错误,关键在于规范的定义。最出名的就是google style guide. Checkstyle就是以这种风格开发出的一个自动化插件,来辅助判断代码格式是否满足规范。
该目录下的文件定义了工程代码格式的规范,我们可以在build.gradle中看到相关checkstyle的配置和自动化代码格式化配置:

checkstyle配置

scala自动化代码格式化配置
config目录
kafka相关的配置文件均存放在该目录,其中server.properties是kafka启动需要直接加载的文件。
docs目录
kafka文档模版html文件
gradle目录
存放gradle的脚本和依赖包定义等相关文件。
tests目录
此目录的内容介绍如何进行Kafka系统集成和性能测试。
vagrant目录
介绍如何在Vagrant虚拟环境中运行kakfa,提供了相关的脚本文件和说明文档。
Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境。它 使用Oracle的开源VirtualBox虚拟化系统,使用 Chef创建自动化虚拟环境。
clients
kafka客户端相关类模块,主要是admin、consumer、producer三部分。
connect
Kafka Connect的代码都定义在该目录下。
Kafka Connect是一种在Kafka和其他系统之间进行可伸缩、可靠的数据流传输的工具。它使快速定义连接器变得简单,可以将大量数据集移入和移出卡夫卡。Kafka Connect可以接收整个数据库,或者将所有应用服务器的指标收集到Kafka主题中,从而使数据以较低的延迟用于流处理。导出作业可以将来自Kafka主题的数据传递到辅助存储和查询系统或批处理系统中进行脱机分析。
core目录
Kafka的核心代码模块,后续我们会详细介绍。
examples目录
kafka comsumer、producrer的使用demo,很简单的例子。
generator目录
kafka 消息类处理模块,主要是根据clients模块下的message json文件生成对应的java类,在build.gradle文件中,可以看到定义了一个任务processMessages:

processMessages Task
jmh-benchmarks目录
kafka代码微基准测试相关类
JMH,即Java Microbenchmark Harness,是专门用于代码微基准测试的工具套件。何谓Micro Benchmark呢?简单的来说就是基于方法层面的基准测试,精度可以达到微秒级。当你定位到热点方法,希望进一步优化方法性能的时候,就可以使用JMH对优化的结果进行量化的分析。
JMH比较典型的应用场景有:
想准确的知道某个方法需要执行多长时间,以及执行时间和输入之间的相关性;
对比接口不同实现在给定条件下的吞吐量,找到最优实现
查看多少百分比的请求在多长时间内完成
log4j-appender目录
A log4j appender that produces log messages to Kafka
就一个类
streams目录
Kafka Streams is a client library for building applications and microservices, where the input and output data are stored in Kafka clusters.
提供一个基于Kafka的流式处理类库,直接提供具体的类给开发者调用,整个应用的运行方式主要由开发者控制,方便使用和调试
Kafka Streams是一个用来构建流处理程序的库,特别是其输入是一个Kafka topic,输出是另一个Kafka topic的程序(或者是调用外部服务,或者是更新数据库,或者其它)。它使得你以一种分布式以及容错的方式来做这件事情。
tools目录
工具类模块