以下内容根据网上资料和自己整理总结而成

一、什么是Netty?

Netty是一个高性能 事件驱动、异步非堵塞的IO(NIO)Java开源框架,Jboss提供,用于建立TCP等底层的连接,基于Netty可以建立高性能的Http服务器,快速开发高性能、高可靠性的网络服务器和客户端程序。支持HTTP、 WebSocket 、Protobuf、 Binary TCP |和UDP,Netty已经被很多高性能项目作为其Socket底层基础,如HornetQ Infinispan Vert.x Play Framework Finangle和 Cassandra。其竞争对手是:Apache MINA和 Grizzly。

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

“快速”和“简单”并不意味着会让你的最终应用产生维护性或性能上的问题。Netty 是一个吸收了多种协议的实现经验,这些协议包括FTP,SMTP,HTTP,各种二进制,文本协议,并经过相当精心设计的项目,最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。

二、不选择Java原生NIO编程的原因

首先开发出高质量的NIO程序并不是一件简单的事情,除去NIO固有的复杂性和BUG不谈,作为一个NIO服务端,还需要能够处理网络的闪断、客户端的重复接入、客户端的安全认证、消息的编解码、半包读写等情况,如果你没有足够的NIO编程经验积累,一个NIO框架的稳定往往需要半年甚至更长的时间。更为糟糕的是,一旦在生产环境中发生问题,往往会导致跨节点的服务调用中断,严重的可能会导致整个集群环境都不可用,需要重启服务器,这种非正常停机会带来巨大的损失。

从可维护性角度看,由于NIO采用了异步非阻塞编程模型,而且是一个I/O线程处理多条链路,它的调试和跟踪非常麻烦,特别是生产环境中的问题,我们无法进行有效的调试和跟踪,往往只能靠一些日志来辅助分析,定位难度很大。

现在我们总结一下为什么不建议开发者直接使用JDK的NIO类库进行开发,具体原因如下。

1)跨平台与兼容性:NIO算是底层的APIs需依赖系统的IO APIs。但Java NIO发现在不同系统平台会出现问题。大量测试也耗不少时间;NIO2只支持JDK1.7+,而且没提供DatagramSocket,故NIO2不支持UDP协议。而Netty提供统一接口,同一语句无论在JDK6.X 还是JDK7.X 都可运行,无需关心底层架构功能!

2)JAVA NIO的ByteBuffer构造函数私有,无法扩展。Netty提供了自己的ByteBuffer实现,通过简单APIs对其进行构造、使用和操作,一此解决NIO的一些限制。

3)NIO对缓冲区的聚合与分散操作可能会导致内存泄漏。直到JDK1.7才解决此问题。

4)NIO的类库和API繁杂,使用麻烦,你需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。

5)使用JAVA NIO需要具备其他的额外技能做铺垫,例如熟悉Java多线程编程。这是因为NIO编程涉及到Reactor模式,你必须对多线程和网路编程非常熟悉,才能编写出高质量的NIO程序。

6)可靠性能力补齐,工作量和难度都非常大。例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常码流的处理等问题。

7)JDK NIO的BUG,例如臭名昭著的epoll bug,它会导致Selector空轮询,最终导致CPU 100%。官方声称在JDK 1.6版本的update18修复了该问题,但是直到JDK 1.7版本该问题仍旧存在,只不过该BUG发生概率降低了一些而已,它并没有得到根本性解决。该BUG以及与该BUG相关的问题单可以参见以下链接内容。

◎    http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6403933

◎    http://bugs.java.com/bugdatabase/view_bug.do?bug_id=2147719

异常堆栈如下。

java.lang.Thread.State: RUNNABLEat sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:210)at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:65)at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:69)- locked <0x0000000750928190> (a sun.nio.ch.Util$2)- locked <0x00000007509281a8> (a java.util.Collections$ UnmodifiableSet)- locked <0x0000000750946098> (a sun.nio.ch.EPollSelectorImpl)at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:80)at net.spy.memcached.MemcachedConnection.handleIO(Memcached Connection.java:217)at net.spy.memcached.MemcachedConnection.run(MemcachedConnection. java:836)

由于上述原因,在大多数场景下,不建议大家直接使用JDK的NIO类库,除非你精通NIO编程或者有特殊的需求。在绝大多数的业务场景中,我们可以使用NIO框架Netty来进行NIO编程,它既可以作为客户端也可以作为服务端,同时支持UDP和异步文件传输,功能非常强大。

三、选择Netty作为基础通信框架的原因

Netty是业界最流行的NIO框架之一,它的健壮性、功能、性能、可定制性和可扩展性在同类框架中都是首屈一指的,它已经得到成百上千的商用项目验证,例如Hadoop的RPC框架Avro就使用了Netty作为底层通信框架,其他还有业界主流的RPC框架,也使用Netty来构建高性能的异步通信能力。

通过对Netty的分析,我们将它的优点总结如下。

◎    API使用简单,开发门槛低;

◎    功能强大,预置了多种编解码功能,支持多种主流协议;

◎    定制能力强,可以通过ChannelHandler对通信框架进行灵活地扩展;

◎    性能高,通过与其他业界主流的NIO框架对比,Netty的综合性能最优;

◎    成熟、稳定,Netty修复了已经发现的所有JDK NIO BUG,业务开发人员不需要再为NIO的BUG而烦恼;

◎    社区活跃,版本迭代周期短,发现的BUG可以被及时修复,同时,更多的新功能会加入;

◎    经历了大规模的商业应用考验,质量得到验证。Netty在互联网、大数据、网络游戏、企业应用、电信软件等众多行业已经得到了成功商用,证明它已经完全能够满足不同行业的商业应用了。

正是因为这些优点,Netty逐渐成为了Java NIO编程的首选框架。

感谢作者最原始出处链接:http://blog.csdn.net/broadview2006/article/details/46041995

为什么选择Netty作为基础通信组件?相关推荐

  1. 云计算教程学习入门视频课件:云计算基础服务组件讲解

    云计算服务,即 云服务 . 中国云计算服务网 的定义是:指可以拿来作为服务提供使用的云计算产品.包括云主机.云空间.云开发.云测试和综合类产品等.在本文中和大家讲解下云计算基础服务组件内容,基础服务组 ...

  2. 云计算学习入门:云计算基础服务组件讲解

    云计算服务,即 云服务 . 中国云计算服务网 的定义是:指可以拿来作为服务提供使用的云计算产品.包括云主机.云空间.云开发.云测试和综合类产品等.在本文中和大家讲解下云计算基础服务组件内容,基础服务组 ...

  3. gRPC 的 4 种基础通信模式

    题图 |  from freepik 本文将讨论 gRPC 应用程序的 4 种基础通信模式:一元 RPC.服务器端流 RPC.客户端流 RPC 以及双向流 RPC.在这个过程中,我们会使用一些真实用例 ...

  4. 五、Web App 基础可视组件属性(IVX 快速开发教程)

    五.基础可视组件属性 在 iVX 中各个组件存在不同的属性,这些属性用于设置显示的样式或者是自身具备的特征等,通过更改这些属性可以极大的方便我们进行项目的创作. 大多数组件都拥有相同的属性,相同属性在 ...

  5. 四、WebApp 基础可视组件(IVX 快速开发教程)

    四.基础可视组件 通过本节你将了解 iVX 开发中的核心-- iVX 组件的使用方法.iVX 的组件是开发应用时所必要的对象,通过这些对象你将快速的完成应用的开发. 在 iVX 应用开发中,所有交互. ...

  6. -组件基础-局部组件 // 局部组件的简写

    -组件基础-局部组件 <!DOCTYPE html> <html lang="en"><head><meta charset=" ...

  7. 组件基础-全局组件//全局组件的简写

    组件基础-全局组件 <!DOCTYPE html> <html lang="en"><head><meta charset="U ...

  8. Flutter基础布局组件及实现

    https://www.cnblogs.com/lxlx1798/p/11084904.html 一,概述 Flutter中拥有30多种预定义的布局widget,常用的有Container.Paddi ...

  9. 扫盲教程:单片机IIC基础通信

    单片机IIC基础通信 1 接口定义 2 程序实例 阅读提示:本章主要讲解过去电路使用较多的24C02- 24C512存储器,对于现在 主流的STC15W系列单片机,通常都具有内部比较器与DataFla ...

最新文章

  1. python调用adb传输电脑文件到手机_使用adb在电脑和手机间传文件
  2. UA MATH567 高维统计III 随机矩阵8 社区发现 Spectral Clustering的理论分析
  3. “赋值”与“初始化”
  4. C语言车辆管理报告,用c语言编的车辆管理
  5. mac安装cmake
  6. 利用装饰器实现mock和api的局部分离切换
  7. Linux下安装LAMP的步骤
  8. win7下好用的虚拟光驱,免安装,体积小
  9. 吉比特2018校招 走格子游戏
  10. ubuntu各个版本
  11. python处理skl参数、ubuntu下翻译选中文字
  12. 想知道手机配音软件哪个好用吗?一起来看看吧
  13. 以太网 以太网地址(MAC地址)
  14. html表格单元格换行属性,CSS对表格单元格强制换行和不换行
  15. 高中数学联赛不等式专题:题目1
  16. Intel VT学习笔记(二)—— VMXEVMXON
  17. 2022牛客多校 C Grab the Seat!
  18. android 摇杆控制方向键,Android Studio中实现摇杆
  19. C616数控车床改造(论文 CAD图纸 加工程序 电路图 装配图 改造总方案示意图)
  20. CentOS 7添加硬盘扩展根目录空间

热门文章

  1. spring security 核心过滤器
  2. 探索PHP7(一)--性能
  3. IOS学习之多线程(9)--NSOperation简单介绍
  4. LAMP 系统性能调优:第2 部分: 优化Apache 和PHP-学习笔记
  5. centos下 keepalived1.2.8配置文件
  6. ucos内存管理笔记
  7. nagios学习笔记(一)
  8. caffe学习(三):caffe开发环境安装(Ubuntu)
  9. 主从mysql replication 集群的sharding memcache集群使用consistent hash
  10. ARM构架之cache初探