netty 概念篇

netty是什么?java

  Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。web

  也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 能够确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty至关于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。redis

  “快速”和“简单”并不用产生维护性或性能上的问题。Netty 是一个吸取了多种协议(包括FTP、SMTP、HTTP等各类二进制文本协议)的实现经验,并通过至关精心设计的项目。最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。数据库

Netty和Tomcat有什么区别?

 

  Netty和Tomcat最大的区别就在于通讯协议,Tomcat是基于Http协议的,他的实质是一个基于http协议的web容器,可是Netty不同,他能经过编程自定义各类协议,由于netty可以经过codec本身来编码/解码字节流,完成相似redis访问的功能,这就是netty和tomcat最大的不一样。apache

  有人说netty的性能就必定比tomcat性能高,其实否则,tomcat从6.x开始就支持了nio模式,而且后续还有arp模式——一种经过jni调用apache网络库的模式,相比于旧的bio模式,并发性能获得了很大提升,特别是arp模式,而netty是否比tomcat性能更高,则要取决于netty程序做者的技术实力了。编程

为何Netty受欢迎?

如第一部分所述,netty是一款收到大公司青睐的框架,在我看来,netty可以受到青睐的缘由有三:  tomcat

  1. 并发高
  2. 传输快
  3. 封装好

Netty为何并发高?

  Netty是一款基于NIO(Nonblocking I/O,非阻塞IO)开发的网络通讯框架,对比于BIO(Blocking I/O,阻塞IO),他的并发性能获得了很大提升,两张图让你了解BIO和NIO的区别:服务器

                            阻塞方式的io网络

 

               非阻塞方式的io并发

从这两图能够看出,NIO的单线程能处理链接的数量比BIO要高出不少,而为何单线程能处理更多的链接呢?缘由就是图二中出现的Selector

当一个链接创建以后,他有两个步骤要作,第一步是接收完客户端发过来的所有数据,第二步是服务端处理完请求业务以后返回response给客户端。NIO和BIO的区别主要是在第一步。

在BIO中,等待客户端发数据这个过程是阻塞的,这样就形成了一个线程只能处理一个请求的状况,而机器能支持的最大线程数是有限的,这就是为何BIO不能支持高并发的缘由。

而NIO中,当一个Socket创建好以后,Thread并不会阻塞去接受这个Socket,而是将这个请求交给Selector,Selector会不断的去遍历全部的Socket,一旦有一个Socket创建完成,他会通知Thread,而后Thread处理完数据再返回给客户端——这个过程是阻塞的,这样就能让一个Thread处理更多的请求了。
下面两张图是基于BIO的处理流程和netty的处理流程,辅助你理解两种方式的差异:
                                BIO
                         
                                             NIO
                                                     
      五种常见的IO模型
  • BIO,同步阻塞IO,阻塞整个步骤,若是链接少,他的延迟是最低的,由于一个线程只处理一个链接,适用于少链接且延迟低的场景,好比说数据库链接。
  • NIO,同步非阻塞IO,阻塞业务处理但不阻塞数据接收,适用于高并发且处理简单的场景,好比聊天软件。
  • 多路复用IO,他的两个步骤处理是分开的,也就是说,一个链接可能他的数据接收是线程a完成的,数据处理是线程b完成的,他比BIO能处理更多请求,可是比不上NIO,可是他的处理性能又比BIO更差,由于一个链接他须要两次system call,而BIO只须要一次,因此这种IO模型应用的很少。
  • 信号驱动IO,这种IO模型主要用在嵌入式开发,不参与讨论。
  • 异步IO,他的数据请求和数据处理都是异步的,数据请求一次返回一次,适用于长链接的业务场景。
       

  Netty为何传输快?

    Netty的传输快其实也是依赖了NIO的一个特性——零拷贝。咱们知道,Java的内存有堆内存、栈内存和字符串常量池等等,其中堆内存是占用内存空间最大的一块,也是Java对象存放的地方,通常咱们的数据若是须要从IO读取到堆内存,中间须要通过Socket缓冲区,也就是说一个数据会被拷贝两次才能到达他的的终点,若是数据量大,就会形成没必要要的资源浪费。
Netty针对这种状况,使用了NIO中的另外一大特性——零拷贝,当他须要接收数据的时候,他会在堆内存以外开辟一块内存,数据就直接从IO读到了那块内存中去,在netty里面经过ByteBuf能够直接对这些数据进行直接操做,从而加快了传输速度。
     下两图就介绍了两种拷贝方式的区别
   1.传统拷贝

   
   2.零拷贝
   
          
   上文介绍的ByteBuf是Netty的一个重要概念,他是netty数据处理的容器,也是Netty封装好的一个重要体现
    

    为何说Netty封装好?

  

  • Channel,表示一个链接,能够理解为每个请求,就是一个Channel。
  • ChannelHandler,核心处理业务就在这里,用于处理业务请求。
  • ChannelHandlerContext,用于传输业务数据。
  • ChannelPipeline,用于保存处理过程须要用到的ChannelHandler和ChannelHandlerContext。
           

       Codec
    Netty中的编码/解码器,经过他你能完成字节与pojo、pojo与pojo的相互转换,从而达到自定义协议的目的。
    在Netty里面最有名的就是HttpRequestDecoder和HttpResponseEncoder了。

相关文章
相关标签/搜索