Kafka核心源码解读
胡夕
友信金服商业智能部总监,Apache Kafka Contributor
立即订阅
2573 人已学习
课程目录
已更新 5 讲 / 共 40 讲
0/4登录后,你可以任选4讲全文学习。
课前必学 (2讲)
开篇词 | 阅读源码,逐渐成了职业进阶道路上的“必选项”
免费
导读 | 构建Kafka工程和源码阅读环境、Scala语言热身
日志模块 (3讲)
01 | 日志段:保存消息文件的对象是怎么实现的?
02 | 日志(上):日志究竟是如何加载日志段的?
03 | 日志(下):彻底搞懂Log对象的常见操作
Kafka核心源码解读
15
15
1.0x
00:00/00:00
登录|注册

导读 | 构建Kafka工程和源码阅读环境、Scala语言热身

胡夕 2020-04-13
你好,我是胡夕。
从今天开始,我们就要正式走入 Kafka 源码的世界了。既然咱们这个课程是教你阅读 Kafka 源码的,那么,你首先就得掌握如何在自己的电脑上搭建 Kafka 的源码环境,甚至是知道怎么对它们进行调试。在这一讲,我展示了很多实操步骤,建议你都操作一遍,否则很难会有特别深刻的认识。
话不多说,现在,我们就先来搭建源码环境吧。

环境准备

在阅读 Kafka 源码之前,我们要先做一些必要的环境准备工作:你至少要提前安装好 Java、Gradle、Scala、IDE 和 Git 等软件。
咱们专栏统一使用下面几个版本进行 Kafka 源码讲解。
Oracle Java 8:专栏使用的是 Oracle 的 JDK 及 Hotspot JVM。如果你青睐于其他厂商或开源的 Java 版本(比如 OpenJDK),你可以选择安装不同厂商的 JVM 版本。
Gradle 5.0:我在专栏里带你阅读的 Kafka 源码是社区的 Trunk 分支。Trunk 分支目前演进到了 2.4.0 版本,还不支持 Gradle 6.0,因此,你需要安装 Gradle 5.x 版本。
Scala 2.12:当前社区编译 Kafka 支持 3 个 Scala 版本,分别是 2.11、2.12 和 2.13。2.11 应该很快就会不支持了,而 2.13 又是刚刚推出的版本,因此我推荐你安装 Scala 2.12 版本。
IDEA + Scala 插件:本专栏使用 IDEA 作为 IDE 来阅读和配置源码。我对 Eclipse 充满敬意,只是我个人比较习惯使用 IDEA。另外,你需要为 IDEA 安装 Scala 插件,这样可以方便你阅读 Scala 源码。
Git:安装 Git 主要是为了管理 Kafka 源码版本。如果你要成为一名社区代码贡献者,Git 管理工具是必不可少的。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Kafka核心源码解读》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(22)

  • 东风第一枝
    该脚本有一行代码:
    exec $(dirname $0)/kafka-run-class.sh kafka.tools.ConsoleProducer "$@"
    可以看到,调用了kafka-run-class.sh,看脚本的名字,应该就是用来执行kafka某个类的,并且传入了kafka.tools.ConsoleProducer这个参数
    所以,对应的Java类是kafka.tools.ConsoleProducer

    作者回复: Bingo!

    2020-04-13
    2
    7
  • 小文同学
    我自己在拉取 github kafka 项目的时候遇到超时的问题。通过 码云 做中介完成了快速拉取,步骤写在了博客里了。
    https://juejin.im/post/5e954374e51d4546f03d9a27

    作者回复: 厉害!很棒的总结~

    2020-04-15
    1
    5
  • 断情笔
    胡老师您好, 我看您是mac运行的kafka,方便配置上您的gradle 版本 jdk版本 scala版本么? 我在用mac执行kafka 的时候 发现Execution failed for task ':core:Kafka.main()'.
    > Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1 换了很多个版本都可以 windows已经成功执行,但是mac就是死活无法执行 。
    2020-04-17
    2
  • Geek_58afe9
    是看master分支吗?

    作者回复: 嗯嗯,我们这次选用trunk分支。Kafka社区里面主干分支叫trunk

    2020-04-14
    2
  • 牧码人
    我这执行gradle和./gradlew jar没问题,但是右键运行kafka的时候报错了。
    > Task :core:Kafka.main() FAILED
    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.
    USAGE: java [options] KafkaServer server.properties [--override property=value]*
    Option Description
    ------ -----------
    --override <String> Optional property that should override values set in
                           server.properties file
    --version Print version information and exit.

    FAILURE: Build failed with an exception.

    * What went wrong:
    Execution failed for task ':core:Kafka.main()'.
    > Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1

    jdk --1.8.0_221
    scala--2.12.11
    gradle-- 5.6.2
    os--Mac OS X 10.15.3 x86_64
    换了好几次Scala和gradle版本还是这个问题。

    作者回复: 不用管slf4j那些warning,你已经运行成功了啊。不是已经看到"Usage"了吗。另外建议在IDE中调试这个命令

    2020-04-17
    1
    1
  • 刘楠
    kafka-console-producer.sh
    文件中有写exec $(dirname $0)/kafka-run-class.sh kafka.tools.ConsoleProducer "$@"
    core包中 scala是
    kafka.tools.ConsoleProducer.scala

    作者回复: 嗯嗯,有兴趣读下ConsoleProducer源码。你会发现console-producer原来有这么多用途,哈哈哈

    2020-04-16
    1
    1
  • Glenn.G
    板凳
    2020-04-13
    1
  • Kǎfκã²⁰²⁰
    沙发
    2020-04-13
    1
  • Shine
    Execution failed for task ':core:Kafka.main()'.
    > Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1
    不知道有没有人跟我一样碰到这个问题,解决了吗?
    2020-04-19
  • 康熙
    Scala 语言基础:https://docs.scala-lang.org/zh-cn/tour/basics.html
    希望对大家有帮助。
    2020-04-18
  • Eros
    老师,问一个题外话题,为什么大佬都用mac开发,能否对比下用win开发和mac开发优缺点?

    作者回复: Windows上开发有的时候不太适合调试。比如你修改了一个功能打包出来在Windows上运行,可能碰到各种各样的问题

    2020-04-17
  • 云超
    我使用的是windows系统,解压后使用gradlew命令的时候,发现命令无法使用,最后发现项目根目录下的gradlew是shell文件,所以我在windows下直接使用gradle jar进行构建了

    作者回复: 嗯,那就不要使用它自带的wrapper,用你环境上的gradle

    2020-04-17
  • 特别欣赏老师纯正的美式发音

    作者回复: 谢谢鼓励,源码更精彩,哈哈哈哈

    2020-04-17
  • 高舒扬
    老师,您好。之前也看过很多项目的源码,一直比较困惑的怎么构建自己的代码阅读笔记系统。总感觉读懂了,但不能很好的把读代码的结果记录下来。不知道老师在这方面有什么好的建议吗?

    作者回复: 我的一个建议是:不要认为能把每行代码加上注释就表示自己已经懂了。明白源码的2个标志是:1. 能够自行调试源码;2. 能够在源码上独立编写高阶功能。

    2020-04-16
  • 🙊顾小顾
    配置了阿里镜像,还是好几个pom下载不下来
    > Could not resolve org.ajoberstar.grgit:grgit-core:1.9.3.
             > Could not get resource 'https://jcenter.bintray.com/org/ajoberstar/grgit/grgit-core/1.9.3/grgit-core-1.9.3.pom'.
                > Could not GET 'https://jcenter.bintray.com/org/ajoberstar/grgit/grgit-core/1.9.3/grgit-core-1.9.3.pom'.
                   > sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

    作者回复: 看着像获取证书的问题。。。确实没想到源码分析的第一步大家就有这么多困难。只能感慨国内开发环境依然不健壮啊~~

    2020-04-16
    1
  • 奔跑小电驴
    我执行./gradlew jar打包无比的慢,vpn科学上网之后也很慢,搞不定了。。。。

    作者回复: hmmm.... 确实。Maven主仓库在国内出奇地慢。在等等吧

    2020-04-15
    1
  • 🐾
    我执行 gradle、./gradlew jar 都报错,错误信息如下:
    ➜ kafka git:(trunk) gradle
    executing gradlew instead of gradle
    curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
    curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
    curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
    错误: 找不到或无法加载主类 org.gradle.wrapper.GradleWrapperMain
    ➜ kafka git:(trunk) ./gradlew jar
    curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
    curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
    curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
    错误: 找不到或无法加载主类 org.gradle.wrapper.GradleWrapperMain

    我查了项目目录 gradle/wrapper,发现只有一个文件gradle-wrapper.properties,缺少文件 gradle-wrapper.jar。
    ➜ kafka git:(trunk) ll gradle/wrapper
    total 8
    -rw-r--r-- 1 bobotang staff 202B 4 14 18:01 gradle-wrapper.properties

    然后执行命令 gradle -v,就会自动下载该 jar 包,

    ➜ kafka git:(trunk) gradle -v
    executing gradlew instead of gradle
    Downloading https://services.gradle.org/distributions/gradle-5.6.2-all.zip
    ..................................................................................

    Welcome to Gradle 5.6.2!

    Here are the highlights of this release:
     - Incremental Groovy compilation
     - Groovy compile avoidance
     - Test fixtures for Java projects
     - Manage plugin versions via settings script

    For more details see https://docs.gradle.org/5.6.2/release-notes.html

    ------------------------------------------------------------
    Gradle 5.6.2
    ------------------------------------------------------------

    Build time: 2019-09-05 16:13:54 UTC
    Revision: 55a5e53d855db8fc7b0e494412fc624051a8e781

    Kotlin: 1.3.41
    Groovy: 2.5.4
    Ant: Apache Ant(TM) version 1.9.14 compiled on March 12 2019
    JVM: 1.8.0_241 (Oracle Corporation 25.241-b07)
    OS: Mac OS X 10.15 x86_64

    最后再执行文章提到的两个命令 gradle、./gradlew jar ,就可以成功打成 jar 包。

    作者回复: 赞赞~

    2020-04-15
    1
  • delete is create
    一身立flag无数,却很少执行,今天我老王就立下了,跟上老师的步伐。😏

    作者回复: 加油加油!

    2020-04-14
  • 鲤鲤鱼
    老师我执行的时候报错了:
    $ ./gradlew jar
    curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to raw.githubusercontent.com:443
    curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to raw.githubusercontent.com:443
    Starting a Gradle Daemon (subsequent builds will be faster)

    > Configure project :
    Building project 'core' with Scala version 2.12.11
    Building project 'streams-scala' with Scala version 2.12.11

    > Task :clients:processMessages
    MessageGenerator: processed 103 Kafka message JSON files(s).

    > Task :core:compileScala
    Pruning sources from previous analysis, due to incompatible CompileSetup.
    E:\Դ▒▒\kafka\core\src\main\scala\kafka\coordinator\group\MemberMetadata.scala:31: private object MemberMetadata in package group is never used
    private object MemberMetadata {
                   ^
    E:\Դ▒▒\kafka\core\src\main\scala\kafka\network\RequestChannel.scala:109: parameter value nn in method body is never used
        def body[T <: AbstractRequest](implicit classTag: ClassTag[T], nn: NotNothing[T]): T = {
                                                                       ^
    E:\Դ▒▒\kafka\core\src\main\scala\kafka\utils\NotNothing.scala:40: parameter value n in method notNothingEvidence is never used
      implicit def notNothingEvidence[T](implicit n: T =:= T): NotNothing[T] = evidence.asInstanceOf[NotNothing[T]]
                                                  ^
    E:\Դ▒▒\kafka\core\src\main\scala\kafka\utils\json\DecodeJson.scala:88: higher-kinded type should be enabled
    by making the implicit value scala.language.higherKinds visible.
    This can be achieved by adding the import clause 'import scala.language.higherKinds'
    or by setting the compiler option -language:higherKinds.
    See the Scaladoc for value scala.language.higherKinds for a discussion
    why the feature should be explicitly enabled.
      implicit def decodeSeq[E, S[+T] <: Seq[E]](implicit decodeJson: DecodeJson[E], factory: Factory[E, S[E]]): DecodeJson[S[E]] = (node: JsonNode) => {

    作者回复: 底下的那一堆是告警不用管。你的真正问题是OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to raw.githubusercontent.com:443,也就是超时。。。
    估计还是连接国外Maven主仓库或github的问题。

    2020-04-14
  • 需要安装Docker吗?

    作者回复: 不用安装Docker

    2020-04-14
    2
收起评论
22
返回
顶部