文章很長,建議收藏起來,慢慢讀! Java 高並發 發燒友社群:瘋狂創客圈 奉上以下珍貴的學習資源:
-
免費贈送 經典圖書:《Java高並發核心編程(卷1)》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
-
免費贈送 經典圖書:《Java高並發核心編程(卷2)》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
-
免費贈送 經典圖書:《Netty Zookeeper Redis 高並發實戰》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
-
免費贈送 經典圖書:《SpringCloud Nginx高並發核心編程》 面試必備 + 大廠必備 +漲薪必備 加尼恩免費領
-
免費贈送 資源寶庫: Java 必備 百度網盤資源大合集 價值>10000元 加尼恩領取
推薦:入大廠 、做架構、大力提升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%\bin;
在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 那個時間
打開下面的連接:
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
啟動之后
可以在控制台發送消息