简单过一下Netty3.6.6.Final源码,让自己对各个流程有个稍微清晰的理解,只是文字描述,尽量描述简单,有时间再画画图
Server启动:
1.new ServerBootstrap
构造NioServerSocketChannelFactory,用来创建NioServerSocketChannel对象(newChannel方法)
1..NioServerSocketChannel:是一个parent Channel,负责接收客户端进来的连接并创建child Channel
2..NioServerSocketChannelFactory中有两类线程池:
1...BossPool<NioServerBoss> bossPool
boss线程池:每个绑定的ServerSocketChannel都有自己的boss线程池,默认为一个线程,它负责接收客户端进来的连接,一旦连接成功,boss线程将Channel交给其中一个worker线程来处理
2...WorkerPool<NioWorker> workerPool
work线程池:对多个Channel执行非阻塞的读写,Netty中默认为cpu核心数*2条worker线程,如果不使用worker来执行业务操作,我喜欢将worker线程数量定在cpu核心数+1,这样比较适合执行cpu密集型任务
3..NioServerSocketChannelFactory还有一个重要对象:
NioServerSocketPipelineSink sink
接收并处理下行(downstream)末端(注意下行的末端是pipeline的头结点)的ChannelEvent
2.ServerBootstrap#bind
创建一个绑定了local address的parent Channel,阻塞到绑定成功为止
1..newChannel(创建NioServerSocketChannel),传入bossPipeline、NioServerSocketChannelFactory中的sink、bossPool(如果有多个只传入一个)、workerPool
1...ServerSocketChannel.open()一个ServerSocketChannel并设置为非阻塞模式
2...bossPipeline:默认有一个Binder,主要做以下事情:
1....处理parent Channel open,负责setOptions,以及fire ChannelState.BOUND事件
2....处理child Channel open,负责setOptions
3....对bind过程中的异常进行处理
2..在NioServerSocketChannel中fireChannelOpen,由上面的Binder处理这个parent Channel open事件
parent Channel open流程:
1...设置child pipelineFactory
2...setOptions
3...fire ChannelState.BOUND downstream事件
sink#eventSunk
handleServerSocket
NioServerBoss#bind
构造NioServerBoss$RegisterTask并加入taskQueue队列
3..boss线程中(NioServerBoss.RegisterTask类中)将parent Channel向selector中注册SelectionKey.OP_ACCEPT
4..bind成功返回parent Channel
================================================================================
Accepts incoming connection
1.boss[NioServerBoss]#process中调用selector.selectedKeys()拿到OP_ACCEPT的就绪parent Channel
2.boss[NioServerBoss]#process中调用parentChannel.socket.accept()创建child Channel (acceptedSocket)
3.boss[NioServerBoss]#process#registerAcceptedChannel,接收连接
1..拿到一个worker线程
2..将child Channel、parent Channel、child pipeline、sink、worker线程、boss线程组合起来构造一个NioAcceptedSocketChannel
1...设置此Channel为连接状态
2...在parent Channel的pipeline中fire child Channel state changed(child ChannelState有OPEN和CLOSED两个状态,这里是fire child ChannelState.OPEN)
1....构造ChildChannelStateEvent
2....Binder中处理child Channel open(如上文描述,就是setOptions,比如sendBufferSize、tcpNoDelay等属性)
3...在自己的child pipeline(就是我们自己定义的pipeline了)中fire child ChannelState.OPEN
3..将构造好的NioAcceptedSocketChannel向worker中注册(也就是加入到此worker的任务队列taskQueue中)
4.切换到worker线程,向worker的Selector中注册之前boss接收并创建好的child Channel(Selectionkey.OP_READ)
================================================================================
Read
1.worker调用selector.selectedKeys()拿到OP_READ的就绪child Channel
2.NioWorker.read(SelectionKey k)
1.. 分配buffer
2.. fire MessageReceived事件
3.在child pipeline调用链中执行MessageReceived
================================================================================
Write
1.构造DownstreamMessageEvent并send downstream事件,child pipeline调用链中执行(注意downstream从pipeline队尾开始)
2.在sink中将上面的DownstreamMessageEvent offer到此Channel的writeBufferQueue
3.AbstractNioWorker#write0()
1..writeBufferQueue.poll()出上面的DownstreamMessageEvent
2..分配writeBuffer
3..buf.transferTo对应child Channel
4..fire WriteComplete事件(upstream,从pipeline头结点开始)
在child pipeline调用链中执行WriteCompletion事件(如果你使用了链路空闲检测handler,比如IdleStateHandler,会在writeComplete方法中更新lastWriteTime)
分享到:
相关推荐
一个netty的入门教程以及源码分析视频,适合刚学习的人
美团基础架构部闪电侠老师的netty源码分析视频
netty源码解析PDF,网络编程
基于EchoServer对Netty4.1源码进行分析,水平有限,如果有问题大家可以提出来共同分享。
Netty权威指南 第2版源码Netty权威指南 第2版源码Netty权威指南 第2版源码Netty权威指南 第2版源码
Netty in action 第二版 源码 希望对学习netty的 小伙伴 有帮助 Netty in action 第二版 源码 希望对学习netty的 小伙伴 有帮助
Netty权威指南源码
Netty权威指南第二版官方源码及netty5源码,
Netty-4.1.97.Final源码 适用于想深入学习Netty源码的java程序员 可用于对Netty源码进行阅读以及Netty本地化修改的场景
netty_learn_netty_源码
Netty4.x源码分析详解
Netty5.0架构剖析和源码解读.pdf是一本比较全的讲解netty5的书籍,任何对java的nio技术感兴趣的人都值得一看。
Netty权威指南第二版源码Netty权威指南第二版源码Netty权威指南第二版源码
Netty核心精讲之Reactor线程模型源码分析 Netty核心精讲之Reactor线程模型源码分析
netty源码
Netty权威指南 第二版 源码
[自己做个游戏服务器二] 游戏服务器的基石-Netty全解析,完整项目源码
Netty权威指南第二版基于最新的Netty5.0 来帮助我们构建多线程安全并发的一本书籍,该资料源码收集于网上,为Netty第二版源码
netty权威指南 官方源码 netty5.0 netty权威指南 官方源码 netty5.0
基于netty的安全即时通讯系统源码+项目说明.zip基于netty的安全即时通讯系统源码+项目说明.zip基于netty的安全即时通讯系统源码+项目说明.zip基于netty的安全即时通讯系统源码+项目说明.zip基于netty的安全即时通讯...