Vert.x 2 -> Vert.x 3 通过 EventBus 通信

Vert.x 2 -> Vert.x 3 communication over EventBus

我有一个简短的问题 - 是否有人尝试过 运行 集群中的 Vert.x 2 和 Vert.x 3 个应用程序,通过 EventBus 进行通信?

理论上应该可以,但有人做过吗?;)

干杯, 迈克尔

非常感谢这个问题,因为当我决定将我的 2.x 应用程序升级到 [=17 的最新版本时,我个人也有同样的想法=]Vert.x,即3.x.

我猜你暴露了这样一个问题,因为节点间/模块间通信协议至少应该在某种程度上兼容,并且 EventBus 已经是典型的模块间通信通道Vert.x 应用程序,并有望抽象出不同模块版本之间的消息传输。

同时我不知道有任何开源产品在主要版本之间提供 API 兼容性,因为主要版本通常表示 "APIs will change"Vert.x 应该也不例外,不同版本开发的 Verticles / 模块之间的通信可能会失败也就不足为奇了,因此即使不这样做也应该避免这种方法不值得测试。

我在集群中尝试了 Vert.x2 和 Vert.x3 EventBus。但不是同时。 Vert.x2 需要 jdk 1.7,Vert.x3 需要 jdk 1.8 或更高版本。我尝试在 jdk 1.8 中 运行 Vert.x2 但没有成功。

因此,我认为 运行不可能在集群中同时使用 Vert.x2 和 Vert.x3 应用程序。

对于 3.3 版本,Vert.x 正在向 2.x 系列添加一个新模块。这个新组件是 mod-eventbus3-bridge-client.

我们的想法是,您可以沿着现有的 2.x 应用程序部署此模块,它将在事件总线 2.x 和事件总线 3.x 之间架起桥梁。

您可以在以下位置查看代码:https://github.com/vert-x/mod-eventbus3-bridge-client/tree/initial-work

所以在 Vert.x3 中你需要做:

public class Example {

  public static void main(String[] args) {

    Vertx vertx = Vertx.vertx();
    TcpEventBusBridge bridge = TcpEventBusBridge.create(
        vertx,
        new BridgeOptions()
            .addInboundPermitted(new PermittedOptions())
            .addOutboundPermitted(new PermittedOptions()));

    bridge.listen(7000, res -> {
      // example: vertx3 send a message to vertx2
      vertx.eventBus().send("send3", new JsonObject().put("msg", "hello send"));
    });
  }
}

而在 Vert.x2 你会做相反的事情:

public class Example extends Verticle {

  @Override
  public void start() {
    final EventBus3 eb = new EventBus3(vertx, getContainer().config(), new Handler<Void>() {
      @Override
      public void handle(Void done) {
        // case #1 vertx3 send a message to vertx2
        eb.registerHandler("send3", new Handler<BridgeMessage>() {
          @Override
          public void handle(BridgeMessage msg) {
            System.out.println(msg.body());
          }
        });
      }
    });

    eb.exceptionHandler(new Handler<Throwable>() {
      @Override
      public void handle(Throwable throwable) {
        throwable.printStackTrace();
      }
    });
  }
}