Netty in action ——— 异步和事件驱动

本文是Netty文集中“Netty in action”系列的文章。主要是对Norman Maurer and Marvin Allen Wolfthal 的 《Netty in action》一书简要翻译,同时对重要点加上一些自己补充和扩展。

概要

Netty核心组件

  • Channels —— 通道
  • Callbacks —— 回调
  • Futures
  • Events and handlers —— 事件和执行器

Channels

Channel是基于java NIO结构,它表示:
一个打开的到一个实体的连接。实体如,一个计算机硬件驱动、一个文件、一个网络socket、或者一个有能力处理一个或多个I/O操作(比如,读/写功能)的程序组件。
可以将Channel想象成一个运输工具,用于输入和输出数据。同样地,Channel能被open、close、connected、disconnected

Callbacks

回调是在一个适当的时间被调用的,回调是一个最常见的方法之一用于通知一个感兴趣的操作已经完成。
Netty使用一个内部的回调处理事件;当一个回调被触发时事件能被一个实现channelHandler 接口的实例处理。

Futures

Future提供了另一个方式去通知应用当一个操作已经完成。Future对象作为一个异步操作结果的占位符返回,异步操作将在未来的某个时刻完成并提供一个可访问的结果。
JDK提供了 interface java.util.concurrent.Future,但JDK对Future的实现需要你手动检查是否一个操作已经完成或者堵塞直到操作完成。这很笨重的,所以Netty提供了它自己的实现 ———— ChannelFuture,用于一个异步操作执行时。

ChannelFuture提供了一个附加的方法,这个方法允许你注册一个或多个ChannelFutureListenner实例。“operationComplete()”在操作完成时会被回调。监听者能够确定操作是否成功或失败。如果失败了,我们能够恢复错误。简而言之,ChannelFutureListener的通知机制消除了手动检查操作完成的需要。
ChannelFutureListenner 将 future 和 callback 组合起来了。

Netty的出站I/O操作将返回一个ChannelFuture:

Events and handlers

Netty使用不同的事件来通知我们关于状态的变化或者操作的状态。这允许我们基于事件的发生触发适当的操作。
Netty将事件划分为“入站数据流”或“出站数据流”
入站操作或者一个相关的状态变化包括:

  • 连接状态的活跃(active)或不活跃(inactive)
  • 数据的读取
  • 用户事件触发
  • 错误事件触发

一个出站事件是一个Future中动作的结果。出站事件比如:

  • 开启或关闭一个远端连接
  • 写或刷新数据到套接字中

每个事件能被分配到一个用户实现的一个处理类的方法中。目前你可以认为每一个handler的实例都是一个callback的类型,用于执行一个特定事件的返回。
Netty提供了一个可扩展的预定义处理器集合使你能够拆箱即用,包括如HTTP、SSL/TLS协议的处理。

SELECTORS,EVENTS,AND EVENT LOOPS

Netty通过触发事件将Selector从应用中提取了出来。一个EventLoop被分配给每个Channel用于处理这个Channel的所有事件。
EventLoop本身由一个线程驱动,该线程处理一个Channel的所以I/O事件,并且在整个EventLoop的生命周期都不会改变持有的线程。

后记

本文主要是对Netty的部分核心组件做了一个简单的介绍。各个组件和模块会在后续的文章中进行详细的介绍。
若文章有任何错误,望大家不吝指教:)

参考

《Netty in action》

推荐阅读更多精彩内容