快捷搜索:  汽车  科技

netty源码全解与架构思维(Netty实战记录之序章)

netty源码全解与架构思维(Netty实战记录之序章)FutureNetty 在内部使用了回调来处理事件;当一个回调被触发时,相关的事件可以被一个 interfaceChannelHandler 的实现处理。可以把 Channel 看作是传入(入站)或者传出(出站)数据的载体。因此,它可以被打开或者被关闭,连接或者断开连接。Callback (回调)一个回调其实就是一个方法,一个指向已经被提供给另外一个方法的方法的引用。这使得后者可以在适当的时候调用前者。

Netty介绍

在上一篇文章中,我们已经了解到什么是Netty并编写了一个HelloWorld程序。现在,我们继续深入了解Netty。

Netty 是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端。已经实现了FTP SMTP HTTP WebSocket 和 SPDY 以及其他二进制和基于文本的协议。

Netty特性

netty源码全解与架构思维(Netty实战记录之序章)(1)

  • 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 类中的某个用户实现的方法。

    netty源码全解与架构思维(Netty实战记录之序章)(2)

    流经 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 的整个生命周期内都不会改变。

    猜您喜欢: