问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

为什么选择Netty作为基础通信组件

发布网友 发布时间:2022-05-12 15:57

我来回答

1个回答

热心网友 时间:2023-10-12 13:59

一、什么是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相关的问题单可以参见以下链接内容。
异常堆栈如下。
java.lang.Thread.State: RUNNABLE
at 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和异步文件传输,功能非常强大。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
远得要命的爱情丁菲是谁演的 远的要命的爱情里的乔佳影是谁演的 远得要命的爱情乔佳影是什么角色 问。。我在厦门办的银行卡回江西可以用吗? 远得要命的爱情中的乔佳影是个怎样的人 厦门农信社的公告出来了,想问一下银行合同制和劳务派遣和正式工的区别... 厦门的信用社银联卡到南宁能不能用?要不要手续费? 泉州农信社年前新办的卡,存了钱,银行说三个工作日后才能动这个钱,为什 ... ...女鞋的话 是不是必须直通车 我们鞋子都是20---50鞋子利润低 直通车... 拼多多直通车200红包(拼多多直通车每天烧1000) jdk在linux EPoll下的空轮询bug是在JDK哪个版本完全修复的 云贝有什么用 免费漫画app用哪一个呢? 安全防护距离不够属于什么因素 养殖蛋鸡的企业名称 刚刚接手种鸡养殖厂的会计工作,请问该怎么设立会计科目及怎么核算?越详细越好 都说系统之家的系统齐全,真的吗?说说把,我先谢谢了 雨润集团肉种鸡养殖基地在吉林省什么地方 民间故事读后感 皮肤有的暗黄有什么适合大学生用的提亮肤色的 吃什么可以提亮肤色? nds最终幻想3召唤魔法在哪里买?请给详细图文 天津市吉瑞祥种鸡孵化有限公司怎么样? 神话故事园读后感50字怎么写 上古卷轴3的召唤魔法在哪能买到呀? 钦州市兴吉种鸡孵化有限公司怎么样? 上古卷轴5 毁灭和召唤都有哪些魔法 口袋妖怪日月召唤魔法是什么 口袋妖怪召唤魔法详解 金湖县永祥种鸡有限公司怎么样? 最终幻想5怎么在战斗中使用召唤魔法 腾讯一天能赚多少? 网易云云贝兑换的东西是正品吗 欧莱雅洗面奶会不会烂脸? 欧莱雅男士碳净油氨基酸洁面乳会使皮肤起痘痘吗 欧莱雅洗面奶好用吗? 欧莱雅和俞唐哪个洗面奶好? 欧莱雅这两种洗面奶哪种好用呢? 图象放大后很模糊可以用什么方法或软件来处理让图片放大后变得清晰点? 欧莱雅洗面奶怎么样? 对宣传部的期望作文稿 汽车变速箱油和机油有什么区别?一般车辆需要多少升? 需要一篇大学生电气工程系学生会宣传部工作总结和一篇工作计划的材料,每篇800字以上 ipad登入失败 networkerror是什么意思 同一个网址,在家用iPad和电脑都打不开,显示network error。其他网址可以打开,但是我打不 我家ipad连不上wifi,家里有路由器,pad也能连接上,但是打开不了网页~ 我姓邓,宝宝快要生了,不知道取什么名字好,大虾帮取个名字吧!拜干爹啦! ipad无法连接app syore wifi上网是连接不上提示的?啥原因 同一个无线网,手机可以连上,iPad 连不上,怎么回事? IPAD2连上笔记本做的无线路由后,可以打开QQ,但是打不开一切网页。求被指导 IPAD怎么使用联通WCDMA的方式3G上网?