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