zoukankan      html  css  js  c++  java
  • Kafka源码分析1:源码的开发环境搭建 (图解+秒懂+史上最全)

    文章很长,建议收藏起来,慢慢读! Java 高并发 发烧友社群:疯狂创客圈 奉上以下珍贵的学习资源:


    推荐:入大厂 、做架构、大力提升Java 内功 的 精彩博文

    入大厂 、做架构、大力提升Java 内功 必备的精彩博文 2021 秋招涨薪1W + 必备的精彩博文
    1:Redis 分布式锁 (图解-秒懂-史上最全) 2:Zookeeper 分布式锁 (图解-秒懂-史上最全)
    3: Redis与MySQL双写一致性如何保证? (面试必备) 4: 面试必备:秒杀超卖 解决方案 (史上最全)
    5:面试必备之:Reactor模式 6: 10分钟看懂, Java NIO 底层原理
    7:TCP/IP(图解+秒懂+史上最全) 8:Feign原理 (图解)
    9:DNS图解(秒懂 + 史上最全 + 高薪必备) 10:CDN图解(秒懂 + 史上最全 + 高薪必备)
    11: 分布式事务( 图解 + 史上最全 + 吐血推荐 ) 12:seata AT模式实战(图解+秒懂+史上最全)
    13:seata 源码解读(图解+秒懂+史上最全) 14:seata TCC模式实战(图解+秒懂+史上最全)

    Java 面试题 30个专题 , 史上最全 , 面试必刷 阿里、京东、美团... 随意挑、横着走!!!
    1: JVM面试题(史上最强、持续更新、吐血推荐) 2:Java基础面试题(史上最全、持续更新、吐血推荐
    3:架构设计面试题 (史上最全、持续更新、吐血推荐) 4:设计模式面试题 (史上最全、持续更新、吐血推荐)
    17、分布式事务面试题 (史上最全、持续更新、吐血推荐) 一致性协议 (史上最全)
    29、多线程面试题(史上最全) 30、HR面经,过五关斩六将后,小心阴沟翻船!
    9.网络协议面试题(史上最全、持续更新、吐血推荐) 更多专题, 请参见【 疯狂创客圈 高并发 总目录

    SpringCloud 精彩博文
    nacos 实战(史上最全) sentinel (史上最全+入门教程)
    SpringCloud gateway (史上最全) 更多专题, 请参见【 疯狂创客圈 高并发 总目录

    Kafka源码分析(史上最全)1:源码的开发环境搭建

    背景:

    下一个视频版本,从架构师视角,尼恩为大家打造史上最强kafka源码视频

    并且,进一步,带大家实现一个超高质量的项目实操:10WQPS超高并发消息队列架构与实操

    本系列博客的具体内容,请参见 Java 高并发 发烧友社群:疯狂创客圈

    接下来:

    • 首先,开始Kafka源码分析
    • 然后,10WQPS超高并发消息队列架构与实操

    开发环境和工具

    • mac os
    • gradle 4.8
    • java 1.8
    • scala 2.11.12
    • kafka-1.1.0-src
    • idea 2018.1.2
    • scala-intellij-bin-2018.1.10.zip

    安装 Gradle

    要搭建 Kafka 开发环境,你必须要安装好 Gradle,把 Gradle 环境加入到环境变量中。

    在这里插入图片描述

    同时在 IDEA 中安装可以设置 gradle的位置。

    在这里插入图片描述

    win10安装scala

    查看版本

    从源码的配置文件中,可以看到需要 2.11.12版本的scala

    在这里插入图片描述

    下载安装scalaMSI安装文件

    从Scala官方网站下载,

    https://www.scala-lang.org/download/all.html

    windows版本的安装包是scala-XX.XX.XX.msi。 ·使用下载下来的安装包安装Scala

    也可以从疯狂创客圈的 网盘下载

    在这里插入图片描述

    安装 scala

    点击安装即可

    配置scala环境变量

    SCALA_HOME:scala安装目录

    Path:%SCALA_HOME%in;

    在这里插入图片描述

    在这里插入图片描述

    在gitbash中输入scala验证scala是否成功安装

    MINGW64 /e/ref/kafka
    $ scala
    Welcome to Scala 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_91).
    Type in expressions for evaluation. Or try :help.
    
    scala>
    
    
    

    下载源码:

    仓库地址:

    https://codeload.github.com/apache/kafka/zip/trunk
    

    码云的地址:

    https://gitee.com/apache/kafka.git
    

    码云下载更快。

    [core]
    	repositoryformatversion = 0
    	filemode = false
    	bare = false
    	logallrefupdates = true
    	symlinks = false
    	ignorecase = true
    [remote "origin"]
    	url = https://gitee.com/apache/kafka.git
    	fetch = +refs/heads/*:refs/remotes/origin/*
    [branch "trunk"]
    	remote = origin
    	merge = refs/heads/trunk
    [branch "1.0"]
    	remote = origin
    	merge = refs/heads/1.0
    [branch "0.10.1"]
    	remote = origin
    	merge = refs/heads/0.10.1
    [branch "1.1"]
    	remote = origin
    	merge = refs/heads/1.1
    [http]
    	sslVerify = false
    
    

    修改镜像仓库到阿里云

    修改里build.gradle的镜像仓库到阿里云
    build.gradle 中 设置 aliyun 代理 build.gradle

    buildscript {
      repositories {
    	// mavenCentral()  //原有注释
    	//新增
        maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
        jcenter()
      }
    }
    
    allprojects {
    
    
      repositories {
    	//    mavenCentral()  //原有注释
    	//新增
        maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
      }
    }
    

    build.gradle 中 dependencies 修改

    dependencies {
        // For Apache Rat plugin to ignore non-Git files
        classpath "org.ajoberstar:grgit:1.9.3"
        classpath 'com.github.ben-manes:gradle-versions-plugin:0.15.0'
        classpath 'org.scoverage:gradle-scoverage:2.5.0'    // 将2.1.0修改为2.5.0
        classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.1'
      }
    

    修改gradle/buildscript.gradle 里的镜像仓库到阿里云

    repositories {
      repositories {
        // For license plugin.
        maven {
    	  //url 'http://dl.bintray.com/content/netflixoss/external-gradle-plugins/'  //原有注释
    	  //新增
          url 'http://maven.aliyun.com/nexus/content/groups/public/'
        }
      }
    }
    

    源码编译

    下载 Gradle 的 Wrapper 程序套件

    代码下载完成之后,会自动创建一个名为 kafka 的子目录,此时需要进入到该目录下,执行下面的这条命令,主要目的是下载 Gradle 的 Wrapper 程序套件。

    $ gradle
    Starting a Gradle Daemon (subsequent builds will be faster)
     
     
    > Configure project :
    Building project 'core' with Scala version 2.12.9
    Building project 'streams-scala' with Scala version 2.12.9
     
     
    Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0.
    Use '--warning-mode all' to show the individual deprecation warnings.
    See https://docs.gradle.org/5.3/userguide/command_line_interface.html#sec:command_line_warning
    

    Gradle 的 Wrapper 程序套件 叫做 gradlew, 是一个shell脚本,需要 在shell 执行工具中打开。

    可以在 gitbash 中打开。

    通过gitbash 将 Kafka 源码编译打包成 Jar 文件

    通过gitbash ,在windows上使用shell脚本:

    在这里插入图片描述

    现在,你可以运行下列命令,将 Kafka 源码编译打包成 Jar 文件:

    gradle在执行build的时候想跳过test task,那么可以使用-x命令

    -x参数用来排除不需要执行的任务

     ./gradlew jarall
    
     ./gradlew clean releaseTarGz -x test
    
    
    

    执行过程

    MINGW64 /e/ref/kafka/kafka (1.1)
    $ gradlew jarall
    Downloading https://services.gradle.org/distributions/gradle-4.8.1-all.zip
    ................................................................................                                                                                                                                  .........................
    
    Welcome to Gradle 4.8.1!
    
    Here are the highlights of this release:
     - Dependency locking
     - Maven Publish and Ivy Publish plugins improved and marked stable
     - Incremental annotation processing enhancements
     - APIs to configure tasks at creation time
    
    For more details see https://docs.gradle.org/4.8.1/release-notes.html
    
    Starting a Gradle Daemon (subsequent builds will be faster)
    
    > Configure project :
    Building project 'core' with Scala version 2.11.12
    
    > Configure project :kafka
    Building project 'core' with Scala version 2.11.12
    
    
    ./gradlew clean releaseTarGz -x test
    

    在这里插入图片描述

    经过一系列操作之后,比如 Gradle 拉取依赖 Jar 包、编译 Kafka 源码、打包等,结果终于出来,

    你可以在 core 的 build/distributions 下面找到生成的 tgz 包:

    在这里插入图片描述

    解压之后,这就是一个可以正常启动运行的 Kafka 环境了。

    编译过程中遇到的问题:

    raw.githubusercontent.com域名不能访问的问题

    修改hosts,解决raw.githubusercontent.com域名不能访问的问题。

    在https://www.ipaddress.com/查询raw.githubusercontent.com的真实IP。

    sudo vim /etc/hosts
    199.232.28.133 raw.githubusercontent.com
    

    SSL传输问题

    编译中遇到错误

    curl: (35) Unknown SSL protocol error in connection to raw.githubusercontent.com:443
    

    解决措施, 让请求忽略SSL传输。

    在git的config文件中增加

    [http]
    
    sslVerify = false
    

    或在命令行窗口输入:

    git config http.sslVerify "false"
    

    还有一大堆的告警信息

    在这里插入图片描述

    直接忽略

    把 Kafka 源码工程导入到 IDEA 中

    这也是搭建开发环境的最后一步。

    如果你用的是 Eclipse,执行下面的指令即可

    ./gradlew eclipse 
    
    

    如果你用的是 IDEA,你可以先执行下面的命令去创建 IDEA 项目所需要的项目文件:

    $ ./gradlew idea  
    

    在这里插入图片描述

    接着,你需要打开 IDEA,选择“打开工程”即可。

    在这里插入图片描述

    至此,我们就在 IDEA 中搭建了 Kafka 源码环境。

    idea scala插件安装

    在线安装idea的 scala 插件

    在这里插入图片描述
    直接install很慢,会失败,采用离线的方式

    idea scala插件离线安装

    先查看自己需要的scala 插件版本,查看方法如下:

    打开idea 找到右下角Configure->Plugins 点进去搜索scala 点击Search in repositories,最后找到updated 那个时间

    img

    img

    打开下面的连接:

    http://plugins.jetbrains.com/plugin/1347-scala

    下载对应版本的scala插件

    下载完成后 进入Configure->Plugins 下点击右下角 Install plugin from disk.... 选择你下载的scala插件地址

    到此完成插件安装

    idea配置运行kafka

    运行虚拟机的zookeeper

    首先运行虚拟机的zookeeper

    在这里插入图片描述

    配置kafka应用参数,修改其中的zk的地址。

    config/server.properties
    

    在这里插入图片描述

    idea中运行kafka

    接着idea中运行,kafka,create topic, producer,consumer

    配置kafka的应用application参数

    运行core包下的kafka主类

    直接idea打开源码工程后,配置运行的应用设置。

    配置Run/Debug Configurations

    在这里插入图片描述

    开启kafka应用

    在这里插入图片描述

    报错缺少包slf4j-nop:

    在这里插入图片描述

    SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”.
    缺少包slf4j-nop,导入该包。

    具体步骤:

    1 在dependencies.gradle中加入

    slf4jnop: "org.slf4j:slf4j-nop:$versions.slf4j",
    

    在这里插入图片描述

    2 在build.gradle中project(':core') 后面加上compile libs.slf4jnop

    在这里插入图片描述

    编译报错,没有有效错误消息

    FAILURE: Build failed with an exception.

    • What went wrong:
      Execution failed for task ':core:Kafka.main()'.

    Process 'command 'C:/Program Files/Java/jdk1.8.0_91/bin/java.exe'' finished with non-zero exit value 1

    • Try:
      Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

    • Get more help at https://help.gradle.org

    BUILD FAILED in 42s
    5 actionable tasks: 2 executed, 3 up-to-date
    Disconnected from the target VM, address: '127.0.0.1:20494', transport: 'socket'
    20:37:10: Task execution finished 'Kafka.main()'.

    解决方案:

    打开File->Settings->Build,Execution,Deployment->Build Tools->Gradle,将build&Run tests using改成InterlliJ IDEA。

    在这里插入图片描述

    运行成功,brokder对应的元数据

    在这里插入图片描述

    create topic(test)

    配置执行应用的参数

    --create --zookeeper cdh1:2181 --replication-factor 1 --partitions 1 --topic test
    

    在这里插入图片描述

    执行结果

    在这里插入图片描述

    topic对应的元数据

    在这里插入图片描述

    启动consumer

    配置执行参数

    --bootstrap-server localhost:9092 --from-beginning --topic test
    

    在这里插入图片描述

    启动之后

    在这里插入图片描述

    producer

    配置执行应用的参数

    --topic test --broker-list localhost:9092
    
    

    在这里插入图片描述

    启动之后

    可以在控制台发送消息

    在这里插入图片描述

    消费者接受消息

    在这里插入图片描述

  • 相关阅读:
    Android sendToTarget
    OSI七层模型具体解释
    JAVA中字符串比較equals()和equalsIgnoreCase()的差别
    [Angular 2] ng-class and Encapsulated Component Styles
    [Angular 2] Passing data to components with @Input
    [Angular 2] Template property syntax
    [Angular 2] Adding a data model
    [Angular 2] Using ng-model for two-way binding
    [Angular 2] ngFor
    [Angular 2] Inject Service
  • 原文地址:https://www.cnblogs.com/crazymakercircle/p/15366785.html
Copyright © 2011-2022 走看看