Netty的介绍

发表时间:2017-09-12 16:59:26 浏览量( 32 ) 留言数( 0 )

学习目标:

1、了解Netty的发展

2、了解BIO和NIO的区别


学习过程:

一、BIO和NIO的介绍

    BIO就是以前的旧的JavaAPI的实现方式,NIO以前是新IO的意思,当然也已经很多年了,所以现在的最新的解释是非阻塞的IO的意思。BIO和NIO的主要区别是:

   1、面向流与面向缓冲

   Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。

    2、阻塞与非阻塞IO

    Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。 Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。

    Java NIO的选择器(Selectors)允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。


二、Netty的介绍

    Netty是由JBOSS提供的一个java开源框架。Netty 是一个提供 asynchronous event-driven (异步事件驱动)的网络应用框架,是一个用以快速开发高性能、高可靠性协议的服务器和客户端。换句话说,Netty 是一个 NIO 客户端服务器框架,使用它可以快速简单地开发网络应用程序,比如服务器和客户端的协议。Netty 大大简化了网络程序的开发过程比如 TCP 和 UDP 的 socket 服务的开发。

   “快速和简单”并不意味着应用程序会有难维护和性能低的问题,Netty 是一个精心设计的框架,它从许多协议的实现中吸收了很多的经验比如 FTP、SMTP、HTTP、许多二进制和基于文本的传统协议.因此,Netty 已经成功地找到一个方式,在不失灵活性的前提下来实现开发的简易性,高性能,稳定性。

1、Netty特性总结

    设计:为多种网络传输类型提供统一的API,包括阻塞式和非阻塞式;简单但是强大的线程模型;支持真正无连接datagram socket;链接逻辑组件以支持复用

    易用性:大量的Javadoc和丰富的demo;JDK1.7就够了

    性能:更好的吞吐量和更低的延迟;通过线程池复用线程来减少资源消耗;减少内存复制的消耗

    健壮性:不会因过慢过快或者超载的连接而导致的OutOfMemoryError;消除了在高速网络中NIO应用常见的不公平读写比率

    安全性:完全支持SSL/TLS和StartTLS;可用于受限环境下,如Applet或OSGI

    社区驱动:发布频繁且快速

2、异步和事件驱动 

   非阻塞网络调用使得我们可以不必等待一个操作的完成。Netty的完全异步的I/O正是基于这个特性构建的,并且更进一步:异步方法会立即返回,并且在它完成时,会直接或者在稍后的某个时间点通知用户选择器使得我们能够通过较少的线程便可监视许多连接上的事件。

3、Netty的核心组件

    Channels

    回调(Callback)

    Futures

    事件(Event)和处理器(handler)


三、那些地方会用到Netty呢

    Netty是一个封装网络通讯的开源Java框架,所以任何涉及到网络通讯的都可以使用Netty,其应用范围非常广,使用Netty的公司有Facebook、google、淘宝等大公司都有使用。当然其他的公司也会根据自己的需要使用,现在流行的大数据的分布树式应用也大量使用了Netty作为底层框架。还有目前流行的RPC框架,比如阿里的dubbo框架,核心就是使用Netty进行通讯的。传统基于RMI和Hession的同步阻塞式通信已经无法满足性能和可靠性要求。因此,高性能的NIO框架Netty成为构建分布式服务框架的基石。当然你还可以使用Netty自己实现一个简单的Http服务框架,或者一个websocket框架,实现一个网络聊天系统等等,使用Netty都可以帮助你快速的实现。