聊聊 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 模块编译报错,如下:聊聊 Pulsar(编译 Pulsar 源码并搭建源码环境)
文章图片

点进去发现是 proto 包下的 MLDataFormats 类中的存在静态类与源码中的存在冲突,导致编译失败,所以我手动的导入正确的 proto 包下的类。
再次进行编译:
聊聊 Pulsar(编译 Pulsar 源码并搭建源码环境)
文章图片

额,又编译失败,很明显可以看出这是 test 包下的测试类,但我上面的 mvn install -DskipTests 命令,不是会跳过测试类进行编译吗?这就要说下这两者的区别了:
mvn install -Dmaven.test.skip=true 测试类不会生成.class 文件
mvn install -DskipTests 测试类会生成.class文件
测试类不想导入正确的 proto 包中类的话。我们就下面这个命令来编译安装:
mvn install -Dmaven.test.skip=true

这次就能忽略测试类进行相应的编译以及安装:
聊聊 Pulsar(编译 Pulsar 源码并搭建源码环境)
文章图片

当你看到 BUILD SUCCESS 表示编译成功了。
三、Pulsar 的目录结构 3.1 压缩包的目录结构
聊聊 Pulsar(编译 Pulsar 源码并搭建源码环境)
文章图片

  • 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 源码的目录结构
聊聊 Pulsar(编译 Pulsar 源码并搭建源码环境)
文章图片

你是不是也有和我一样的感受,这些模块感觉乱七八糟,是的,没错,社区也一直在做模块的一些优化,一些非必要的模块开始被移除、合并到其它模块中去。
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 包。
  • 【聊聊 Pulsar(编译 Pulsar 源码并搭建源码环境)】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 一个自己的测试模块
聊聊 Pulsar(编译 Pulsar 源码并搭建源码环境)
文章图片

/** * @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

    推荐阅读