Netty概述:java
一、netty是基于Java NIO的网络应用框架,client-server框架web
二、Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,面试
做为一个异步NIO框架,Netty的全部IO操做都是异步非阻塞的,spring
经过Future-Listener机制,用户能够方便的主动获取或者经过通知机制得到IO操做结果。apache
三、做为当前最流行的NIO框架,Netty在互联网领域、大数据分布式计算领域、游戏行业、通讯行业等得到了普遍的应用,编程
一些业界著名的开源组件也基于Netty的NIO框架构建。缓存
一.通讯框架tomcat
流行基于Java NIO通讯框架有Mina、Netty、Grizzly等。接下来讲下它们之间的对比。服务器
二.它们的出身网络
一、Mina出身于开源界的大牛Apache组织;
二、Netty出身于商业开源大亨Jboss;
三、Grizzly则出身于土鳖Sun公司。
四、你的公司用的什么呢?哈哈欢迎留言评论~~
三.它们的设计理念
一、Mina
Mina(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了很是便利的框架。当前发行的 Mina 版本2.04支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通信程序,Mina 所支持的功能也在进一步的扩展中。
目前,正在使用Mina的应用包括:Apache Directory Project、AsyncWeb、AMQP(Advanced Message Queuing Protocol)、RED5 Server(Macromedia Flash Media RTMP)、ObjectRADIUS、 Openfire等等。
二、Netty
Netty是一款异步的事件驱动的网络应用框架和工具,用于快速开发可维护的高性能、高扩展性协议服务器和客户端。也就是说,Netty是一个NIO客户端/服务器框架,支持快速、简单地开发网络应用,如协议服务器和客户端。它极大简化了网络编程,如TCP和UDP套接字服务器。
三、Grizzly
Grizzly是一种应用程序框架,专门解决编写成千上万用户访问服务器时候产生的各类问题。使用JAVA NIO做为基础,并隐藏其编程的复杂性。容易使用的高性能的API。带来非阻塞socketd到协议处理层。利用高性能的缓冲和缓冲管理使用高性能的线程池。
从设计的理念上来看,Mina的设计理念是最为优雅的。固然,因为Netty的主导做者与Mina的主导做者是同一人,出自同一人之手的Netty在设计理念上与Mina基本上是一致的。而Grizzly在设计理念上就较差了点,几乎是JavaNIO的简单封装。
四.Netty为何这么火?
Netty是目前最流行的由JBOSS提供的一个Java开源框架NIO框架,Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
相比JDK原生NIO,Netty提供了相对十分简单易用的API,很是适合网络编程。Netty是彻底基于NIO实现的,因此Netty是异步的。
做为一个异步NIO框架,Netty的全部IO操做都是异步非阻塞的,经过Future-Listener机制,用户能够方便的主动获取或者经过通知机制得到IO操做结果。
Netty无疑是NIO的老大,它的健壮性、功能、性能、可定制性和可扩展性在同类框架都是数一数二的。它已经获得成百上千的商业/商用项目验证,如Hadoop的RPC框架Avro、RocketMQ以及主流的分布式通讯框架Dubbo等等。
为何这么火,是有缘由的。
NIO通信服务端步骤:
一、建立ServerSocketChannel,为它配置非阻塞模式
二、绑定监听,配置TCP参数,录入backlog大小等
三、建立一个独立的IO线程,用于轮询多路复用器Selector
四、建立Selector,将以前的ServerSocketChannel注册到Selector上,并设置监听标识位SelectionKey.ACCEPT
五、启动IO线程,在循环体中执行Selector.select()方法,轮询就绪的通道
六、当轮询处处于就绪的通道时,须要进行判断操做位,若是是ACCEPT状态,说明是新的客户端介入,则调用accept方法接受新的客户端。
七、设置新接入客户端的一些参数,并将其通道继续注册到Selector之中。设置监听标识等
八、若是轮询的通道操做位是READ,则进行读取,构造Buffer对象等
九、更细节的还有数据没发送完成继续发送的问题
Netty实现通信的步骤:
一、建立两个NIO线程组,一个专门用来网络事件处理(接受客户端链接),另外一个则进行网络通信读写
二、建立一个ServerBootstrap对象,配置Netty的一系列参数,例如接受传入数据的缓存大小等。
三、建立一个实际处理数据的类ChannelInitializer,进行初始化的准备工做,好比设置传入数据的字符集,格式,实现实际处理数据的接口。
四、绑定端口,执行同步阻塞方法等待服务器启动便可。
当对于NIO模型,netty简单、健壮、性能稳定,并且这几步都是模板式开发,之后能够直接用,开发只需专一实际处理数据类的实现。
Netty最佳实践(数据通信、心跳检测)
netty服务最好能够单独做为一个项目,固然也能够与web项目集成在一块儿发布到tomcat,
这样好处是能够用到web项目中的service方法,可是web项目8080关闭,netty监听的端口号也关闭了
因此netty能够打成jar包运行,固然若是要用到service层的代码,也能够将service层的代码打成jar包
给netty业务类使用。
netty通信的方式:
①使用长链接通道不断开的形式进行通讯,也就是服务器和客户端的通道一直处于开启状态,若是服务器的
性能比较好,并且客户端的数量也很少的状况下,能够考虑这种方式
②一次性批量提交数据,采用短链接的方式,也就是咱们把数据保存在本地临时缓冲区或者临时表中,
当达到临界值时进行一次性批量提交,又或者根据定时任务轮询提交,这种状况下弊端是作不到
实时性传输,在实时性要求不高的程序中能够采用
③采用一种特殊的长链接,在指定某一段时间以内,服务端和某台客户端没有任何通信,则断开链接,
下次若是客户端要向服务端发送数据时,再次创建链接。
Netty的优势能够总结以下:
一、API使用简单,开发门槛低;
二、功能强大,预置了多种编解码功能,支持多种主流协议;
三、定制能力强,能够经过ChannelHandler对通讯框架进行灵活地扩展;
四、性能高,经过与其余业界主流的NIO框架对比,Netty的综合性能最优;
五、成熟、稳定,Netty修复了已经发现的全部JDK NIO BUG,业务开发人员不须要再为NIO的BUG而烦恼;
六、社区活跃,版本迭代周期短,发现的BUG能够被及时修复,同时,更多的新功能会加入;
七、经历了大规模的商业应用考验,质量获得验证。在互联网、大数据、网络游戏、企业应用、电信软件等众多行业获得成功商用,证实了它已经彻底可以知足不一样行业的商业应用了。
与Mina相比有什么优点:
一、都是Trustin Lee的做品,Netty更晚;
二、Mina将内核和一些特性的联系过于紧密,使得用户在不须要这些特性的时候没法脱离,相比下性能会有所降低,Netty解决了这个设计问题;
三、Netty的文档更清晰,不少Mina的特性在Netty里都有;
四、Netty更新周期更短,新版本的发布比较快;
五、它们的架构差异不大,Mina靠apache生存,而Netty靠jboss,和jboss的结合度很是高,Netty有对google protocal buf的支持,有更完整的ioc容器支持(spring,guice,jbossmc和osgi);
六、Netty比Mina使用起来更简单,Netty里你能够自定义的处理upstream events或/和downstream events,可使用decoder和encoder来解码和编码发送内容;
七、Netty和Mina在处理UDP时有一些不一样,Netty将UDP无链接的特性暴露出来;而Mina对UDP进行了高级层次的抽象,能够把UDP当成"面向链接"的协议,而要Netty作到这一点比较困难。
八、从任务调度粒度上看,mina会将有IO任务的session写入队列中,当循环执行任务时,则会轮询全部的session,并依次把session中的全部任务取出来运行。这样粗粒度的调度是不公平调度,会致使某些请求的延迟很高。
加Java架构师群获取Java工程化、高性能及分布式、高性能、深刻浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点高级进阶干货的直播免费学习权限 都是大牛带飞 让你少走不少的弯路的 群..号是:855801563 对了 小白勿进 最好是有开发经验
注:加群要求
一、具备工做经验的,面对目前流行的技术不知从何下手,须要突破技术瓶颈的能够加。
二、在公司待久了,过得很安逸,但跳槽时面试碰壁。须要在短期内进修、跳槽拿高薪的能够加。
三、若是没有工做经验,但基础很是扎实,对java工做机制,经常使用设计思想,经常使用java开发框架掌握熟练的,能够加。
四、以为本身很牛B,通常需求都能搞定。可是所学的知识点没有系统化,很难在技术领域继续突破的能够加。
5.阿里Java高级大牛直播讲解知识点,分享知识,多年工做经验的梳理和总结,带着你们全面、科学地创建本身的技术体系和技术认知!