Netty简介

释放双眼,带上耳机,听听看~!

目录

一.Netty的特性

二.Netty核心组件

2.1 Channel

2.2 回调

2.3 Future

2.4 事件和ChannelHandler

三.把它们放在一起

3.1 Future/回调和ChannelHandler

3.2 选择器、事件和EventLoop


我们已经了解了Socket通信的IO/NIO/AIO编程,对于通信模型已经有了一个初步的认识。在实际的工作中,我们需要不断地完善、扩展和优化。比如很经典的TCP读包写包问题,或者是数据接收的大小,实际的通信读取与应答的处理逻辑等一些细节的问题需要我们认真的去思考,而这些我们都需要大量的时间和精力,以及丰富的经验。而Netty在这基础上做了封装,我们使用Netty可以更加简单地实现上述细节。我们再也不必去编写复杂的代码逻辑去实现通信,我们再也不需要去考虑性能问题,不需要考虑编解码问题,半包读写问题等。这些细节Netty都已经帮我们实现好了,我们只需要使用即可。

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

Netty是目前最流行的NIO框架,它具有很强的健壮性、性能、可定制性和可扩展性,它已经得到成百上千的商业项目验证,如Hadoop的RPC框架Avro以及JMS框架、RocketMQ和分布式通信框架Dubbox等。

一.Netty的特性

Netty的主要特性如下:

  • 设计:统一的API,适用于不同的协议(阻塞和非阻塞);基于灵活、可扩展的事件驱动模型;高度可定制的线程模型;可靠的无连接数据Socket支持(UDP)
  • 性能:更好的吞吐量;低延迟,更省资源,尽量减少不必要的内存拷贝
  • 安全:完整的SSL/TLS和STARTTLS的支持;能在Applet与Android的限制环境运行良好
  • 健壮性:不再因过快、过慢或超负载连接导致OutOfMemoryError;不再有在高速网络环境下NIO读写频率不一致的问题
  • 易用:完善的JavaDoc,用户指南和样例;简洁简单;仅信赖于JDK1.5

二.Netty核心组件

Netty的主要构建块包括:

  • Channel
  • 回调
  • Future
  • 事件和ChannelHandler

这些构建块代表了不同类型的构造:资源、逻辑以及通知。我们的应用程序将使用它们来访问网络以及流经网络的数据。

2.1 Channel

Channel是Java NIO的一个基本构造,它代表了一个到实体的开放连接,如读操作和写操作。可以把Channel看作是传入(入站)或者传出(出站)数据的载体。因此,它可以被打开或者被关闭,连接或者断开连接。

2.2 回调

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

Netty在内部使用了回调来处理事件,当一个回调被触发时,相关的事件可以被一个ChannelHandler接口的实现来处理。

2.3 Future

Future提供了另一种在操作完成时通知应用程序的方式。这个对象可以看作是一个异步操作的结果的占位符;它将在未来的某个时刻完成,并提供对其结果的访问。

2.4 事件和ChannelHandler

Netty使用不同的事件来通知我们状态的改变或者是操作的状态,这使得我们能够基于已经发生的事件来触发适当的动作。这些动作可能是:记录日志、数据转换、流控制、应用程序控制。

Netty是一个网络编程框架,所以事件是按照它们与入站或出站数据流的相关性进行分类的。可能由入站数据或者相关的状态更改而触发的事件包括:连接已被激活或者连接失活、数据读取、用户事件、错误事件。

出站事件是未来将会触发的某个动作的操作结果,这些动作包括:打开或者关闭到远程节点的连接;将数据写到或者冲刷到套接字。

每个事件都可以被分发给ChannelHandler类中的某个用户实现的方法。这是一个很好的将事件驱动范式直接转换为应用程序构建快的例子。下图展示了一个事件是如何被一个这样的ChannelHandler链处理的。

Netty简介

Netty提供了大量预定义的可以开箱即用的ChannelHandler实现,包括用于各种协议(如HTTP和SSL/TLS)的ChannelHandler。

三.把它们放在一起

3.1 Future/回调和ChannelHandler

Netty的异步网络编程模型是建立在Future和回调的概念之上的,而将事件派发到ChannelHandler的方法则发生在更深的层次上。结合在一起,这些元素就提供了就提供了一个处理环境,使你的应用程序逻辑可以独立于任何网络操作相关的顾虑而独立地演变。

拦截操作以及高速地转换入站数据和出站数据,都只需要你提供回调或者利用操作所返回的Future。这使得链接操作变得即简单又高效,并且促进了可重用的通用代码的编写。

3.2 选择器、事件和EventLoop

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

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

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

给TA打赏
共{{data.count}}人
人已打赏
安全技术

Bootstrap 4 Flex(弹性)布局

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索