目录
- Vert.x系列(零),开篇,认识Vert.x并创建一个Http服务
- Vert.x系列(一),Http Router
- Vert.x系列(二),编写REST API并解析请求参数
- Vert.x系列(三),加载静态资源文件
- Vert.x系列(四),EventBus事件总线
- Vert.x系列(五),基于EventBus构建分布式应用
正文
阅读本章之前需要对上一章Vert.x系列(四),EventBus事件总线有一定的掌握。
现在我们将上一章编写的例子,拆分成分布式应用。将DatabaseVerticle和HttpVerticle分开运行在不同的进程中(如果有条件,可以运行在不同的服务器中)来模拟分布式应用。
先跟着笔者走,把App.java删除。然后创建一个HttpApp.java,在里面发布HttpVerticle。
package com.javafm.vertx;
import io.vertx.core.Vertx;
public class HttpApp {
public static void main(String[] args) {
Vertx.vertx().deployVerticle(new HttpVerticle());
}
}
接着再编写DatabaseApp.java,在里面发布DatabaseVerticle。
package com.javafm.vertx;
import io.vertx.core.Vertx;
public class DatabaseApp {
public static void main(String[] args) {
Vertx.vertx().deployVerticle(new DatabaseVerticle());
}
}
现在我们分别启动HttpApp.java和DatabaseApp.java,在访问http://localhost:8080/user/1
接口。这个时候会发现接口出现错误了,没有达到预期的效果。控制台出现这个错误(NO_HANDLERS,-1) No handlers for address com.javafm.vertx.database
。
那是因为将两个Verticle拆分成独立运行的进程时,也就是说分布式运行了,但两个Verticle中的vertx无法通信,导致发布者与订阅者没有任何关联关系。
那么为了解决这个问题,需要在pom.xml中引入一个组件,也就是说要做集群部署,要组网了。
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-hazelcast</artifactId>
<version>3.8.5</version>
</dependency>
接着修改HttpApp.java代码,加入集群功能。
package com.javafm.vertx;
import io.vertx.core.Vertx;
import io.vertx.core.VertxOptions;
public class HttpApp {
public static void main(String[] args) {
VertxOptions options = new VertxOptions();
Vertx.clusteredVertx(options, res -> {
if (res.succeeded()) {
res.result().deployVerticle(new HttpVerticle());
}
});
}
}
再修改DatabaseApp.java加入集群功能。
package com.javafm.vertx;
import io.vertx.core.Vertx;
import io.vertx.core.VertxOptions;
public class DatabaseApp {
public static void main(String[] args) {
VertxOptions options = new VertxOptions();
Vertx.clusteredVertx(options, res -> {
if (res.succeeded()) {
res.result().deployVerticle(new DatabaseVerticle());
}
});
}
}
再分别启动两个主方法类,会发现控制台输入的日志跟之前不一样了,变多了。而且输出了集群组网信息。大概像这样:
3月 29, 2020 5:04:35 下午 com.hazelcast.internal.cluster.ClusterService
信息: [192.168.124.2]:5701 [dev] [3.12.2]
Members {size:1, ver:1} [
Member [192.168.124.2]:5701 - 7171dc38-7f0f-4f10-bb6a-409082deca8f this
]
这个时候再访问之前的接口,发现有数据返回了,与上一节的结果一样。
在本节中集群组网并没有特殊配置,采用的是默认配置。如果你的分布式应用部署在不同的服务器和不同的网络环境中,那么默认配置无法满足需求,只要在resource目录下添加hazelcast.xml文件进行网络配置就可以了。hazelcast.xml文件的模板在hazelcast的jar包中有。
这里列出常用的两种集群模式:
1、广播multicast模式
<multicast enabled="true">
<multicast-group>224.2.2.3</multicast-group>
<multicast-port>54327</multicast-port>
</multicast>
如果为true,同一个网段内的vertx实例会自动发现,并集群。默认使用的也就是这种方式。
2、ip地址tcp-ip模式
<tcp-ip enabled="false">
<interface>127.0.0.1</interface>
<member-list>
<member>127.0.0.1</member>
</member-list>
</tcp-ip>
将enabled改为true,然后把集群的ip地址列在这里就可以了。配置完成后将应用打包部署在不同的服务器中就可以正常使用了。
本章源代码地址:https://gitee.com/dev-tang/learning-vertx/tree/learn-06/