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,不过也不是完全没有办法,可以参考: