事件总线桥接

Vert.x TCP 事件总线桥接

Vert.x TCP 事件总线桥接是一个连接 Vert.x 事件总线的 TCP 桥接。要使用此项目,请将以下依赖项添加到您的构建描述符的 dependencies 部分

Maven(在您的 pom.xml 中)

<dependency>
  <groupId>io.vertx</groupId>
  <artifactId>vertx-tcp-eventbus-bridge</artifactId>
  <version>5.0.1</version>
</dependency>

Gradle(在您的 build.gradle 文件中)

compile 'io.vertx:vertx-tcp-eventbus-bridge:5.0.1'

TCP 事件总线桥接构建于 TCP 之上,这意味着任何可以创建 TCP 套接字的应用程序都可以通过其事件总线与远程 Vert.x 实例进行交互。

相较于 SockJS 桥接,TCP 桥接的主要用例是针对资源受限且需要轻量级的应用程序,因为它用纯 TCP 套接字取代了整个 HTTP WebSocket。

当然,即使对于没有严格资源限制的应用程序,它也仍然有用:该协议足够简单,可以有效地为非 JVM 应用程序提供集成接口。

协议被保持尽可能简单,通信使用双向帧。帧的结构如下

<Length: uInt32><{
   type: String,
   address: String,
   (replyAddress: String)?,
   headers: JsonObject,
   body: JsonObject
}: JsonObject>

消息由一个 JSON 文档组成,该文档可能已或未被最小化。消息必须以一个 大端序 32 位正整数(4 字节)作为前缀,该整数表示 JSON 文档的完整长度(以字节为单位)。

TCP 客户端发送的消息的 type 可以是以下类型

  1. send 向一个 address 发送消息,

  2. publish 向一个 address 发布消息,

  3. register 订阅发送或发布到某个 address 的消息,

  4. unregister 取消订阅发送或发布到某个 address 的消息,

  5. ping 向桥接发送 ping 请求。

请注意,replyAddress 字段是可选的,并且可能仅用于 send 消息。包含此字段的消息预计将最终从服务器接收回一条消息,该消息的 address 字段将是原始 replyAddress 值。

服务器将消息回传给客户端,它们可以是以下 type 类型

  1. message 用于发送或发布到 address 的消息,或

  2. err 表示错误(body 应包含详细信息),或

  3. pong 响应客户端发送的 ping 请求。

项目源代码中提供了一个 Node.js 客户端示例。此客户端使用与 SockJS 对应版本相同的 API,因此它应该能更容易地在 TCP 和 SockJS 实现之间切换。

关于如何开始使用此桥接的示例可能是

TcpEventBusBridge bridge = TcpEventBusBridge.create(
    vertx,
    new BridgeOptions()
        .addInboundPermitted(new PermittedOptions().setAddress("in"))
        .addOutboundPermitted(new PermittedOptions().setAddress("out")));

bridge.listen(7000).onComplete(res -> {
  if (res.succeeded()) {
    // succeed...
  } else {
    // fail...
  }
});

监听 Unix 域套接字

在 JDK 16+ 上运行或使用原生传输时,服务器可以监听 Unix 域套接字

SocketAddress domainSocketAddress = SocketAddress.domainSocketAddress("/var/tmp/bridge.sock");

bridge.listen(domainSocketAddress).onComplete(res -> {
  if (res.succeeded()) {
    // succeed...
  } else {
    // fail...
  }
});