Netty学习记录-入门篇( 二 )

FileChannel(通道) 和 方法 transferFrom  , 完成文件的拷贝
选择器Selector核心:selector能够检测多个注册的通道上是否有事件发生(多个channel以事件的方式可以注册到同一个selector) , 如果有事件发生 , 便获取事件然后针对每个事件进行相应的处理 。这样就可以做到只使用一个单线程去管理多个通道 。
只有在连接/通道真正有读写事件发生时 , 才会进行读写 , 就大大地减少了系统开销 , 并且不必为每个连接都创建一个线程 , 不用去维护多个线程 。
原理图:

Netty学习记录-入门篇

文章插图
说明:
  1. 当客户端连接时 , 会通过ServerSocketChannel得到SocketChannel
  2. Selector进行监听select方法 , 返回有事件发生的通道的个数 。
  3. socketChannel注册到Selector上 , register(),一个selector上可以注册多个SocketChannel
  4. 注册后返回一个selectionKey,会和该selector关联 。
  5. 进一步得到各个selectionKey(有事件发生) 。
  6. 再通过selectionKey反向获取socketChannel , 方法channel() 。
  7. 可以通过得到的channel,完成业务逻辑 。
Netty概述异步的、基于事件驱动的网络应用程序框架 , 用以快速开发高性能、高可靠的网络IO程序 。
Netty学习记录-入门篇

文章插图
有了NIO为什么还需要Netty?
不需要过于关注底层的逻辑 , 对下面的sdk等进行封装 , 相当于简化和流程化了NIO的开发过程springspringboot的关系差不多 。
因为 Netty 5出现重大bug , 已经被官网废弃了 , 目前推荐使用的是Netty 4.x的稳定版本 。
Netty高性能架构设计线程模型基本介绍
Netty学习记录-入门篇

文章插图
传统阻塞 I/O 服务模型
Netty学习记录-入门篇

文章插图
模型特点:
  • 采用阻塞IO模式获取输入的数据
  • 每个连接都需要独立的线程完成数据的输入 , 业务处理 , 数据返回
问题分析:
  • 当并发数很大 , 就会创建大量的线程 , 占用很大系统资源
  • 连接创建后 , 如果当前线程暂时没有数据可读 , 该线程会阻塞在read操作 , 造成线程资源浪费
Reactor 模式I/O 复用结合线程池 , 就是 Reactor 模式基本设计思想 。
Netty学习记录-入门篇

文章插图
Reactor在一个单独的线程中运行 , 负责监听和分发事件 , 分发给适当的处理程序来对IO事件作出反应 。它像公司的电话接线员 , 接听来自客户的电话并将线路转译到适当的联系人 。
单 Reactor 单线程
Netty学习记录-入门篇

文章插图