1.Netty是什么/span>
Netty是一个基于JAVA NIO类库的异步通信框架,它的架构特点是:异步非阻塞、基于事件驱动、高性能、高可靠性和高可定制性。
2.使用Netty能够做什么/span>
-
开发异步、非阻塞的TCP 络应用程序;
-
开发异步、非阻塞的UDP 络应用程序;
-
开发异步文件传输应用程序;
-
开发异步HTTP服务端和客户端应用程序;
-
提供对多种编解码框架的集成,包括谷歌的Protobuf、Jboss marshalling、Java序列化、压缩编解码、XML解码、字符串编解码等,这些编解码框架可以被用户直接使用;
-
提供形式多样的编解码基础类库,可以非常方便的实现私有协议栈编解码框架的二次定制和开发;
-
基于职责链模式的Pipeline-Handler机制,用户可以非常方便的对 络事件进行拦截和定制;
-
所有的IO操作都是异步的,用户可以通过Future-Listener机制主动Get结果或者由IO线程操作完成之后主动Notify结果,用户的业务线程不需要同步等待;
-
IP黑白名单控制;
-
打印消息码流;
-
流量控制和整形;
-
性能统计;
-
基于链路空闲事件检测的心跳检测
3.Netty在哪些行业得到了应用/span>
-
互联 行业:随着 站规模的不断扩大,系统并发访问量也越来越高,传统基于Tomcat等Web容器的垂直架构已经无法满足需求,需要拆分应用进行服务化,以提高开发和维护效率。从组 情况看,垂直的架构拆分之后,系统采用分布式部署,各个节点之间需要远程服务调用,高性能的RPC框架必不可少,Netty作为异步高性能的通信框架,往往作为基础通信组件被这些RPC框架使用。
典型的应用有:阿里分布式服务框架Dubbo的RPC框架使用Dubbo协议进行节点间通信,Dubbo协议默认使用Netty作为基础通信组件,用于实现各进程节点之间的内部通信。它的架构图如下:
其中,服务提供者和服务消费者之间,服务提供者、服务消费者和性能统计节点之间使用Netty进行异步/同步通信。除了Dubbo之外,淘宝的消息中间件RocketMQ的消息生产者和消息消费者之间,也采用Netty进行高性能、异步通信。
除了阿里系和淘宝系之外,很多其它的大型互联 公司或者电商内部也已经大量使用Netty构建高性能、分布式的 络服务器。
-
游戏行业:无论是手游服务端、还是大型的 络游戏,Java语言得到了越来越广泛的应用。Netty作为高性能的基础通信组件,它本身提供了TCP/UDP和HTTP协议栈,非常方便定制和开发私有协议栈。账 登陆服务器、地图服务器之间可以方便的通过Netty进行高性能的通信,架构示意图如下:
-
大数据领域:经典的Hadoop的高性能通信和序列化组件Avro的RPC框架,默认采用Netty进行跨节点通信,它的Netty Service基于Netty框架二次封装实现。
大数据计算往往采用多个计算节点和一个/N个汇总节点进行分布式部署,各节点之间存在海量的数据交换。由于Netty的综合性能是目前各个成熟NIO框架中最高的,因此,往往会被选中用作大数据各节点间的通信。
-
企业软件:企业和IT集成需要ESB,Netty对多协议支持、私有协议定制的简洁性和高性能是ESB RPC框架的首选通信组件。事实上,很多企业总线厂商会选择Netty作为基础通信组件,用于企业的IT集成。
-
通信行业:Netty的异步高性能、高可靠性和高成熟度的优点,使它在通信行业得到了大量的应用。
4.使用传统的Socket开发挺简单的,我为什么要切换到NIO进行编程呢/span>
首先我们看下传统基于同步阻塞IO(BIO)的线程模型图:
由上图我们可以看出,传统的同步阻塞IO通信存在如下几个问题:l线程模型存在致命缺陷:一连接一线程的模型导致服务端无法承受大量客户端的并发连接;
-
性能差:频繁的线程上下文切换导致CPU利用效率不高;
-
可靠性差:由于所有的IO操作都是同步的,所以业务线程只要进行IO操作,也会存在被同步阻塞的风险,这会导致系统的可靠性差,依赖外部组件的处理能力和 络的情况。
采用非阻塞IO(NIO)之后,同步阻塞IO的三个缺陷都将迎刃而解:
-
Nio采用Reactor模式,一个Reactor线程聚合一个多路复用器Selector,它可以同时注册、监听和轮询成百上千个Channel,一个IO线程可以同时并发处理N个客户端连接,线程模型优化为1:N(N < 进程可用的最大句柄数)或者 M : N (M通常为CPU核数+ 1,N < 进程可用的最大句柄数);
-
由于IO线程总数有限,不会存在频繁的IO线程之间上下文切换和竞争,CPU利用率高;
-
所有的IO操作都是异步的,即使业务线程直接进行IO操作,也不会被同步阻塞,系统不再依赖外部的 络环境和外部应用程序的处理性能。
由于切换到NIO编程之后可以为系统带来巨大的可靠性、性能提升,所以,目前采用NIO进行通信已经逐渐成为主流。
5.为什么不直接基于JDK的NIO类库编程呢/span>
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!