Netty 启动和新建链接过程
2019-07-25 10:07:14 6 举报
netty
作者其他创作
大纲/内容
provider = selectorProvider;
通过ServerBootstrap.childHandler() 在ChannelInitializer.initChannel()里把用户自定义的每个 handler 添加进去.
Selector selector = provider.openSelector();
register
pipeline = newChannelPipeline();
Runnable
EventExecutor[] children;
EventExecutorChooser chooser;两种方式: 1) childIndex & length; //2^n2) childIndex % length;
Queue<Runnable> taskQueue;
NioEventLoop.run()
pollTask()
SingleThreadEventExecutor1
SingleThreadEventExecutor.thread;thread.run();
register()
A2: 构造 channel
ServerBootstrap implements extends AbstractBootstrap
...
N = nThreads
A3: 初始化 channel
addLast()
(B1)
ServerBootstrapAcceptor
//SingleThreadEventExecutorQueue<Runnable> taskQueue;
(B4) 调用 next()选择一个EventLoop
doReadMessages()
head(outHandler)
(B5) register
这里的 handler 在定义ServerBootstrap时通过 handler()方法传入
(B2)
NioEventLoop.run();
NioEventLoop extends SingleThreadEventLoop
SingleThreadEventExecutorN
SingleThreadEventExecutor.thread
SocketChannelConfig config;
SingleThreadEventLoop:register()AbstractChannel:register()AbstractChannel.this.eventLoop = eventLoop;
bind(port): 主要调用initAndRegister()完成channel 的初始化
ServerSocketChannelConfig config;
SingleThreadEventExecutor2
SingleThreadEventExecutor3
A4: 添加 handler
AbstractChannel.this.eventLoop;
tail(inHandler)
每个元素都是一个 NioEventLoop
(B0) unsafe.read();
标准的 Java NIO 流程: for(;;){ 1. select(); 2. processSelectedKeys(); 3. runAllTasks();}
eventLoop;
参考了@鸠摩罗耶的作品.1. 在原作基础上增添了 ServerBootStrap从 bind 开始的启动过程. (标号 A 的流程)2. 增加了全链路的新连接建立过程. (标号 B 的流程)
实际调用
A1: server初始化
handler()
Unsafe unsafe;
(B3) channelRead()方法调用childGroup(即workGroup)的 register()为新的 NioSocketChannel 分配一个 EventLoop
next(): 实际调用chooser 的 next()方法
Netty Server启动和建立连接两大过程分析
(B2.1): fireChannelRead()
NioServerSocketChannel
NioSocketChannel
SingleThreadEventExecutor4
NioServerSocketChannel(): 初始化: AbstractChannel的构造函数里生成unSafe 和pipeline.
initAndRegister(): 主要完成两个操作: 1. 生成 channel;2. 完成 init(channel);
runAllTasks()
processSelectedKeys();
WorkGroup (NioEventLoopGroup)
ChannelHandler
BossGroup (NioEventLoopGroup)
init(channel): 在 channel 的pipeline里添加了用户自定义的 handler 和ServerBootstrapAcceptor.
0 条评论
下一页