共计 3800 个字符,预计需要花费 10 分钟才能阅读完成。
一、环境筹备
老周这里编译 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