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

老周聊架构

共 4303字,需浏览 9分钟

 ·

2022-03-19 04:22

一、环境准备

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




欢迎大家Java栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。

浏览 86
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报