netty源码全解与架构思维(Netty实战记录之序章)
netty源码全解与架构思维(Netty实战记录之序章)FutureNetty 在内部使用了回调来处理事件;当一个回调被触发时,相关的事件可以被一个 interfaceChannelHandler 的实现处理。可以把 Channel 看作是传入(入站)或者传出(出站)数据的载体。因此,它可以被打开或者被关闭,连接或者断开连接。Callback (回调)一个回调其实就是一个方法,一个指向已经被提供给另外一个方法的方法的引用。这使得后者可以在适当的时候调用前者。
Netty介绍在上一篇文章中,我们已经了解到什么是Netty并编写了一个HelloWorld程序。现在,我们继续深入了解Netty。
Netty 是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端。已经实现了FTP SMTP HTTP WebSocket 和 SPDY 以及其他二进制和基于文本的协议。
Netty特性Channel
Channel 是 NIO 基本的结构。它代表了一个用于连接到实体(如硬件设备、文件、网络套接字或程序组件) 能够执行一个或多个不同的 I/O 操作(例如读或写)的开放连接。
可以把 Channel 看作是传入(入站)或者传出(出站)数据的载体。因此,它可以被打开或者被关闭,连接或者断开连接。
-
Callback (回调)
一个回调其实就是一个方法,一个指向已经被提供给另外一个方法的方法的引用。这使得后者可以在适当的时候调用前者。
Netty 在内部使用了回调来处理事件;当一个回调被触发时,相关的事件可以被一个 interfaceChannelHandler 的实现处理。
-
Future
Future 提供了另外一种通知应用操作已经完成的方式。这个对象作为一个异步操作结果的占位符 它将在将来的某个时候完成并提供结果。
ChannelFuture 提供多个附件方法来允许一个或者多个ChannelFutureListener 实例。监听器的回调方法 operationComplete() 会在对应的操作完成时被调用。事件监听器能够确认这个操作是成功地完成了还是出错了。如果是后者 我们可以检索到产生的Throwable。简而言之 ChannelFutureListener 提供的通知机制不需要手动检查操作是否完成的。
每个 Netty 的 outbound I/O 操作都会返回一个 ChannelFuture;这样就不会阻塞。这就是 Netty 所谓的“自底向上的异步和事件驱动”。
ChannelFutureListener 看作是回调的一个更加精细的版本。回调和 Future 是相互补充的机制;它们相互结合,构成了 Netty 本身的关键构件块之一。
-
Event 和 Handler
Netty 使用不同的事件来通知我们更改的状态或操作的状态。这使我们能够根据发生的事件触发适当的行为。
这些行为可能包括:
-
记录日志
-
数据转换
-
流控制
-
应用程序逻辑
由于 Netty 是一个网络框架 事件很清晰的跟入站或出站数据流相关。因为一些事件可能触发传入的数据或状态的变化包括:
-
连接已被激活或者连接失活
-
数据的读取
-
用户事件
-
错误事件
出站事件是由于在未来操作将触发一个动作。这些包括:
-
打开或者关闭到远程节点的连接;
-
将数据写到或者冲刷到套接字。
每个事件都可以被分发给 ChannelHandler 类中的某个用户实现的方法。
流经 ChannelHandler 链的入站事件和出站事件
Netty 的ChannelHandler 是各种处理程序的基本抽象。每个 ChannelHandler 的实例都类似于一种为了响应特定事件而被执行的回调。
Netty 提供了大量预定义的可以开箱即用的 ChannelHandler 实现,包括用于各种协议 (如 HTTP 和 SSL/TLS)的 ChannelHandler。在内部,ChannelHandler 自己也使用了事件和Future,使得它们也成为了你的应用程序将使用的相同抽象的消费者。
-
整合
FUTURE CALLBACK 和 HANDLER
Netty 的异步编程模型是建立在 future 和 callback 的概念上的,而将事件派发到ChannelHandler 的方法则发生在更深的层次上。结合在一起,这些元素就提供了一个处理环境,使你的应用程序逻 辑可以独立于任何网络操作相关的顾虑而独立地演变。这也是 Netty 的设计方式的一个关键目标。
拦截操作以及高速地转换入站数据和出站数据,都只需要你提供回调或者利用操作所返回的 Future。这使得链接操作变得既简单又高效,并且促进了可重用的通用代码的编写。
SELECTOR EVENT 和 EVENT LOOP
Netty 通过触发事件从应用程序中抽象出 Selector,从而避免手写调度代码。EventLoop 分配给每个 Channel 来处理所有的事件,包括:
-
注册感兴趣的事件;
-
调度事件到 ChannelHandler;
-
安排进一步行动。
EventLoop 本身只由一个线程驱动,其处理了一个 Channel 的所有 I/O 事件,并且在该 EventLoop 的整个生命周期内都不会改变。