没有合适的资源?快使用搜索试试~ 我知道了~
本文来自于csdn,本文主要介绍了关于Netty的原理架构解析,介绍的NettyReactor模型以及服务端Netty的工作架构,希望对您的学习有所帮助。Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。JDK原生也有一套网络应用程序API,NIO,但是存在一些问题使得用起来不是很方便,主要如下:NIO的类库和API繁杂,使用麻烦。使用时需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等需要具备其他的额外技能做铺垫。例如熟悉Java多线程编程,因为NIO编程涉及到Reactor模式
资源推荐
资源详情
资源评论
Netty原理架构解析原理架构解析
Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。JDK原生也有一套网络
应用程序API,NIO,但是存在一些问题使得用起来不是很方便,主要如下:
NIO的类库和API繁杂,使用麻烦。使用时需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等
需要具备其他的额外技能做铺垫。例如熟悉Java多线程编程,因为NIO编程涉及到Reactor模式,你必须对多线程和网络编程
非常熟悉,才能编写出高质量的NIO程序
可靠性能力补齐,开发工作量和难度都非常大。例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常
码流的处理等等。NIO编程的特点是功能开发相对容易,但是可靠性能力补齐工作量和难度都非常大
JDK NIO的Bug。例如臭名昭著的Epoll Bug,它会导致Selector空轮询,最终导致CPU 100%。官方声称在JDK 1.6版本的
update 18修复了该问题,但是直到JDK1.7版本该问题仍旧存在,只不过该Bug发生概率降低了一些而已,它并没有被根本解
决
Netty对JDK自带的NIO的API进行封装,解决上述问题,主要特点有:
设计优雅,适用于各种传输类型的统一API阻塞和非阻塞Socket;基于灵活且可扩展的事件模型,可以清晰地分析关注点;高
度可定制的线程模型-单线程,一个或多个线程池;真正的无连接数据报套接字支持
使用方便,详细记录的Javadoc,用户指南和示例;没有其他依赖项,JDK5(Netty3.x)或6 (Netty4.x) 就足够了
高性能,吞吐量更高,延迟更低;减少资源消耗;最小化不必要的内存复制
安全,完整的SSL/TLS和StartTLS支持
社区活跃,不断更新,社区活跃,版本迭代周期短,发现的Bug可以被及时修复,同时,更多的新功能会被加入
Netty常见的使用场景如下:
互联网行业。在分布式系统中,各个节点之间需要远程服务调用,高性能的RPC框架必不可少,Netty作为异步高性能的通信
框架,往往作为基础通信组件被这些RPC框架使用。典型的应用有:阿里分布式服务框架Dubbo的RPC框架使用Dubbo协议
进行节点间通信,Dubbo协议默认使用Netty作为基础通信组件,用于实现各进程节点之间的内部通信
游戏行业。无论是手游服务端还是大型的网络游戏,Java语言得到了越来越广泛的应用。Netty作为高性能的基础通信组件,
它本身提供了TCP/UDP和HTTP协议栈。非常方便定制和开发私有协议栈,账号登录服务器,地图服务器之间可以方便的通过
Netty进行高性能的通信
大数据领域。经典的Hadoop的高性能通信和序列化组件Avro的RPC框架,默认采用Netty进行跨节点通信,它的Netty Service
基于Netty框架二次封装实现
Netty自以为异步事件驱动的网络,高性能之处主要来自于其I/O模型和线程处理模型,前者决定如何收发数据,后者决定如何
处理数据
阻塞I/O
传统阻塞I/O(BIO)的特点是:
每个请求都需要独立的线程完成数据read,业务处理,数据write的完整操作问题
当并发数较大时,需要创建大量线程来处理连接,系统资源占用较大
连接建立后,如果当前线程暂时没有数据可读,则线程就阻塞在read上,造成线程资源浪费
I/O复用模型
在I/O复用模型中,会用到select,这个函数也会使进程阻塞,但是和阻塞I/O所不同的是这个函数可以在一个线程中同时阻塞
多个I/O操作,而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O函数。
Netty的非阻塞I/O的实现关键是基于I/O复用模型,这里用selector对象表示。
Netty的IO线程NioEventLoop由于聚合了多路复用器Selector,可以同时并发处理成百上千个客户端连接。
当线程从某客户端Socket通道进行读写数据时,若没有数据可用时,该线程可以进行其他任务
线程通常将非阻塞IO的空闲时间用于在其他通道上执行IO操作,所以单独的线程可以管理多个输入和输出通道
由于读写操作都是非阻塞的,这就可以充分提升IO线程的运行效率,避免由于频繁IO阻塞导致的线程挂起
一个I/O线程可以并发处理N个客户端连接和读写操作,这从根本上解决了传统同步阻塞I/O-连接-线程模型,架构的性能、弹
性伸缩能力和可靠性都得到了极大的提升
基于Buffer
传统的IO是面向字节流活字符流的,以流式的方式顺序地从一个stream中读取一个或多个字节,因此也就不能随意改变读取
指针的位置
在NIO中,抛弃了传统的IO流,,而是引入了Channel和Buffer的概念。在NIO中,只能从channel中读取数据到Buffer中或将
数据从Buffer中写入到channel中
基于Buffer操作不像传统IO的顺序操作,NIO中可以随意地读取任意位置的数据
事件驱动模型
通常,我们设计一个事件处理模型的程序有两种思路:
轮询方式,线程不断轮询访问相关事件发生源有没有发生事件,有发生事件就调用事件处理逻辑
事件驱动方式,发生事件,主线程吧事件放入事件队列,在另外线程不断循环消费事件列表中的事件,调用事件对应的处理逻
辑处理事件。事件驱动方式也被成为消息通知方式,其实是设计模式中的观察者模式的思路
主要包括4个组件:
事件队列:接收事件的入口,存储待处理事件
分发器:将不同的事件分发到不同的业务逻辑单元
事件通道:分发器与处理器之间的联系渠道
事件处理器:实现业务逻辑,处理完成后会发出事件,触发下一步操作
可以看出,相对传统轮询模式,事件驱动有如下优点:
可扩展性好,分布式的异步架构,事件处理器之间高度解耦,可以方便扩展事件处理逻辑
高性能,基于队列暂存事件,能方便并行异步处理事件
Reactor线程模型
剩余8页未读,继续阅读
资源评论
weixin_38747946
- 粉丝: 9
- 资源: 942
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功