集群模式vertx啟動方式
其實vertx的啟動方式只有兩種,一種是自己創建Vertx對象;一種是使用Vertx Launcher。官方的命令行工具其實也是一個Vertx Launcher,但添加了對多種語言的支持。其lib目錄包含了vertx框架的全部依賴庫,可以部署多種語言編寫的verticle。
Hazelcast集群管理器:
vertx默認使用Hazelcast,默認集群管理器配置文件也是Hazelcast的配置文件。啟用集群模式時不需要額外單獨部署Hazelcast,只需要將vertx-hazelcast添加到classpath即可,vertx會自動啟動它。vertx啟動集群時會先查找classpath下的cluster.xml配置文件,找不到就會使用default-cluster.xml作為配置文件。
這里使用Hazelcast進行演示。
1. 編寫兩個verticle作為示例。
SenderVerticle
import io.vertx.core.AbstractVerticle;
import io.vertx.core.eventbus.EventBus;
import io.vertx.core.json.JsonObject;
public class SenderVerticle extends AbstractVerticle {
@Override
public void start() throws Exception {
EventBus eventBus = vertx.eventBus();
JsonObject msg = new JsonObject().put("message_from_sender_verticle", "Hello, Consumer !");
vertx.setPeriodic(3000, index -> {
eventBus.request("receiver", msg, res -> {
if (res.succeeded()) {
JsonObject reply = (JsonObject) res.result().body();
System.out.println("received reply: " + reply.getValue("reply"));
}
});
});
}
}
ReceiverVerticle
import io.vertx.core.AbstractVerticle;
import io.vertx.core.eventbus.EventBus;
import io.vertx.core.eventbus.MessageConsumer;
import io.vertx.core.json.JsonObject;
public class ReceiverVerticle extends AbstractVerticle {
@Override
public void start() throws Exception {
EventBus eventBus = vertx.eventBus();
MessageConsumer<JsonObject> consumer = eventBus.consumer("receiver");
consumer.handler(message -> {
JsonObject jsonMessage = message.body();
System.out.println(jsonMessage.getValue("message_from_sender_verticle"));
JsonObject jsonReply = new JsonObject().put("reply", "666 !");
message.reply(jsonReply);
});
}
}
2. 使用vertx命令行工具
vertx命令行工具官網首頁就可以下載,下載之后將里面的bin路徑添加到path環境變量就可以使用了。注意路徑中不能包含中文和空格。使用集群模式時,需要添加集群配置。
-
修改配置文件
將config目錄下的default-cluster.xml復制一份,重命名為cluster.xml,找到network項進行配置。
<tcp-ip enabled="true"> <interface>192.168.1.27</interface> <interface>192.168.1.28</interface> <interface>192.168.1.29</interface> </tcp-ip>
-
啟動verticle
打開兩個終端,分別運行下面兩條命令。
vertx run SenderVerticle.java -cluster
vertx run ReceiverVerticle.java -cluster
2. 直接在main函數啟動
需要保證classpath中有cluster.xml,否則vertx會使用默認集群配置。
public static void main(String[] args) {
HazelcastClusterManager clusterManager = new HazelcastClusterManager();
VertxOptions options = new VertxOptions().setClusterManager(clusterManager);
Vertx.clusteredVertx(options, res -> {
if (res.succeeded()) {
Vertx vertx = res.result();
DeploymentOptions deploymentOptions = new DeploymentOptions();
vertx.deployVerticle(ReceiverVerticle::new, deploymentOptions);
System.out.println("receiver verticle deployed");
}
});
}
3. 使用Gradle腳本啟動
編寫兩個task即可,主類用Vertx Launcher,可以添加命令行參數來配置,這里的命令行參數和vertx命令行工具的參數一樣。
task RunVerticleSender(type: JavaExec) {
classpath = sourceSets.main.runtimeClasspath
main = 'io.vertx.core.Launcher'
args = ['run', 'cn.kui.test.cluster.SenderVerticle', '-cluster', '-cluster-host=127.0.0.1']
}
task RunVerticleReceiver(type: JavaExec) {
classpath = sourceSets.main.runtimeClasspath
main = 'io.vertx.core.Launcher'
args = ['run', 'cn.kui.test.cluster.ReceiverVerticle', '-cluster', '-cluster-host=127.0.0.1']
}
更詳細的說明請看官方文檔:https://vertx.io/docs/vertx-hazelcast/java/