vertx ha实践

2022/04/20 vertx

VertX-HA

源代码

参考

https://vertx.io/docs/vertx-core/java/#_high_availability_and_fail_over
https://stackoverflow.com/questions/51837957/vert-x-high-availability-is-not-working

引入 集群

依赖

这里使用 zookeeper 实现集群,并使用 zookeeper 作为集群注册中心。

implementation 'io.vertx:vertx-zookeeper:4.2.7'   exclude group: 'org.apache.zookeeper', module: 'zookeeper'
    implementation 'org.apache.zookeeper:zookeeper:3.5.8'

并增加 logback 支持,并使用默认配置。

implementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.11'

zookeeper server

https://archive.apache.org/dist/zookeeper/zookeeper-3.5.8/

启动 zkServer.sh start xxxx配置(conf)
这里的server 与上面依赖的包 对应。

代码实践

文件层级

.
├── settings.gradle
└── src
    ├── main
    │   ├── kotlin
    │   │   ├── Main.kt
    │   │   └── verticle
    │   │       └── Verticle.kt
    │   └── resources
    │       └── logback.xml

代码实现

// Main.kt
// 启动 vm 参数 -Dvertx.zookeeper.config=./config/zookeeper.json -Xmx64m
// 环境变量  deploy=1
import io.vertx.core.DeploymentOptions
import io.vertx.core.Vertx
import io.vertx.core.VertxOptions
import io.vertx.core.spi.cluster.ClusterManager
import io.vertx.spi.cluster.zookeeper.ZookeeperClusterManager


fun main() {
    val mgr: ClusterManager = ZookeeperClusterManager()
    val options = VertxOptions()
        .setClusterManager(mgr)
        .setHAEnabled(true)
        // .setHAGroup("my-group")  // 集群组名称 https://vertx.io/docs/vertx-core/java/#_ha_groups

    var clusteredVertx = Vertx.clusteredVertx(options)
    clusteredVertx.onSuccess {
        val vertx = it
        var deploy = System.getenv("deploy")
        if (deploy == "1") {
            vertx.deployVerticle("verticle.Verticle", DeploymentOptions().setHa(true))
        }
    }.onFailure {
        println("Failed to deploy verticle")
    }
}
package verticle

import io.vertx.core.*
import kotlin.random.Random

class Verticle : AbstractVerticle() {

    override fun start() {
        var nextInt = Random.nextInt(8000, 9000)
        println(nextInt)
        vertx.createHttpServer().requestHandler { req ->
            req.response().end("$nextInt Hello from Vert.x-Web!")
        }.listen(nextInt)
    }
}

思路解释

根据 环境变量配置 启动时 设置不同的 deploy=1 则部署,否则启动时不部署。
然后二者启动后,kill掉 deploy=1 的进程。等一会 观察 deploy=0 的进程会打印端口号。
即可验证完成。

deploy=1 1 deploy=0 0

Search

    Table of Contents