扎心了,老铁,程序出了小差,请重新再试
重新再试

首页> 流程图> 一般流程图

Netty源码剖析模型图

热门
Netty源码剖析模型图
Netty 源码剖析模型图,供大家参考学习,学习参考图灵学院架构课,感谢! {假设有客户端链接,则会发生OP_ACCEP事件,NioEventGroup,初始化并加入到pipeline中,pipeline.fireChannelRead(readBuf.get(i)); ,constructor.newInstance();,eventLoop.execute(new Runnable() {
@Override
public void run() {
register0(promise);
}
});,startThread();,for循环处理selectionkeys 的里的所有key,ServerBootstrap
(NettyServer)
,childHandler就是netty服务端开初始代码,即我们自己写ChannelInitializer的,直接调用socketChannel的pipeline里的 所有handdler的channelRead方法, unsafe.read();
#NioByteUnsafe
,执行并删除调用完的haddler,并加入ServerBootstrapAcceptor,并将channel感兴趣的事件设置为OP_READ,死循环执行监听IO事件,死循环执行,NioServerSocketChannel(),TaskQueue,初始化NioServerSocketChannel,当timeoutMillis超时或者有事件发生会break处理,pipeline.fireChannelRegistered();,doStartThread();,Selector,worker Group,ServerBootstrapAcceptor,for死循环执行SelectedKeys里的所有key,channle注册时调用,调用完会删除该handler
(此处逻辑比较深需要借助DeBUG)
,假设当前另一个客户端往服务端发送数据,socketChannel则会发生op_read事件,客户端建立链接,此时进入workerGroup进行干活,#NioEventLoop.run();,pipeline.invokeHandlerAddedIfNeeded(),doBind(localAddress); ,processSelectedKey(k, (AbstractNioChannel) a);,运行TaskQueue异步队列里的任务,processSelectedKeys();,SocketUtils.accept(javaChannel());,channel.pipeline(),doRegister();,javaChannel().register(eventLoop().unwrappedSelector(),config().group().register(channel);,doBind0( regFuture,  channel, localAddress, promise),bootstrap.bind(9900),select(wakenUp.getAndSet(false));,serverSockerChannel Pipeline,ServerBootstrap.init(channel),initChannel(ctx),channelFactory.newChannel();, childGroup.register(child),把serverChannel绑定到到网络端口,因为是双向链表,这里边实现责任链的模式调用。,自定义的Handler,主要通过0拷贝技术来实现,ChannelInitializer,执行task,......,super(null, channel, SelectionKey.OP_ACCEPT);,ch.configureBlocking(false);,newChannelPipeline();,Pipeline,new NioSocketChannel(this, ch),processSelectedKeysOptimized(),SelectionKey.OP_READ,并配置channle为非阻塞,客户端链接server端会触发,从bossGroup里面拿一个线程来处理channel的注册, 将其注册到线程自己的selector上,初始化channel, 并将channel感兴趣的事件设置为OP_ACCEPET,把task线程放入TaskQueue异步执行,#NioEventLoop.run(),super(parent);,调用pipeline里每个handler的ChannelRegistered方法,HeadContext,task.run(), processSelectedKeysOptimized();,调用pipeline里每个handler的handlerAdded方法, doReadMessages(readBuf);,child.pipeline().addLast(childHandler);,获取socketChannel (可以看NIO代码做为参考),runAllTasks(ioTime * (100 - ioRatio) / ioRatio);,将连接过来的socketchannel注册到workgroup里的一个线程的selector上,taskQueue.offer(task);,从head开始调用serverChannel的pipeline里的所有inboundHanddler,当channle注册时会调用,注册channle到selector (包装了NIO代码,可以参考NIO代码来看),初始化socketChannel的pipeline, pipeline.fireChannelRead(byteBuf);,将socketChannel进行包装,#NioServerSocketChannel.doReadMessages(List<Object> buf),sockerchannel Pipeline,TailContext,初始化serverChannel的pipeline,监听端口, channel.bind(localAddress, promise).addListener(ChannelFutureListener.CLOSE_ON_FAILURE);,register0(promise);,把channelinitializer加入也就是我们自己的haddler,selector.select(timeoutMillis);,#ServerBootstrap.ServerBootstrapAcceptor.channelRead(ChannelHandlerContext ctx, Object msg),addTask(task);,client,super(parent, ch, SelectionKey.OP_READ); ,SingleThreadEventExecutor.this.run();,Boss Group,SelectionKey.OP_READ | SelectionKey.OP_ACCEPT,initAndRegister();,p.addLast(new ChannelInitializer<Channel>() {...},#AbstractNioMessageChannel.NioMessageUnsafe.read(),不同线程组里的线程的selector监听处理,serverChannelPipeline,next().register(channel);, sockerchannel注册逻辑跟serversocketchannel注册逻辑一样,注册完会调用socketchannel里的ChannelInitializer把里面我们自己写的Handler全部放入pipeline,readBuf里放的是op_accept事件连接过来来的所有socketChannel}

文件简介

编号:19285

名称:Netty源码剖析模型图

浏览数:2252

收藏数:22

克隆数:13

作者:0

价格:5元

更新时间:2021-07-02 16:21:54

文件很好用,分享文件:

只需一步极速注册

63,195+文件在线编辑

云端同步我的设计

一键高清无水印下载

微信扫码立即登录
二维码失效
请点击刷新

微信和QQ是两个独立账号,账号信息不互通

距离今天活动结束仅剩
000000000毫秒
距离今天活动结束仅剩
000000000毫秒
距离今天活动结束仅剩
000000000毫秒
会员促销今天活动仅剩
000000000毫秒
距离今天活动结束仅剩
000000000毫秒