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/

本博客采用 知识共享署名-禁止演绎 4.0 国际许可协议 进行许可

本文标题:Vert.x系列(五),基于EventBus构建分布式应用

本文地址:https://jizhong.plus/post/2020/03/vert.x-05.html