1,Netty 是一个 Java NIO 同步非阻塞框架,它底层封装了 Java NIO 的 Channel, Selector, SelectKey,便于用户使用 Java NIO 编程。但它的所有的 IO 操作都是异步的,全是各种 Future,Promise(Promise也是一种特殊的Future),因为 jdk 1.5 的 Future 没有事件监听功能,所以Netty 自己实现的 Future 具有事件监听回调,这是常规的异步操作,jdk 1.8 有了 CompleteFuture ,就不需要自己手动实现异步监听回调了,非常方便。
2,Java 里的异步操作,底层基本上都是通过线程池去实现的,因为新开一个线程去执行任务,其实就是最基本的异步操作。而 Netty 也不例外,但 Channel 有事件需要处理时,它就使用 EventLoop 去执行。Channel ,EvenLoop,Thread 的关系如下:
一个EventLoopGroup包含一个或者多个EventLoop。
一个EventLoop在它的生命周期内只和一个Thread绑定。
所有由EventLoop处理的I/O事件都将在它专有的Thread上被处理。
一个Channel在它的生命周期内只注册于一个EventLoop。
一个EventLoop可能会被分配给一个或多个Channel。
此外还有Channel内部的数据处理流程,Channel 内部的数据结构。Channel 里是通过一个双向链表来处理事件的,和责任链模式差不多。
3,当我们学会使用了 Netty 并想更深入理解它的时候,可以在网上查找相关的 手写Netty 博客和项目,可以加深我们对Netty的理解。要知道Netty 是很复杂的,另外Netty还有一部分代码是内存池管理的,作者实现了 jemalloc 算法去管理线程池,这个理解起来确实挺困难的。