1. Netty介绍 java
Netty是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端,Netty是基于NIO实现的,因此整个Netty都是异步操做,网络应用程序一般须要有较高的可扩展性,不管是Netty仍是其余的基于Java NIO的框架,都会提供可扩展性的解决方案。编程
2. 为何使用Netty?安全
Netty是业界最流行的NIO框架之一,它的健壮性、功能、性能、可定制性和可扩展性在同类框架中都是数一数二的,它已经获得成百上千的商用项目验证,例如Hadoop的RPC框架,avro使用Netty做为底层通讯框架。不少其它业界主流的RPC框架,也使用Netty来构建高性能的异步通讯能力。
经过对Netty的分析,咱们将它的优势总结以下:
1) API使用简单;
2) 功能强大,预置了多种编解码功能,支持多种主流协议;
3) 定制能力强,能够经过ChannelHandler对通讯框架进行灵活的扩展;
4) 性能高,经过与其它业界主流的NIO框架对比,Netty的综合性能最优;
5) 成熟、稳定,Netty修复了已经发现的全部JDK NIO BUG,业务开发人员不须要再为NIO的BUG而烦恼;
3. Netty的功能很是丰富服务器
Netty的包结构以下网络
在这里面,channel
和handler
两部分比较复杂。咱们不妨与Netty官方的结构图对照一下,来了解其功能。框架
org.jboss.netty.buffer
包中。org.jboss.netty.channel.Channel
)来封装这两种I/O模型。这部分代码在org.jboss.netty.channel
包中。4. Netty的特性总结异步
分 类ide |
Netty的特性oop |
---|---|
设计性能 |
统一的API,支持多种传输类型,阻塞的和非阻塞的简单而强大的线程模型真正的无链接数据报套接字支持连接逻辑组件以支持复用 |
易于使用 |
详实的Javadoc和大量的示例集不须要超过JDK 1.6的依赖。(一些可选的特性可能须要Java 1.7+和/或额外的依赖) |
性能 |
拥有比Java的核心API更高的吞吐量以及更低的延迟得益于池化和复用,拥有更低的资源消耗最少的内存复制 |
健壮性 |
不会由于慢速、快速或者超载的链接而致使OutOfMemoryError消除在高速网络中NIO应用程序常见的不公平读/写比率 |
安全性 |
完整的SSL/TLS以及StartTLS支持可用于受限环境下,如Applet和OSGI |
社区驱动 |
发布快速并且频繁 |
5. Netty的核心组件
Netty的主要构件块:
Channel
;Future
;ChannelHandler
。这些构建块表明了不一样类型的构造:资源、逻辑以及通知。你的应用程序将使用它们来访问网络以及流经网络的数据。
对于每一个组件来讲,咱们都将提供一个基本的定义,而且在适当的状况下,还会提供一个简单的示例代码来讲明它的用法。
Channel是Java NIO的一个基本构造。它表明一个到实体(如一个硬件设备、一个文件、一个网络套接字或者一个可以执行一个或者多个不一样的I/O操做的程序组件)的开放链接,如读操做和写操做,目前,能够把Channel
看做是传入(入站)或者传出(出站)数据的载体。所以,它能够被打开或者被关闭,链接或者断开链接。
一个回调其实就是一个方法,一个指向已经被提供给另一个方法的方法的引用。这使得后者能够在适当的时候调用前者。回调在普遍的编程场景中都有应用,并且也是在操做完成后通知相关方最多见的方式之一。
Netty在内部使用了回调来处理事件;当一个回调被触发时,相关的事件能够被一个interface-ChannelHandler
的实现处理。
代码清单1-2展现了一个例子:
1) 当一个新的链接已经被创建时,ChannelHandler
的channelActive()
回调方法将会被调用,并将打印出一条信息。
2) 被回调触发的ChannelHandler
public class ConnectHandler extends ChannelInboundHandlerAdapter { @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { -- 当一个新的链接已经被创建时,channelActive(ChannelHandlerContext)将会被调用 System.out.println( "Client " + ctx.channel().remoteAddress() + " connected"); } }
1) Future提供了另外一种在操做完成时通知应用程序的方式。这个对象能够看做是一个异步操做的结果的占位符;它将在将来的某个时刻完成,并提供对其结果的访问。
2) JDK预置了interface java.util.concurrent.Future,可是其所提供的实现,只容许手动检查对应的操做是否已经完成,或者一直阻塞直到它完成。这是很是繁琐的,因此Netty提供了它本身的实现——ChannelFuture,用于在执行异步操做的时候使用。
3) ChannelFuture提供了几种额外的方法,这些方法使得咱们可以注册一个或者多个ChannelFutureListener实例。监听器的回调方法operationComplete(),将会在对应的操做完成时被调用。而后监听器能够判断该操做是成功地完成了仍是出错了。若是是后者,咱们能够检索产生的Throwable。简而言之,由ChannelFutureListener提供的通知机制消除了手动检查对应的操做是否完成的必要。
4) 每一个Netty的出站I/O操做都将返回一个ChannelFuture
;也就是说,它们都不会阻塞。正如咱们前面所提到过的同样,Netty彻底是异步和事件驱动的。
5.4 事件和ChannelHandler
Netty使用不一样的事件来通知咱们状态的改变或者是操做的状态。这使得咱们可以基于已经发生的事件来触发适当的动做。这些动做多是:
Netty是一个网络编程框架,因此事件是按照它们与入站或出站数据流的相关性进行分类的。可能由入站数据或者相关的状态更改而触发的事件包括:
出站事件是将来将会触发的某个动做的操做结果,这些动做包括:
每一个事件均可以被分发给ChannelHandler
类中的某个用户实现的方法。这是一个很好的将事件驱动范式直接转换为应用程序构件块的例子。图展现了一个事件是如何被一个这样的ChannelHandler
链处理的。
Netty提供了大量预约义的能够开箱即用的ChannelHandler
实现,包括用于各类协议(如HTTP和SSL/TLS)的ChannelHandler
。在内部,ChannelHandler
本身也使用了事件和Future
,使得它们也成为了你的应用程序将使用的相同抽象的消费者。