《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 https://www.iocoder.cn/Kafka/build-debugging-environment/ 「芋道源码」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

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

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

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

视频可见 B 站:https://www.bilibili.com/video/BV1M3411r7J1

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

1. 依赖工具

1.1 IDEA

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

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

友情提示:如果不知道怎么激活 IDEA 的胖友,可以访问 《IDEA 激活指南》 地址,花 5 分钟学习!支持所有版本~

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 从官方仓库 https://github.com/apache/kafka 克隆项目。

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

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

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

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

3. 下载依赖

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

下载 Gradle 工具

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

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

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

下载依赖

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

下载依赖

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

4. Scala

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

4.1 Scala 插件

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

安装 Scala 插件

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

4.2 Scala SDK

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

安装 Scala SDK

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

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

5. 启动 Kafka Broker

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

启动 Broker 失败

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

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

启动 Broker 配置

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

启动 Broker 成功

点击左下角的绿色小箭头,跳过断点。此时,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 的依赖。如下图所示:

下载 slf4j + log4j2 依赖

implementation libs.slf4jlog4j

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

log4j 配置文件

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

Broker 启动日志

7. 启动 Kafka Producer 和 Consumer

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

Kafka 使用示例

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

KafkaConsumerProducerDemo.png


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

8. 源码解析

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

友情提示:虽然 Kafka 的代码量非常庞大,我们实际阅读的时候,主要还是看比较核心的流程。例如说,Producer 发送消息,Consumer 消费消息,Broker 存储消息。

也就是说,“一发一收一存储”。

《Apache Kafka源码剖析》,针对 Kafka 0.10.0 版本,豆瓣评分 8.4 分。

比较可惜,对应的 Kafka 版本太老了,期待作者后续能重版,嘿嘿。

《Kafka技术内幕》,也是针对 Kafka 0.10.0 版本,豆瓣评分 6.9 分。

相比第 ① 本差一些,可以作为备选,或者“字典”查查。

《Kafka源码解析与实战》,可能也适合针对 Kafka 0.10.0 版本,豆瓣暂无评分。

前面的 8 个章节主要围绕 Kafka 源码,后面 2 个章节主要讲大数据先关的实战。

《Kafka核心源码解读》,针对 Kafka 2.5.0 版本。

胡夕大佬出品的 Kafka 内容,还是非常有保障的。艿艿是计划今年抽点时间看看他写的两个 Kafka 专栏,还有一个是 《Kafka核心技术与实战》


最佳推荐:《Kafka核心技术与实战》 + 《Kafka核心源码解读》

文章目录
  1. 1. 1. 依赖工具
    1. 1.1. 1.1 IDEA
    2. 1.2. 1.2 JDK
    3. 1.3. 1.3 ZooKeeper
  2. 2. 2. 源码拉取
  3. 3. 3. 下载依赖
  4. 4. 4. Scala
    1. 4.1. 4.1 Scala 插件
    2. 4.2. 4.2 Scala SDK
  5. 5. 5. 启动 Kafka Broker
  6. 6. 6. 配置 Kafka Broker 日志
  7. 7. 7. 启动 Kafka Producer 和 Consumer
  8. 8. 8. 源码解析