非阻塞I/O相比阻塞I/0优点
- 使用较少的线程便可以处理许多连接,因此也减少了内存管理和上下文切换所带来开销;
- 当没有I/O操作需要处理的时候,线程也可以被用于其他任务。
异步和可伸缩性
异步:也成为非同步
可伸缩性:一种系统、网络或者进程在需要处理的工作不断增长时,可以通过某种可行的方式或者扩大它的处理能力来适应这种增长的能力。
异步和可伸缩性之间的联系
- 非阻塞网络调用不必等待一个操作的完成。完全异步的 I/O 正是基于这个特性构建的,并且更进一步:异步方法会立即返回,并且在它完成时,会直接或者在稍后的某个时间点通知用户。
- 选择器使得我们能够通过较少的线程便可监视许多连接上的事件。
netty核心组件
channel
- Channel 是 Java NIO 的一个基本构造。
- 代表一个到实体(如一个硬件设备、一个文件、一个网络套接字或者一个能够执行一个或者多个不同的I/O操作的程序组件)的开放连接,如读操作和写操作。
- 可以把 Channel 看作是传入(入站)或者传出(出站)数据的载体。因此,它可以被打开或者被关闭,连接或者断开连接。
回调
- 一个回调就是一个方法,一个指向已经被提供给另外一个方法的方法引用。
- Netty使用回调来处理事件,当一个回调被触发时,被interfaceChannelHander实现处理。
Future
- Future 提供了另一种在操作完成时通知应用程序的方式。这个对象可以看作是一个异步操作的结果的占位符;它将在未来的某个时刻完成,并提供对其结果的访问。
- Netty提供了ChannelFuture,用于在执行异步操作的时候使用。
- 每个 Netty 的出站I/O操作都将返回一个 ChannelFuture。
- ChannelFuture允许注册一个或者多个ChannelFutureListener实例,监听器可以判断该操作是成功地完成了还是出错了。消除了在程序中手动检查对应的操作是否完成的必要。
事件和 ChannelHandler
- Netty使用不同的事件来通知我们状态的改变或者是操作的状态。这使得我们能够基于已经发生的事件来触发适当的动作。
- 每个事件都可以被分发给 ChannelHandler 类中的某个用户实现的方法。