一、環(huá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 模塊編譯報錯,如下:
在這里插入圖片描述
點進去發(fā)現(xiàn)是 proto 包下的 MLDataFormats 類中的存在靜態(tài)類與源碼中的存在沖突,導致編譯失敗,所以我手動的導入正確的 proto 包下的類。
再次進行編譯:

在這里插入圖片描述
額,又編譯失敗,很明顯可以看出這是 test 包下的測試類,但我上面的
mvn install -DskipTests 命令,不是會跳過測試類進行編譯嗎?這就要說下這兩者的區(qū)別了:
mvn install -Dmaven.test.skip=true 測試類不會生成.class 文件
mvn install -DskipTests 測試類會生成.class文件
測試類不想導入正確的 proto 包中類的話。我們就下面這個命令來編譯安裝:
mvn install -Dmaven.test.skip=true
這次就能忽略測試類進行相應的編譯以及安裝:

在這里插入圖片描述
當你看到
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 實例的 jar 包和 Python 實例的 py 文件。
- lib:所有 Pulsar 編譯后的 jar 包都在這里。
- licenses:許可證信息,可以忽略。
3.2 源碼的目錄結(jié)構(gòu)

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

在這里插入圖片描述
/**
* @author: 微信公眾號【老周聊架構(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());
}
}
先寫個 PulsarClientTest 測試類,然后跑一下,打印出日志,沒有報錯的話,說明這個 Pulsar 源碼環(huán)境是 ok 的。
org.apache.pulsar.client.impl.PulsarClientImpl@5a4aa2f2