Zookeeper Cluster Manager

    是基于 Apache Zookeeper 实现。由于 Vert.x 集群管理的可插拔性,也可轻易切换至其它的集群管理器。

    ZookeeperClusterManager 在组件 vertx-zookeeper 中,通过构建工具可以轻松引入:

    • Maven(pom.xml)
    • Gradle(gradle.xml)
    1. compile 'io.vertx:vertx-zookeeper:3.4.1'

    Vert.x 集群管理器包含以下几个功能:

    1. 发现并管理集群中的节点
    2. 管理集群端的主题订阅清单(这样就可以轻松得知集群中的那些节点订阅了那些 EventBus 地址)
    3. 分布式 Map 支持
    4. 分布式锁
    5. 分布式计数器

    注意事项
    Vert.x 集群器并不处理节点之间的通信,在 Vert.x 中节点中的通信是直接由 TCP 链接处理的。

    ZookeeperClusterManager 使用 框架而不是原生Zookeeper 客户端,因此需要依赖 guavaslf4jzookeeper 等其他第三方 jar 包。

    各路径作用为:

    • /io.vertx/cluster/nodes/ 对应 Vert.x 节点信息
    • /io.vertx/asyncMap/$name/ 存储通过接口 io.vertx.core.shareddata.AsyncMap 创建的 AsyncMap 记录
    • /io.vertx/asyncMultiMap/$name/ 存储通过接口 io.vertx.core.spi.cluster.AsyncMultiMap 创建的 AsyncMultiMap 记录
    • /io.vertx/locks/ 存储分布式锁

    Vert.x 能够从 classpath 路径的 jar 自动检测并使用出 ClusterManager 的实现。不过需要确保在 classpath 没有其他的 ClusterManager 实现。

    确保 vertx-zookeeper-3.4.1.jar 在 Vert.x 的安装路径中的 lib 目录下。

    • Maven(pom.xml)
    1. <dependency>
    2. <groupId>io.vertx</groupId>
    3. <artifactId>vertx-zookeeper</artifactId>
    4. <version>3.4.1</version>
    5. </dependency>
    • Gradle(gradle.xml)

    通过编码的形式,设置集群管理器实现,例子:

    1. ClusterManager mgr = new ZookeeperClusterManager();//创建 ZookeeperClusterManager
    2. VertxOptions options = new VertxOptions().setClusterManager(mgr);// 设置集群管理器
    3. if (res.succeeded()) {
    4. Vertx vertx = res.result();
    5. } else {
    6. // failed!
    7. }
    8. });

    通常情况下,ZookeeperClusterManager 使用 jar 包中内嵌的 default-zookeeper.json 设置相应的配置。

    1. # zookeeper.json 在当前路径中
    2. java -jar ... -cp . -cluster
    3. vertx run MyVerticle -cp . -cluster
    4. java -jar ... -cp conf -cluster

    还有一种方式来覆盖默认的配置文件,那就是利用系统配置 vertx.zookeeper.config 来实现:

    如果系统变量 vertx.zookeeper.config 值不为空时,将覆盖 classpath 中所有的 zookeeper.json 文件,但是如果加载 vertx.zookeeper.config 失败时,系统将选取 classpath 任意一个 zookeeper.json ,甚至直接使用默认配置。

    在配置文件 中已经通过注释的形式,详细说明每个配置项的作用。

    同其他集群管理器,亦可通过编程的形式来进行配置,举例:

    1. JsonObject zkConfig = new JsonObject();
    2. // 设置相关配置项
    3. zkConfig.put("zookeeperHosts", "127.0.0.1");// zk host 地址
    4. zkConfig.put("rootPath", "io.vertx");// 根路径
    5. zkConfig.put("retry", new JsonObject() // 重试策略
    6. .put("initialSleepTime", 3000)
    7. .put("maxTimes", 3));
    8. ClusterManager mgr = new ZookeeperClusterManager(zkConfig);
    9. VertxOptions options = new VertxOptions().setClusterManager(mgr);
    10. Vertx.clusteredVertx(options, res -> {
    11. if (res.succeeded()) {
    12. Vertx vertx = res.result();
    13. } else {
    14. // failed!
    15. }
    16. });

    注意:通过系统变量 vertx.zookeeper.hosts 也可以达到配置 zookeeper hosts 的目的。

    1. org.apache.zookeeper.level=INFO

    Vert.x 使用 2.1.1 版本的 Curator ,其使用 3.4.8 版本的 Zookeeper,因此不支持 3.5.x 中的最新特性。