Vert.x 网络通讯机制
客户端
- 以下流程图展示了:
val netSocket = vertx.createNetClient().connect(6379, "localhost").coAwait()
连接到服务器的过程sequenceDiagram %% 时序图例子,-> 直线,-->虚线,->>实线箭头 participant NetClientImpl participant VertxHandler participant NetSocketImpl participant ChannelProvider Note over VertxHandler : VertxHandler<C extends VertxConnection> extends ChannelDuplexHandler loop NetClientImpl::connectInternal2(...) NetClientImpl -->> NetClientImpl : channelProvider = new ChannelProvider(...) NetClientImpl ->> ChannelProvider : channelProvider.handler(ch -> NetClientImpl::connected(..., ch, ...)) NetClientImpl ->> ChannelProvider : channelProvider.connect(...) loop ChannelProvider::handleConnect ChannelProvider ->> ChannelProvider : bootStrap.handler(new ChannelInitializer<Channel>() {... initSSL ...}) ChannelProvider ->> ChannelProvider : bootStrap.connect(...) Note over ChannelProvider : ChannelFuture.isSuccess() loop ChannelProvider::connected(handler, channel, ssl, ...) ChannelProvider ->> ChannelProvider : context.dispatch(channel, handler) end end end loop NetClientImpl::connected(..., ch, ...) NetClientImpl -->> NetClientImpl : channelGroup.add(ch) loop NetClientImpl::initChannel(ch.pipeline(), ssl) NetClientImpl -->> NetClientImpl : pipeline.addLast("logging", new LoggingHandler(...)) NetClientImpl -->> NetClientImpl : pipeline.addLast("chunkedWriter", new ChunkedWriteHandler()) NetClientImpl -->> NetClientImpl : pipeline.addLast("idle", new IdleStateHandler(...)) end NetClientImpl -->> NetClientImpl : handler = VertxHandler.create(ctx -> new NetSocketImpl(...)) NetClientImpl -->> NetClientImpl : handler.removeHandler(NetSocketImpl::unregisterEventBusHandler) NetClientImpl -->> NetClientImpl : handler.addHandler(sock -> {sock.registerEventBusHandler()}) NetClientImpl -->> NetClientImpl : ch.pipeline().addLast("handler", handler) end loop VertxHandler的各种回调 loop VertxHandler::handlerAdded(ChannelHandlerContext ctx) VertxHandler -->> VertxHandler : setConnection(connectionFactory.apply(ctx)) VertxHandler -->> VertxHandler : addHandler.hander(connection) end loop VertxHandler::channelRead(ChannelHandlerContext ctx, Object msg) VertxHandler -->> NetSocketImpl : conn.read(msg) loop NetSocketImpl::handleMessage Note over NetSocketImpl : messageHandler为用户指定的消息处理器 NetSocketImpl -->> NetSocketImpl : messageHandler.handler(msg) end end end
服务器端
TODO: 也没啥看的,和客户端一个调性~,不过有一点:vert.x的netty服务器端无法自定义Netty handler,不过也不是完全没有办法,可以参考: