Netty是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端。

Java BIO:

首先,早期我们java里面使用BIO(Block IO),编写网络通信相关的程序时候,往往都是使用Socket编程。会为每个连接创建一个线程,当连接数少的时候,还可以,但是当连接数多的时候,我们就会发现这很不理想。另外,有些线程会长时间处在休眠状态,资源浪费。需要为每个线程的调用栈分配内存. 还有就是频繁的上下文切换带来的开销就会带来很多麻烦。

Java NIO:

后来在java的1.4版本的时候,出现java.nio.

其中java.nio.channels.Selector是java的非阻塞I/O实现的关键。它使用了时间通知API以确定在一组非阻塞Socket中有哪些已经就绪能够进行I/O的操作。

java动作事件响应总结_数据

优点:
使用较少的线程便可以处理许多连接,减少了内存管理和上下文切换带来的开销。
当没有IO操作的时候,线程也可以被用于其他任务。

1.2 异步和事件驱动

可以以任意的顺序响应在任意的时间点产生的事件。

一种系统、网络或者进程在需要处理的工作不断增长时,可以通过某种可行的方式或者扩大它的处理能力来适应这种增长的能力,对实现最高级别的可伸缩性至关重要。

1.3 netty的核心组件

  • Channel(信道)
  • CallBack(回调)
  • Future
  • 事件和ChannelHandler

这个四个组件代表了不同类型的构造:资源,逻辑以及通知。

1.3.1 Channel

定义

channel代表一个到实体(如一个硬件设备,一个文件,一个网络套接字,或者一个能够执行一个或者多个不同的I/O操作的程序组件)的开放连接,如读操作和写操作。

目前可以把Channel看作是入站和出站的数据的载体,它可以被打开,关闭,连接,断开连接。

1.3.2 回调

定义

一个回调就是一个方法,一个指向已经被提供给另一个方法的方法引用。这使得后者可以在适当的时候,调用前者。

1.3.3 Future

Future在java.util.concurrent.Future.Netty提供了自己的实现,ChannelFuture,用于在执行异步操作的时候使用。
每个Netty的出站I/O操作都会返回一个ChannelFuture。也就是说它不会阻塞.

1.3.4 事件和ChannelHandler

Netty使用不同的事件来告诉我们状态的改变或者操作的状态。我们可以基于已知的事件来触发不同的操作。
netty是一个网络编程框架,所以事件是按照他们与入站或出站数据流的相关性分类的。可能由入站数据或者相关的状态更改而触发的事件包括:

  • 连接已被激活或者连接失活
  • 数据读取
  • 用户事件
  • 错误事件
    出站事件是未来将会触发的某个动作的操作结果,这些动作包括:
  • 打开或者关闭到远程节点的连接
  • 将数据写到或者冲刷到套接字。

每个事件都可以被分发到ChannelHandler类中的某个用户实现的方法中。

java动作事件响应总结_java动作事件响应总结_02

Netty 通过触发事件将Selector 从应用程序中抽象出来,消除了所有本来将需要手动编写的派发代码。在内部,将会为每个Channel 分配一个EventLoop,用以处理所有事件,包括:

  • 注册感兴趣的事件;
  • 将事件派发给ChannelHandler;
  • 安排进一步的动作。

EventLoop 本身只由一个线程驱动,其处理了一个Channel 的所有I/O 事件,并且在该EventLoop 的整个生命周期内都不会改变。这个简单而强大的设计消除了你可能有的在ChannelHandler 实现中需要进行同步的任何顾虑,因此,你可以专注于提供正确的逻辑,用来在有感兴趣的数据要处理的时候执行。