聊聊 Pulsar:編譯 Pulsar 源碼并搭建源碼環(huán)境
一、環(huán)境準(zhǔn)備
老周這里編譯 Pulsar 的版本是 2.9.1,也是 Pulsar 目前最新的版本。
JDK:1.8.0_241
Maven:3.6.1
Pulsar:apache-pulsar-2.9.1-src.tar.gz
二、源碼編譯
編譯&安裝命令:
mvn?install?-DskipTests
執(zhí)行完上述的 maven 命令后,發(fā)現(xiàn) managed-ledger 模塊編譯報(bào)錯(cuò),如下:

點(diǎn)進(jìn)去發(fā)現(xiàn)是 proto 包下的 MLDataFormats 類中的存在靜態(tài)類與源碼中的存在沖突,導(dǎo)致編譯失敗,所以我手動(dòng)的導(dǎo)入正確的 proto 包下的類。
再次進(jìn)行編譯:

額,又編譯失敗,很明顯可以看出這是 test 包下的測(cè)試類,但我上面的
mvn install -DskipTests 命令,不是會(huì)跳過(guò)測(cè)試類進(jìn)行編譯嗎?這就要說(shuō)下這兩者的區(qū)別了:mvn install -Dmaven.test.skip=true 測(cè)試類不會(huì)生成.class 文件
mvn install -DskipTests 測(cè)試類會(huì)生成.class文件
測(cè)試類不想導(dǎo)入正確的 proto 包中類的話。我們就下面這個(gè)命令來(lái)編譯安裝:
mvn?install?-Dmaven.test.skip=true
這次就能忽略測(cè)試類進(jìn)行相應(yīng)的編譯以及安裝:

當(dāng)你看到
BUILD SUCCESS 表示編譯成功了。三、Pulsar 的目錄結(jié)構(gòu)
3.1 壓縮包的目錄結(jié)構(gòu)

bin:包含所有的 CLI 工具,包括 pulsar-admin、pulsar-client、pulsar、bookkeeper 等。
conf:包含所有的配置文件,包括 client、broker、bookkeeper、zookeeper 的配置等,CLI 工具的配置文件也都在里面。
examples:包含 Java 和 Python 使用 pulsar-function 的例子。
instances:包含 Java 實(shí)例的 jar 包和 Python 實(shí)例的 py 文件。
lib:所有 Pulsar 編譯后的 jar 包都在這里。
licenses:許可證信息,可以忽略。
3.2 源碼的目錄結(jié)構(gòu)

你是不是也有和我一樣的感受,這些模塊感覺(jué)亂七八糟,是的,沒(méi)錯(cuò),社區(qū)也一直在做模塊的一些優(yōu)化,一些非必要的模塊開(kāi)始被移除、合并到其它模塊中去。
3.2.1 輔助、測(cè)試類的模塊
bin:包含所有的 CLI 工具,包括 pulsar-admin、pulsar-client、pulsar、bookkeeper 等。
bouncy-castle:一個(gè) Java 庫(kù),對(duì)默認(rèn) Java Cryptographic Extension(JCE)的補(bǔ)充,它比 Sun 提供的默認(rèn) JCE 多了許多密碼套件和算法。Pulsar 的安全性和加密技術(shù)依賴于它。
build:一些 CI 以及 docker 的構(gòu)建腳本。
buildtools:主要是包含一些構(gòu)建時(shí)使用的工具,比如我們?cè)?Github 上為 Pulsar 提交了一個(gè) PR,會(huì)自動(dòng)觸發(fā)測(cè)試,由該模塊完成。
conf:包含所有的配置文件,包括 client、broker、bookkeeper、zookeeper 的配置等,CLI 工具的配置文件也都在里面。
deployment:部署相關(guān),比如 k8s 的一些配置文件。
dev:里面目前只有 Vagrantfile 文件,主要描述項(xiàng)目所需的機(jī)器類型,以及如何配置和提供這些機(jī)器。
distribution:如果我們執(zhí)行了編譯操作,那么最后的編譯產(chǎn)物就會(huì)在這個(gè)目錄下,分為 io(即 connector)、offloaders、server 這三個(gè)子模塊,server 就是主體的 Pulsar 程序。
docker、docker-compose:docker 鏡像模塊,里面有對(duì)應(yīng)的 Dockerfile。
jclouds-shaded、kafka-connect-avro-converter-shaded、pulsar-broker-shaded、pulsar-client-admin-shaded:shaded 模塊是使用 maven-shade-plugin 生成的,主要作用:將依賴的 jar 包打包到當(dāng)前 jar 包中、重命名依賴的 jar 包。
managed-ledger:managed-ledger 是 Pulsar 底層存儲(chǔ) BookKeeper 中的概念,相當(dāng)于一種記錄的集合) 緩存中調(diào)度消息,除非積壓的消息超過(guò)這個(gè)緩存的大小。如果積壓的消息對(duì)于緩存來(lái)說(shuō)太大了,則 Broker 將開(kāi)始從 BookKeeper 那里讀取 Entries(Entry 同樣是 BookKeeper 中的概念,相當(dāng)于一條記錄)。
pulsar-client-tools-test:CLI 工具測(cè)試相關(guān)。
pulsar-common:Pulsar 的通用模塊。Broker 和 Client 都會(huì)同時(shí)引用的公共模塊,里面定義了一些兩邊都會(huì)用到的對(duì)象,比如 PulsarApi.proto。
pulsar-config-validation:用于校驗(yàn)配置正確性的通用包,在 Function 和 I/O 中會(huì)被使用。
pulsar-metadata:Pulsar 相關(guān)元數(shù)據(jù)信息。
pulsar-testclient:Pulsar 測(cè)試的一些客戶端。
structured-event-log:日志事件相關(guān)。
testmocks:?jiǎn)卧獪y(cè)試的時(shí)候,有很多 Mock 的工具類都放在這個(gè)模塊里。
tests:用于測(cè)試(比如集成測(cè)試、兼容性測(cè)試、shade 模塊測(cè)試等)的模塊,都在這個(gè)模塊中。
3.2.2 功能相關(guān)的模塊
pulsar-broker:最主要的模塊,Pulsar 的服務(wù)端 Broker。
pulsar-broker-auth-athenz:Broker 的 Athenz 身份驗(yàn)證插件。
pulsar-broker-auth-sasl:Broker 的 SASL 身份驗(yàn)證插件。
pulsar-broker-common:Broker 端的通用模塊,被 pulsar-functions、pulsar-websocket 等模塊共同使用。例如:身份驗(yàn)證、配置緩存等通用能力。
pulsar-client:數(shù)據(jù)流客戶端,通常被業(yè)務(wù)使用,比如最基礎(chǔ)的發(fā)布、訂閱消息。
pulsar-client-1x-base:Pulsar 對(duì) 1.x 版本的協(xié)議做了兼容,這個(gè)是 1.x 版本的協(xié)議的客戶端。
pulsar-client-admin:管理流客戶端,用于調(diào)用管理相關(guān)的接口,比如創(chuàng)建、刪除 Topic。
pulsar-client-admin-api:管理流客戶端相關(guān)的接口。
pulsar-client-all:?jiǎn)渭冇糜跇?gòu)建完整的客戶端,管理流和數(shù)據(jù)流都打到一個(gè)包里。
pulsar-client-api:Client 的通用 API。
pulsar-client-auth-athenz:Client 的 Athenz 身份驗(yàn)證插件。
pulsar-client-auth-sasl:Client 的 SASL 身份驗(yàn)證插件。
pulsar-client-cpp:Pulsar 的 C++ 客戶端。
pulsar-client-messagecrypto-bc:消息加密工具庫(kù)。
pulsar-client-tools:一些 CLI 工具。
pulsar-function-go:Pulsar Function go 語(yǔ)言相關(guān)。
pulsar-functions:Pulsar Function 的主要實(shí)現(xiàn)。
pulsar-io:一些具體的 I/O 工具,可以讓 Pulsar 的數(shù)據(jù)和其它軟件打通,比如 Kafka、Flink。
pulsar-package-management:提供了一種更簡(jiǎn)單的方法來(lái)管理包。比如抽象存儲(chǔ),這樣就可以將包存儲(chǔ)在任何地方,我們可以將包存儲(chǔ)在云上,以支持所有 Pulsar 包(如函數(shù)、連接器)的注冊(cè)表。
pulsar-proxy:Pulsar 的代理層。
pulsar-sql:Pulsar SQL 的主要實(shí)現(xiàn)模塊,基于 Presto(Facebook 開(kāi)發(fā)的數(shù)據(jù)查詢引擎),我們可以用 SQL 查詢 Pulsar 中的消息。
pulsar-transaction:Pulsar 的事務(wù)組件。
pulsar-websocket:Pulsar 的 WebSocket 通信實(shí)現(xiàn)。
pulsar-zookeeper-utils:Pulsar 關(guān)于 zk 的一些工具類。
tiered-storage:offload 的具體實(shí)現(xiàn)模塊,可以把冷數(shù)據(jù)卸載到 AWS、Google 等云上。
四、環(huán)境驗(yàn)證
我們?cè)谠创a中新建 pulsar-riemann-test 一個(gè)自己的測(cè)試模塊

/**
?*?@author:?微信公眾號(hào)【老周聊架構(gòu)】
?*/
public?class?PulsarClientTest?{
????public?static?void?main(String[]?args)?throws?PulsarClientException?{
????????PulsarClient?client?=?PulsarClient.builder()
????????????????.listenerThreads(1)
????????????????.ioThreads(1)
????????????????.serviceUrl("pulsar://127.0.0.1:6650")
????????????????.build();
????????System.out.println(client.toString());
????}
}
先寫個(gè) PulsarClientTest 測(cè)試類,然后跑一下,打印出日志,沒(méi)有報(bào)錯(cuò)的話,說(shuō)明這個(gè) Pulsar 源碼環(huán)境是 ok 的。
org.apache.pulsar.client.impl.PulsarClientImpl@5a4aa2f2
歡迎大家關(guān)注我的公眾號(hào)【老周聊架構(gòu)】,Java后端主流技術(shù)棧的原理、源碼分析、架構(gòu)以及各種互聯(lián)網(wǎng)高并發(fā)、高性能、高可用的解決方案。
