文档章节

Java分布式框架netty之NIO框架区别分析

架构师springboot
 架构师springboot
发布于 2018/11/12 21:21
字数 2770
阅读 286
收藏 6

Netty概述:

1、netty是基于Java NIO的网络应用框架,client-server框架

2、Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,

作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,

通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果。

3、作为当前最流行的NIO框架,Netty在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,

一些业界著名的开源组件也基于Netty的NIO框架构建。

一.通信框架

流行基于Java NIO通信框架有Mina、Netty、Grizzly等。接下来说下它们之间的对比。

二.它们的出身

1、Mina出身于开源界的大牛Apache组织;

2、Netty出身于商业开源大亨Jboss;

3、Grizzly则出身于土鳖Sun公司。

4、你的公司用的什么呢?哈哈欢迎留言评论~~

三.它们的设计理念

1、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等等。

2、Netty

Netty是一款异步的事件驱动的网络应用框架和工具,用于快速开发可维护的高性能、高扩展性协议服务器和客户端。也就是说,Netty是一个NIO客户端/服务器框架,支持快速、简单地开发网络应用,如协议服务器和客户端。它极大简化了网络编程,如TCP和UDP套接字服务器。

3、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通讯服务端步骤:

1、创建ServerSocketChannel,为它配置非阻塞模式

2、绑定监听,配置TCP参数,录入backlog大小等

3、创建一个独立的IO线程,用于轮询多路复用器Selector

4、创建Selector,将之前的ServerSocketChannel注册到Selector上,并设置监听标识位SelectionKey.ACCEPT

5、启动IO线程,在循环体中执行Selector.select()方法,轮询就绪的通道

6、当轮询到处于就绪的通道时,需要进行判断操作位,如果是ACCEPT状态,说明是新的客户端介入,则调用accept方法接受新的客户端。

7、设置新接入客户端的一些参数,并将其通道继续注册到Selector之中。设置监听标识等

8、如果轮询的通道操作位是READ,则进行读取,构造Buffer对象等

9、更细节的还有数据没发送完成继续发送的问题

Netty实现通讯的步骤:

1、创建两个NIO线程组,一个专门用来网络事件处理(接受客户端连接),另一个则进行网络通讯读写

2、创建一个ServerBootstrap对象,配置Netty的一系列参数,例如接受传入数据的缓存大小等。

3、创建一个实际处理数据的类ChannelInitializer,进行初始化的准备工作,比如设置传入数据的字符集,格式,实现实际处理数据的接口。

4、绑定端口,执行同步阻塞方法等待服务器启动即可。

当对于NIO模型,netty简单、健壮、性能稳定,而且这几步都是模板式开发,以后可以直接用,开发只需专注实际处理数据类的实现。

Netty最佳实践(数据通讯、心跳检测)

netty服务最好可以单独作为一个项目,当然也可以与web项目集成在一起发布到tomcat,

这样好处是可以用到web项目中的service方法,但是web项目8080关闭,netty监听的端口号也关闭了

所以netty可以打成jar包运行,当然如果要用到service层的代码,也可以将service层的代码打成jar包

给netty业务类使用。

netty通讯的方式:

①使用长连接通道不断开的形式进行通信,也就是服务器和客户端的通道一直处于开启状态,如果服务器的

性能比较好,而且客户端的数量也不多的情况下,可以考虑这种方式

②一次性批量提交数据,采用短连接的方式,也就是我们把数据保存在本地临时缓冲区或者临时表中,

当达到临界值时进行一次性批量提交,又或者根据定时任务轮询提交,这种情况下弊端是做不到

实时性传输,在实时性要求不高的程序中可以采用

③采用一种特殊的长连接,在指定某一段时间之内,服务端和某台客户端没有任何通讯,则断开连接,

下次如果客户端要向服务端发送数据时,再次建立连接。

Netty的优点可以总结如下:

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

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

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

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

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

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

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

与Mina相比有什么优势:

1、都是Trustin Lee的作品,Netty更晚;

2、Mina将内核和一些特性的联系过于紧密,使得用户在不需要这些特性的时候无法脱离,相比下性能会有所下降,Netty解决了这个设计问题;

3、Netty的文档更清晰,很多Mina的特性在Netty里都有;

4、Netty更新周期更短,新版本的发布比较快;

5、它们的架构差别不大,Mina靠apache生存,而Netty靠jboss,和jboss的结合度非常高,Netty有对google protocal buf的支持,有更完整的ioc容器支持(spring,guice,jbossmc和osgi);

6、Netty比Mina使用起来更简单,Netty里你可以自定义的处理upstream events或/和downstream events,可以使用decoder和encoder来解码和编码发送内容;

7、Netty和Mina在处理UDP时有一些不同,Netty将UDP无连接的特性暴露出来;而Mina对UDP进行了高级层次的抽象,可以把UDP当成"面向连接"的协议,而要Netty做到这一点比较困难。

8、从任务调度粒度上看,mina会将有IO任务的session写入队列中,当循环执行任务时,则会轮询所有的session,并依次把session中的所有任务取出来运行。这样粗粒度的调度是不公平调度,会导致某些请求的延迟很高。

加Java架构师群获取Java工程化、高性能及分布式、高性能、深入浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点高级进阶干货的直播免费学习权限 都是大牛带飞 让你少走很多的弯路的 群..号是:855801563 对了 小白勿进 最好是有开发经验

注:加群要求

1、具有工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加。

2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。

3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加。

4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。

5.阿里Java高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

© 著作权归作者所有

架构师springboot
粉丝 24
博文 202
码字总数 494257
作品 0
东城
私信 提问
Qzone 微信 Java高级——dubbo源码分析之远程通信 netty

Java高级——dubbo源码分析之远程通信 netty dubbo 底层通信选择了 netty 这个 nio 框架做为默认的网络通信框架并且通过自定义协议进行通信。dubbo 支持以下网络通信框架: Netty(默认) Min...

Java架构师那些事
2018/08/29
0
0
少啰嗦!一分钟带你读懂Java的NIO和经典IO的区别

本文引用了“架构师社区”公众号的《史上讲的最好的Java NIO与IO的区别与应用》一文部分内容,感谢原作者的技术分享。 1、引言 很多初涉网络编程的程序员,在研究Java NIO(即异步IO)和经典...

JackJiang2011
今天
0
0
Java 200+ 面试题补充② Netty 模块

让我们每天都能看到自己的进步。老王带你打造最全的 Java 面试清单,认真把一件事做到最好。 本文是前文《Java 最常见的 200+ 面试题》的第二个补充模块,第一模块为:《Java 200+ 面试题补充...

王磊的博客
03/08
0
0
Netty5源码分析--4.总结

JAVA NIO 复习 请先参考我之前的博文JAVA学习笔记--3.Network IO的 NIO(NonBlocking IO) SOCKET 章节。这里主要讲下JAVA NIO其中几个比较被忽略的细节,不求全,欢迎补充。 API Select 当调...

geecoodeer
2014/01/17
0
18
【转】Java 200+ 面试题补充② Netty 模块

本文是前文《Java 最常见的 200+ 面试题》的第二个补充模块,第一模块为:《Java 200+ 面试题补充 ThreadLocal 模块》。 1.Netty 是什么? Netty 是一款基于 NIO(Nonblocking I/O,非阻塞I...

Jinlong_Xu
03/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JDBC中The server time zone value '???ú±ê×??±??' is ............. 的错误

在JDBC使用的时候有时候会出现java.sql.SQLException: The server time zone value '???ú±ê×??±??' is unrecognized or represents........的错误. 原因:出现这个的原因是因为 mysql返......

一对二
6分钟前
0
0
HBase基本命令与新版本Java API

简介 有关HBase的安装可以参考hbase安装 我们可以通过hbase shell和hbase数据库进行交互,也可以通过Java-api和hbase数据库交互,这里我们使用的是hbase-client。 主要是介绍2.0重大重构之后...

trayvon
7分钟前
1
0
Quartz原理解析

Quartz原理解析 最近项目中好多地方都需要用到定时器,一开始用的是netty的hashWheel,后来发现删除任务的时候不是很好删除,于是就放弃了,然后选择了Quartz。 hashWheel定时器和Quartz的区...

石日天
今天
2
0
explain详解

EXPLAIN列的解释 table 显示这一行的数据是关于哪张表的 type 这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为 const(读常量,最多只会有一条记录匹配,由于是常量,实际上...

周慕云
今天
1
0
Oracle 修改或新增数据后查不到数据

修改或新增数据后数据库中SQL能查到但执行程序却查不到 因为AutoCommit is OFF 所以 每次新增或修改数据后都要commit 一下,不然只是post edit 的话,执行程序能查到的只是未更新的数据。...

南风末
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部