如果没有记错的话,Vert.x 从 3.2 就开始支持TCP Eventbus Bridge了,它使得 Client 可以直接通过 socket 跟 Vert.x EventBus 进行通信。可遗憾的是,整个文档就像半成品,并没有把很多事情说清楚。
为了搞清楚这个特性,今天抽空完成了一个 TCP Eventbus Bridge 的例子,源码见这里。
按理,都已经用 TCP 了,Client 和 Server 之间干嘛还需要多此一举地采用所谓的 Eventbus Bridge?我认为:
- Server 和 Client 之间采用这种方式进行通信可以让 Server 端的代码更加清晰明了
- Client 和 Server 之间的交互模式也更简单一些:
- 对于 request-response,server 简单地 message.reply 即可
- 对于某些广播消息,client 向多个 server 实例广播,或者是 server 向多个 client 广播,又或某些 client 也想接收另外的 client 向 server 的广播都非常简单和直观。
- 通过注册地址,client 也可以收到感兴趣的消息,不论是 server 发的,还是 client 发的
这两点可参考例子源码详细了解。整个例子很简单,实现了:
- client 向多个 bridge send,则只有一个 bridge 可以收到
- client 向多个 bridge publish,则都能收到
- server 和 client 之间的 request-response
- client 注册要接受某地址的消息
关于 API 的使用,有以下几点需要注意:
- bridge 在 server 端建立,client 只需要使用普通 socket 去连接即可
- client 要接收某地址的消息,仍然是使用 socket 来接收。因为 client 并不一定是 Vert.x 应用,并没有 eventbus 可用!这一点是引起我误解,同时文档没有讲清楚的地方。
- 对于 Java 语言,使用 io.vertx.ext.eventbus.bridge.tcp.impl.protocol.FrameHelper 和 io.vertx.ext.eventbus.bridge.tcp.impl.protocol.FrameParser 可以简化数据帧的发送和解析。可遗憾的是,没有提供其他语言,如 Groovy 的对应工具类,弄得我只好采用一种变通的方式去用【还是看代码去了解】。因此,对于 Vert.x 开发,建议还是首选 Java 语言来做,可以省掉一些不必要的麻烦。
觉得有帮助的话,不妨考虑购买付费文章来支持我们 🙂 :
付费文章