当前位置: 首页 > 知识库问答 >
问题:

如何配置Vert。x事件总线跨Docker容器集群工作?

水铭晨
2023-03-14

在我当前的设置中,我使用Hazelcast群集管理器的默认多播选项。当我链接容器化Vertx模块的实例(通过Docker网络链接)时,我可以看到它们正在成功创建Hazelcast集群。但是,当我尝试从一个模块在事件总线上发布事件时,另一个模块不会对此做出反应。我不确定Hazelcast集群中的网络设置与事件总线的网络设置有何关联。

目前,我的每个Vert都有以下编程配置。x模块,每个模块部署在docker容器中。

ClusterManager clusterManager = new HazelcastClusterManager();
VertxOptions vertxOptions = new VertxOptions()
            .setClustered(true)
            .setClusterManager(clusterManager);
vertxOptions.setEventBusOptions(new EventBusOptions()
            .setClustered(true)
            .setClusterPublicHost("application"));

Vert. x Core手册指出,我可能必须为事件总线配置clusterPublicHostclusterPublicPort,但我不确定这些与一般网络拓扑关系如何。

共有3个答案

漆雕疏珂
2023-03-14

我发现这个解决方案非常适合我,下面是我的代码片段(重要的部分是options.setClusterHost()

public class Runner {

    public static void run(Class clazz) {
        VertxOptions options = new VertxOptions();
        try {
            // for docker binding
            String local = InetAddress.getLocalHost().getHostAddress();
            options.setClusterHost(local);
        } catch (UnknownHostException e) { }

        options.setClustered(true);

        Vertx.clusteredVertx(options, res -> {
            if (res.succeeded()) {
                res.result().deployVerticle(clazz.getName());
            } else {
                res.cause().printStackTrace();
            }
        });
    }
}

public class Publisher extends AbstractVerticle {

    public static void main(String[] args) {
        Runner.run(Publisher.class);
    }

    ...
}

不需要定义其他任何东西。。。

关飞翼
2023-03-14

集群管理器工作正常,集群中每个节点(机器/docker容器)上的集群管理器配置必须相同,或者根本不进行任何配置(使用集群管理器的默认配置)必须使每个节点上的事件总线配置保持一致,必须将每个节点上的群集主机设置为该节点本身的IP地址和任意端口号(除非尝试在同一节点上运行多个Vert.x实例,否则必须为每个Vert.x实例选择不同的端口号)例如,如果一个节点的IP地址是192.168.1.12,那么您将执行以下操作:

VertxOptions options = new VertxOptions()
                .setClustered(true)
                .setClusterHost("192.168.1.12") // node ip
                .setClusterPort(17001) // any arbitrary port but make sure no other Vert.x instances using same port on the same node
                .setClusterManager(clusterManager);

在IP地址为192.168.1.56的另一个节点上,您可以执行以下操作:

VertxOptions options = new VertxOptions()
                .setClustered(true)
                .setClusterHost("192.168.1.56") // other node ip
                .setClusterPort(17001) // it is ok because this is a different node
                .setClusterManager(clusterManager);
仉俊能
2023-03-14

答案就在这里https://groups.google.com/d/msg/vertx/_2MzDDowMBM/nFoI_k6GAgAJ

我经常看到这个问题,很多人在留档(包括我自己)中忽略的是事件总线不使用集群管理器发送事件总线消息。例如,在使用Hazelcast作为群集管理器的示例中,您已经将Hazelcast群集启动并正确通信(因此您的群集管理器很好);但是,由于以下一个或多个原因,事件总线无法与其他html" target="_blank">docker实例通信:

  1. 它试图使用不正确的IP地址连接到另一个节点(即Docker实例上私有接口的IP,而不是公共映射的IP)

你需要做的是:

  1. 告诉Vertx其他节点应该用来与每个实例通信的IP地址(使用-cluster host[命令行]、setClusterPublicHost[顶点选项]或“Vertx.cluster.public.host”[系统属性]选项)

事件总线仅使用群集管理器来管理其他Vertx实例的IP/端口信息以及消费者/生产者的注册。通信独立于群集管理器完成,这就是为什么您可以正确配置群集管理器并进行通信,但仍然没有事件总线通信。

如果两个容器都在同一台主机上运行,您可能不需要执行上述两个步骤,但一旦开始在不同的主机上运行它们,您肯定会这样做。

也可能发生的事情就是垂直。当没有指定哪个vert的IP时,x使用环回接口。x(不是hazelcast)应该通过eventbus进行通信。这里的问题是,您不知道通过哪个接口进行通信(环回、与IP的接口,甚至可能有多个与IP的接口)。

为了克服这个问题,我曾经写过一个方法https://github.com/swisspush/vertx-cluster-watchdog/blob/master/src/main/java/org/swisspush/vertx/cluster/ClusterWatchdogRunner.java#L101

 类似资料:
  • Vert. x和kubernetes携手并进。如果我使用istio作为服务网格,Zipkin的请求跟踪是否能够跟踪通过事件总线完成的通信? 客户- istio是否能够跟踪通过eventbus完成的请求? 跟踪页面上说,头需要通过http或grpc进行传播,但eventbus通过tcp发送消息,这是否意味着istio将无法跟踪请求并显示可视化工具[瀑布图和所有服务的可视化] Vertx主页 Even

  • 如果您要以编程方式创建您的 Vert.x 实例,通过将 Vert.x 实例配置获得集群的event bus; VertxOptions options = new VertxOptions(); Vertx.clusteredVertx(options, res -> { if (res.succeeded()) { Vertx vertx = res.result(); Ev

  • Event Bus并不仅仅存在于一个单一的Vert.x实例。通过网络上的不同集群实例Vert.x一起就可以形成一个单一的,分布式的,Event Bus。

  • 我正在尝试将kubernetes go客户端与云一起使用。谷歌。com/go/container。我使用GoogleCloudGo容器包创建集群,然后我想使用go客户端在集群上部署。go客户端给出的集群外示例使用kube配置文件获取集群的凭据。但是由于我只是在我的应用程序中创建了这个集群,所以我没有那个配置文件。 如何使用“google.golang.org/genproto/googleapis

  • 我有一个很快的问题——有人试过同时运行这两个版本吗。x2和垂直。集群中的x 3应用程序,通过EventBus进行通信? 理论上这应该是可能的,但有人做过吗?;) 干杯,米莎

  • 在docker机器上运行的docker容器而不是k8s吊舱如何操作k8s群集。例如,如果我需要在容器内执行类似操作: kubectl得到豆荚 在我的dockerfile中,我安装了kubectl 当我运行时,结果如下: 因此,我在命令中将装入docker容器 结果如下: 这似乎是因为k8s配置文件中的 然后再次装载身份验证文件,它将成功运行。 现在,我可以调用命令,或者