netty源码分析
netty模型selector模式
对普通NIO的性能提升
- NIO可以同时使用多个selector(使用多线程)
- 一个selector可以同时注册多个ServerSocketServer(可以绑定多个端口)
- 单个线程下只能有一个selector,用来实现Channel的匹配及复用
半包问题
TCP/IP在发送消息的时候,可能会拆包,这就导致接收端无法知道什么时候收到的数据是一个完整的数据。在传统的BIO中在读取不到数据时会发生阻塞,但是NIO不会。为了解决NIO的半包问题,Netty在Selector模型的基础上,提出了reator模式,从而解决客户端请求在服务端不完整的问题。
netty模型reactor模式(解决半包问题)
上图,除去线程池模块,就是Netty NIO的默认模式。在实现上,Netty中的Boss类充当mainReactor,NioWorker类充当subReactor(默认 NioWorker的个数是Runtime.getRuntime().availableProcessors())。在处理新来的请求 时,NioWorker读完已收到的数据到ChannelBuffer中,之后触发ChannelPipeline中的ChannelHandler流。
“boss接活,让work干”:manReactor用来接收请求(会与客户端进行握手验证),而subReactor用来处理请求(不与客户端直接连接)。
Netty的主要组件及功能
- Selector:SelectableChannel多路复用器
- EventLoopGroup/EventLoop:采用串行化的方式,避免了线程的频繁切换,实现请求分发的角色。
- ChannelPipeline其实是担任着Reactor模式中的请求处理器(这里会对客户端请求进行粘包处理,从而解决半包问题)