聊聊 Pulsar:编译 Pulsar 源码并搭建源码环境

一、环境准备

老周这里编译 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

执行完上述的 maven 命令后,发现 managed-ledger 模块编译报错,如下:
在这里插入图片描述

点进去发现是 proto 包下的 MLDataFormats 类中的存在静态类与源码中的存在冲突,导致编译失败,所以我手动的导入正确的 proto 包下的类。

再次进行编译:

在这里插入图片描述

额,又编译失败,很明显可以看出这是 test 包下的测试类,但我上面的 mvn install -DskipTests 命令,不是会跳过测试类进行编译吗?这就要说下这两者的区别了:

mvn install -Dmaven.test.skip=true 测试类不会生成.class 文件
mvn install -DskipTests 测试类会生成.class文件

测试类不想导入正确的 proto 包中类的话。我们就下面这个命令来编译安装:

mvn install -Dmaven.test.skip=true

这次就能忽略测试类进行相应的编译以及安装:

在这里插入图片描述

当你看到 BUILD SUCCESS 表示编译成功了。

三、Pulsar 的目录结构

3.1 压缩包的目录结构

在这里插入图片描述
  • 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 源码的目录结构

在这里插入图片描述

你是不是也有和我一样的感受,这些模块感觉乱七八糟,是的,没错,社区也一直在做模块的一些优化,一些非必要的模块开始被移除、合并到其它模块中去。

3.2.1 辅助、测试类的模块

  • bin:包含所有的 CLI 工具,包括 pulsar-admin、pulsar-client、pulsar、bookkeeper 等。
  • bouncy-castle:一个 Java 库,对默认 Java Cryptographic Extension(JCE)的补充,它比 Sun 提供的默认 JCE 多了许多密码套件和算法。Pulsar 的安全性和加密技术依赖于它。
  • build:一些 CI 以及 docker 的构建脚本。
  • buildtools:主要是包含一些构建时使用的工具,比如我们在 Github 上为 Pulsar 提交了一个 PR,会自动触发测试,由该模块完成。
  • conf:包含所有的配置文件,包括 client、broker、bookkeeper、zookeeper 的配置等,CLI 工具的配置文件也都在里面。
  • deployment:部署相关,比如 k8s 的一些配置文件。
  • dev:里面目前只有 Vagrantfile 文件,主要描述项目所需的机器类型,以及如何配置和提供这些机器。
  • distribution:如果我们执行了编译操作,那么最后的编译产物就会在这个目录下,分为 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 中的概念,相当于一种记录的集合) 缓存中调度消息,除非积压的消息超过这个缓存的大小。 如果积压的消息对于缓存来说太大了,则 Broker 将开始从 BookKeeper 那里读取 Entries(Entry 同样是 BookKeeper 中的概念,相当于一条记录)。
  • pulsar-client-tools-test:CLI 工具测试相关。
  • pulsar-common:Pulsar 的通用模块。Broker 和 Client 都会同时引用的公共模块,里面定义了一些两边都会用到的对象,比如 PulsarApi.proto。
  • pulsar-config-validation:用于校验配置正确性的通用包,在 Function 和 I/O 中会被使用。
  • pulsar-metadata:Pulsar 相关元数据信息。
  • pulsar-testclient:Pulsar 测试的一些客户端。
  • structured-event-log:日志事件相关。
  • testmocks:单元测试的时候,有很多 Mock 的工具类都放在这个模块里。
  • tests:用于测试(比如集成测试、兼容性测试、shade 模块测试等)的模块,都在这个模块中。

3.2.2 功能相关的模块

  • 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:数据流客户端,通常被业务使用,比如最基础的发布、订阅消息。
  • pulsar-client-1x-base:Pulsar 对 1.x 版本的协议做了兼容,这个是 1.x 版本的协议的客户端。
  • pulsar-client-admin:管理流客户端,用于调用管理相关的接口,比如创建、删除 Topic。
  • pulsar-client-admin-api:管理流客户端相关的接口。
  • pulsar-client-all:单纯用于构建完整的客户端,管理流和数据流都打到一个包里。
  • 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 语言相关。
  • pulsar-functions:Pulsar Function 的主要实现。
  • pulsar-io:一些具体的 I/O 工具,可以让 Pulsar 的数据和其它软件打通,比如 Kafka、Flink。
  • pulsar-package-management:提供了一种更简单的方法来管理包。比如抽象存储,这样就可以将包存储在任何地方,我们可以将包存储在云上,以支持所有 Pulsar 包(如函数、连接器)的注册表。
  • pulsar-proxy:Pulsar 的代理层。
  • pulsar-sql:Pulsar SQL 的主要实现模块,基于 Presto(Facebook 开发的数据查询引擎),我们可以用 SQL 查询 Pulsar 中的消息。
  • pulsar-transaction:Pulsar 的事务组件。
  • pulsar-websocket:Pulsar 的 WebSocket 通信实现。
  • pulsar-zookeeper-utils:Pulsar 关于 zk 的一些工具类。
  • tiered-storage:offload 的具体实现模块,可以把冷数据卸载到 AWS、Google 等云上。

四、环境验证

我们在源码中新建 pulsar-riemann-test 一个自己的测试模块

在这里插入图片描述

/**
 * @author: 微信公众号【老周聊架构】
 */
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 源码环境是 ok 的。

org.apache.pulsar.client.impl.PulsarClientImpl@5a4aa2f2
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容