为什么选择Netty作为基础通信组件?
以下内容根据网上资料和自己整理总结而成
一、什么是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作为基础通信组件?相关推荐
- 云计算教程学习入门视频课件:云计算基础服务组件讲解
云计算服务,即 云服务 . 中国云计算服务网 的定义是:指可以拿来作为服务提供使用的云计算产品.包括云主机.云空间.云开发.云测试和综合类产品等.在本文中和大家讲解下云计算基础服务组件内容,基础服务组 ...
- 云计算学习入门:云计算基础服务组件讲解
云计算服务,即 云服务 . 中国云计算服务网 的定义是:指可以拿来作为服务提供使用的云计算产品.包括云主机.云空间.云开发.云测试和综合类产品等.在本文中和大家讲解下云计算基础服务组件内容,基础服务组 ...
- gRPC 的 4 种基础通信模式
题图 | from freepik 本文将讨论 gRPC 应用程序的 4 种基础通信模式:一元 RPC.服务器端流 RPC.客户端流 RPC 以及双向流 RPC.在这个过程中,我们会使用一些真实用例 ...
- 五、Web App 基础可视组件属性(IVX 快速开发教程)
五.基础可视组件属性 在 iVX 中各个组件存在不同的属性,这些属性用于设置显示的样式或者是自身具备的特征等,通过更改这些属性可以极大的方便我们进行项目的创作. 大多数组件都拥有相同的属性,相同属性在 ...
- 四、WebApp 基础可视组件(IVX 快速开发教程)
四.基础可视组件 通过本节你将了解 iVX 开发中的核心-- iVX 组件的使用方法.iVX 的组件是开发应用时所必要的对象,通过这些对象你将快速的完成应用的开发. 在 iVX 应用开发中,所有交互. ...
- -组件基础-局部组件 // 局部组件的简写
-组件基础-局部组件 <!DOCTYPE html> <html lang="en"><head><meta charset=" ...
- 组件基础-全局组件//全局组件的简写
组件基础-全局组件 <!DOCTYPE html> <html lang="en"><head><meta charset="U ...
- Flutter基础布局组件及实现
https://www.cnblogs.com/lxlx1798/p/11084904.html 一,概述 Flutter中拥有30多种预定义的布局widget,常用的有Container.Paddi ...
- 扫盲教程:单片机IIC基础通信
单片机IIC基础通信 1 接口定义 2 程序实例 阅读提示:本章主要讲解过去电路使用较多的24C02- 24C512存储器,对于现在 主流的STC15W系列单片机,通常都具有内部比较器与DataFla ...
最新文章
- python调用adb传输电脑文件到手机_使用adb在电脑和手机间传文件
- UA MATH567 高维统计III 随机矩阵8 社区发现 Spectral Clustering的理论分析
- “赋值”与“初始化”
- C语言车辆管理报告,用c语言编的车辆管理
- mac安装cmake
- 利用装饰器实现mock和api的局部分离切换
- Linux下安装LAMP的步骤
- win7下好用的虚拟光驱,免安装,体积小
- 吉比特2018校招 走格子游戏
- ubuntu各个版本
- python处理skl参数、ubuntu下翻译选中文字
- 想知道手机配音软件哪个好用吗?一起来看看吧
- 以太网 以太网地址(MAC地址)
- html表格单元格换行属性,CSS对表格单元格强制换行和不换行
- 高中数学联赛不等式专题:题目1
- Intel VT学习笔记(二)—— VMXEVMXON
- 2022牛客多校 C Grab the Seat!
- android 摇杆控制方向键,Android Studio中实现摇杆
- C616数控车床改造(论文 CAD图纸 加工程序 电路图 装配图 改造总方案示意图)
- CentOS 7添加硬盘扩展根目录空间