likes
comments
collection
share

10 分搭建一个 Kafka 源码的调试环境,男保姆级教程!

作者站长头像
站长
· 阅读数 14

友情提示:如果胖友对 Kafka 的使用不是很了解,可以后续阅读艿艿写的这四篇文章。

今儿,我们来搭建一个 Kafka 调试环境,目标是:

  • 启动 Kafka Broker ,成功断点调试 Broker 的启动过程。
  • 启动 Kafka Producer ,向 Broker 发送一批消息。
  • 启动 Kafka Consumer ,从 Broker 拉取一批消息,并进行消费。

视频可见 B 站:www.bilibili.com/video/BV1M3…

😝 艿艿比较腼腆,大家给个三连支持一下,感恩 1024~

1. 依赖工具

1.1 IDEA

当然是 Jetbrains 出品的 IDEA 工具,相信绝大多数胖友都使用的它。

艿艿使用的是 2020.3 版本,胖友尽量保证不低于该版本哈。

1.2 JDK

需要使用 JDK 编译 Kafka 的代码,这里艿艿使用的是 JDK 1.8 版本

$ java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)

1.3 ZooKeeper

虽然说新版本的 Kafka 即将移除对 ZooKeeper 的依赖,但是目前来说还是需要,所以我们需要启动一个 ZooKeeper,使用默认的 2181 端口即可。

具体如何启动,胖友可以看 《芋道 Zookeeper 极简入门》 的「2. 单机部署」小节即可,非常简单,胖友不用担心。

这里,艿艿使用的 ZooKeeper 版本是 3.5.6

2. 源码拉取

使用 IDEA 从官方仓库 github.com/apache/kafk… 克隆项目。

友情提示:如果网络不是很好的胖友,可以选择和艿艿一样,使用 Gitee 提供的镜像仓库 gitee.com/apache/kafk…

这里,我们使用的 Kafka 版本是 3.1.0-SNAPSHOT

友情提示:胖友可以考虑 Fork 下官方仓库,为什么呢?

既然开始阅读、调试源码,我们可能会写一些注释,有了自己的仓库,可以进行自由的提交。😜

3. 下载依赖

① 克隆完成 Kafka 项目之后,IDEA 会自动下载需要的 Gradle 工具。如下图所示:

10 分搭建一个 Kafka 源码的调试环境,男保姆级教程!

这里,我们使用的 Gradle 版本是 7.1.1

友情提示:由于是从国外的网址下载,所以需要耐心等待一会,艿艿花费了 5 分多钟。

② 下载完 Gradle 工具之后,IDEA 就会使用它自动下载相关的依赖库。如下图所示:

10 分搭建一个 Kafka 源码的调试环境,男保姆级教程!

因为 Gradle 支持使用 Maven 依赖,所以我们可以使用阿里云的 Maven 镜像 https://maven.aliyun.com/nexus/content/groups/public/**。修改 build.gradle 文件,如下图所示:

10 分搭建一个 Kafka 源码的调试环境,男保姆级教程!

效果非常不错,艿艿花了 10 分钟不到就下载完了依赖。😭 不要觉得很慢,没改之前,艿艿看了 40 分钟《神话》,竟然还在下载!

4. Scala

Kafka 的 Broker 是使用 Scala 实现,所以我们需要安装 Scala 插件,和 Scala SDK

4.1 Scala 插件

IDEA 并未内置 Scala 插件,所以需要去下载。安装方式,如下图所示:

10 分搭建一个 Kafka 源码的调试环境,男保姆级教程!

安装完成后,需要重启 IDEA 生效。

4.2 Scala SDK

打开 core 项目,然后打开 scala 目录下的 Kafka.scala 文件,会看到 IDEA 调试 “No Scala SDK in module”,我们可以点击“Setup Scala SDK”进行安装。

10 分搭建一个 Kafka 源码的调试环境,男保姆级教程!

友情提示:由于是从国外的网址下载,所以需要耐心等待一会,艿艿花费了蛮久的,无聊刷了好一会 B 站,嘿嘿。

这里,我们使用的 Scala 版本是 2.13.6

5. 启动 Kafka Broker

Debug 运行 kafka.scala 类,我们会发现启动 Kafka Broker 报错。如下图所示:

10 分搭建一个 Kafka 源码的调试环境,男保姆级教程!

原因是,Kafka Broker 启动时,必须传递对应的配置文件。

② 修改 Kafka 启动类,设置配置文件。操作如下图所示:

10 分搭建一个 Kafka 源码的调试环境,男保姆级教程!

③ 打上 #main(...) 方法的 server.startup() 所在行的断点,然后再次 Debug 运行 kafka.scala 类,成功进入断点。如下图所示:

10 分搭建一个 Kafka 源码的调试环境,男保姆级教程!

点击左下角的绿色小箭头,跳过断点。此时,Kafka Broker 实际已经启动成功

为什么呢?跟着艿艿继续往下走,一会就明白了。


至此,我们已经完成了我们的第一个小目标“启动 Kafka Broker ,成功断点调试 Broker 的启动过程。”。

6. 配置 Kafka Broker 日志

我们来看看 Kafka Broker 的控制台输出,会看到如下的错误日志:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
SLF4J: Failed to load class "org.slf4j.impl.StaticMDCBinder".
SLF4J: Defaulting to no-operation MDCAdapter implementation.
SLF4J: See http://www.slf4j.org/codes.html#no_static_mdc_binder for further details.

原因是,slf4j 未找到对应的 logger 组件的实现,所以不输出日志。这也导致,我们看不到 Kafka Broker 启动成功的日志。

下面,我们来配置下 Kafka Broker 的日志输出,使用 Log4j2 来实现,😜 因为 Kafka 已经提供好了相应的配置文件。

① 在 build.gradle 中,添加 slf4j + log4j2 的依赖。如下图所示:

10 分搭建一个 Kafka 源码的调试环境,男保姆级教程!

implementation libs.slf4jlog4j

② 添加 log4j2.properties 配置文件。操作如下图所示:

10 分搭建一个 Kafka 源码的调试环境,男保姆级教程!

③ 重新 Debug 运行 Kafka Broker,此时我们就可以看到启动成功相关的日志。如下图所示:

10 分搭建一个 Kafka 源码的调试环境,男保姆级教程!

7. 启动 Kafka Producer 和 Consumer

example 项目下,Kafka 提供了简单的使用示例。如下图所示:

10 分搭建一个 Kafka 源码的调试环境,男保姆级教程!

我们来运行 KafkaConsumerProducerDemo 类,启动一个 Producer 发送消息,启动一个 Broker 消费消息。如下图所示:

10 分搭建一个 Kafka 源码的调试环境,男保姆级教程!


至此,我们已经完成了我们的第二个小目标“启动 Kafka Producer ,向 Broker 发送一批消息”,和第三个小目标“启动 Kafka Consumer ,从 Broker 拉取一批消息,并进行消费”。

8. 源码解析

Kafka 的代码量,是超过 50w 行,并且最为核心的 Broker 还是使用 scala 写的,所以阅读起来还是有一定难度的。这里,艿艿来推荐下 Kafka 相关的源码解析的书籍,帮助大家更好的阅读。