<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-tcp-eventbus-bridge</artifactId>
<version>5.0.1</version>
</dependency> Vert.x TCP 事件总线桥接
Vert.x TCP 事件总线桥接是一个连接 Vert.x 事件总线的 TCP 桥接。要使用此项目,请将以下依赖项添加到您的构建描述符的 dependencies 部分
Maven(在您的 pom.xml 中)
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 可以是以下类型
-
send向一个address发送消息, -
publish向一个address发布消息, -
register订阅发送或发布到某个address的消息, -
unregister取消订阅发送或发布到某个address的消息, -
ping向桥接发送ping请求。
请注意,replyAddress 字段是可选的,并且可能仅用于 send 消息。包含此字段的消息预计将最终从服务器接收回一条消息,该消息的 address 字段将是原始 replyAddress 值。
服务器将消息回传给客户端,它们可以是以下 type 类型
-
message用于发送或发布到address的消息,或 -
err表示错误(body应包含详细信息),或 -
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...
}
});