第一章:Netty介绍

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的包结构以下网络

          

        在这里面,channelhandler两部分比较复杂。咱们不妨与Netty官方的结构图对照一下,来了解其功能。框架

  

  • Zero-Copy-Capable Rich Byte Buffer 零拷贝的Buffer。为何叫零拷贝?由于在数据传输时,最终处理的数据会须要对单个传输层的报文,进行组合或者拆分。NIO原生的ByteBuffer要作到这件事,须要对ByteBuffer内容进行拷贝,产生新的ByteBuffer,而Netty经过提供Composite(组合)和Slice(切分)两种Buffer来实现零拷贝。这部分代码在org.jboss.netty.buffer包中。
  • Universal Communication API 统一的通信API。由于Java的Old I/O和New I/O,使用了互不兼容的API,而Netty则提供了统一的API(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

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

    对于每一个组件来讲,咱们都将提供一个基本的定义,而且在适当的状况下,还会提供一个简单的示例代码来讲明它的用法。

   5.1 Channel

      Channel是Java NIO的一个基本构造。它表明一个到实体(如一个硬件设备、一个文件、一个网络套接字或者一个可以执行一个或者多个不一样的I/O操做的程序组件)的开放链接,如读操做和写操做,目前,能够把Channel看做是传入(入站)或者传出(出站)数据的载体。所以,它能够被打开或者被关闭,链接或者断开链接。

   5.2  回调

      一个回调其实就是一个方法,一个指向已经被提供给另一个方法的方法的引用。这使得后者能够在适当的时候调用前者。回调在普遍的编程场景中都有应用,并且也是在操做完成后通知相关方最多见的方式之一。

     Netty在内部使用了回调来处理事件;当一个回调被触发时,相关的事件能够被一个interface-ChannelHandler的实现处理。

     代码清单1-2展现了一个例子:

             1) 当一个新的链接已经被创建时,ChannelHandlerchannelActive()回调方法将会被调用,并将打印出一条信息。

              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");
    }
}

5.3   Future

    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,使得它们也成为了你的应用程序将使用的相同抽象的消费者。

相关文章
相关标签/搜索