文档章节

Netty(二)

不死的达芬奇
 不死的达芬奇
发布于 2016/12/07 20:06
字数 1095
阅读 157
收藏 4

一、先讲下NIO编程。NIO(Non-block I/O),亦叫做非阻塞I/O

与Socket类和ServerSocket类相对应,NIO也提供了SocketChannel和ServerSocketChannel两种不同的套接字通道实现。

1  缓冲区Buffer

这里首先介绍缓冲区的概念,NIO和原I/O的一个重要区别就是NIO库中,所有数据都是用缓冲区处理的。

缓冲区实质上是一个数组。通常它是一个字节数组(ByteBuffer),也可以使用其他种类的数组。

最常用的缓冲区是ByteBuffer,提供了一组功能用于操作byte数组。

2  通道Channel

通道和流的不同之处在于通道是双向的,流只是一个方向上移动。可以用于读、写或者两者同时进行。

下面看下Channel的类图继承关系

可以看出实际上Channel可以分为两大类:用于网络读写的SelectableChannel和用于文件操作的FileChannel。

3  多路复用器Selector

简单来讲,Selector会不断地轮询注册在其上的Channel,如果某个Channel上面发生读或者写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取就绪Channel的集合,进行后续的I/O操作。

NIO服务端序列图

NIO客户端序列图

现总结NIO编程的优点,如下:

(1)客户端发起的连接操作是异步的,可以通过在多路复用器注册OP_CONNECT等待后续结果,不需要像之前的客户端那样被同步阻塞。

(2)SocketChannel的读写操作都是异步的,如果没有可读写的数据它不会同步等待,直接返回,这样I/O通信线程就可以处理其他的链路,不需要同步等待这个链路可用。

(3)一个Selector线程可以同时处理成千上万个客户端连接,而且性能不会随着客户端的增加而线性下降。非常适合做高性能、高负载的网络服务器。

虽然,NIO有众多优势,但是不意味着所有的Java网络编程都必须要选择NIO和Netty,具体选择什么样的I/O模型或者NIO框架,完全基于业务的实际应用场景和性能诉求,如果客户端并发连接数不多,周边对接的网元不多,服务器的负载也不重,那就完全没必要选择NIO做服务端;如果是相反情况,那就要考虑选择合适的NIO框架进行开发。

二、选择Netty的理由

作为一个NIO服务端,需要能够处理网络的闪断、客户端的重复接入、客户端的安全认证、消息的编解码、半包读写等情况,如果没有足够的NIO编程经验,一个NIO框架的稳定往往需要半年甚至更长的时间。

更为糟糕的是,一旦在生产环境中发生问题,往往会导致跨节点的服务调用中断,严重的可能会导致整个集群环境都不可用,需要重启服务器,这种非常停机会带来巨大的损失。

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

使用NIO框架Netty来进行NIO编程,它既可以作为客户端也可以作为服务端,同时支持UDP和异步文件传输,功能非常强大。

三、为什么选择Netty

Netty的优点总结如下:

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

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

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

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

5  成熟稳定

6  社区活跃,版本迭代周期短,发现的Bug可以及时修复

© 著作权归作者所有

共有 人打赏支持
上一篇: Netty(三)
下一篇: Netty(一)
不死的达芬奇
粉丝 37
博文 43
码字总数 42018
作品 0
朝阳
后端工程师
私信 提问
源码之下无秘密 ── 做最好的 Netty 源码分析教程

背景 在工作中, 虽然我经常使用到 Netty 库, 但是很多时候对 Netty 的一些概念还是处于知其然, 不知其所以然的状态, 因此就萌生了学习 Netty 源码的想法. 刚开始看源码的时候, 自然是比较痛苦...

永顺
2017/11/29
0
0
Netty解决TCP的粘包和分包(二)

Netty解决TCP的粘包和分包(二) 使用LengthFieldBasedFrameDecoder解码器分包 先看一下这个类的的属性, private final ByteOrder byteOrder; //private final int maxFrameLength; //定义最...

秋风醉了
2015/07/31
0
0
netty和jetty

一、网络通信框架和web容器的区别 网络通信框架:netty、mina、grizzly web容器:tomcat、jetty web服务器:apache、nginx 二、概念区别 Netty针对Socket,Jetty针对Servlet 三、应用范围上:...

carmen-ly
2016/08/12
75
2
网络编程懒人入门(五):快速理解为什么说UDP有时比TCP更有优势

本文观点仅作参考,请根据自已系统的应用场景合理地选择数据传输层协议即可,无需盲目崇拜大牛言论。 1、前言 对于即时通讯开者新手来说,在开始着手编写IM或消息推送系统的代码前,最头疼的...

JackJiang2011
2017/12/19
0
0
Netty源码:从一个简单Demo开始

最近在看闪电侠的《Netty深入剖析》,记录总结。 一.Netty简单示例 首先先看一个简单的HelloWord:Server.java 和 ServerHandler.java Server.java 启动Server,运行结果如下: 二.Netty是对...

Jacktanger
2018/07/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

python实现下载网络图片

项目需求: 有时候我们做爬虫的时候,需要把爬取到的图片资源保存到我们本地,以防爬取的图片链接被原来资源主人变更,所以就需要把好不容易拿到的资源永久变为自己的,就需要把图片链接下载到我们...

银装素裹
23分钟前
1
0
米利型和摩尔型状态机

1. 经典状态机 x(t)为当前输入 z(t)为当前输出 组合逻辑电路输出s(t+1)为次态 状态寄存器(也就是一组触发器)输出s(t)为现态 2. 米利状态机(Mealy) 组合逻辑C1模块有两个输入端:当前输入x(t...

易冥天
25分钟前
3
0
Kafka是如何解决常见的微服务通信问题的

微服务自成立以来就以不同的方式相互沟通。有些人更喜欢使用HTTP REST API,但这些API有自己的排队问题,而有些则更喜欢较旧的消息队列,比如RabbitMQ,它们带有扩展和操作方面的问题。 以K...

java菜分享
29分钟前
0
0
关于php的xdebug配置(编辑器vscode)

虽然说echo和print_r是公认的最实用的调试工具,但是效率真的没有可视化的直接断点那么高。这里简单介绍如果安装及配置xdebug for vscode 一、PHP环境处的配置 1、编译安装 下载及编译php,因...

元谷
43分钟前
7
0
heartbeat

http://www.linux-ha.org/doc/users-guide/_building_and_installing_heartbeat_from_source.html kaer@linux-sqlf:~/Reusable-Cluster-Components-glue--0a7add1d9996> ./configure --enabl......

李有常
53分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部