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 deploy=0