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();
}
});
}
}
我有一个简短的问题 - 是否有人尝试过 运行 集群中的 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();
}
});
}
}