本文连接:https://blog.csdn.net/king866/article/details/54427447
Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,做为一个异步NIO框架,Netty的全部IO操做都是异步非阻塞的,经过Future-Listener机制,用户能够方便的主动获取或者经过通知机制得到IO操做结果。
做为当前最流行的NIO框架,Netty在互联网领域、大数据分布式计算领域、游戏行业、通讯行业等得到了普遍的应用,一些业界著名的开源组件也基于Netty的NIO框架构建react
传统通讯采用了同步阻塞IO,当客户端的并发压力或者网络时延增大以后,同步阻塞IO会因为频繁的wait致使IO线程常常性的阻塞,因为线程没法高效的工做,IO处理能力天然降低。编程
咱们经过BIO通讯模型图看下BIO通讯的弊端安全
采用BIO通讯模型的服务端,一般由一个独立的Acceptor线程负责监听客户端的链接,接收到客户端链接以后为客户端链接建立一个新的线程处理请求消息,处理完成以后,返回应答消息给客户端,线程销毁,这就是典型的一请求一应答模型。
该架构最大的问题就是不具有弹性伸缩能力,当并发访问量增长后,服务端的线程个数和并发访问数成线性正比,因为线程是JAVA虚拟机很是宝贵的系统资源,当线程数膨胀以后,系统的性能急剧降低,随着并发量的继续增长,可能会发生句柄溢出、线程堆栈溢出等问题,并致使服务器最终宕机。性能优化
Netty基于NIO,实现了对NIO的封装及优化,从而Netty的通讯模式为异步非阻塞通讯服务器
在IO编程过程当中,当须要同时处理多个客户端接入请求时,能够利用多线程或者IO多路复用技术进行处理。IO多路复用技术经过把多个IO的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的状况下能够同时处理多个客户端请求。与传统的多线程/多进程模型比,I/O多路复用的最大优点是系统开销小,系统不须要建立新的额外进程或者线程,也不须要维护这些进程和线程的运行,下降了系统的维护工做量,节省了系统资源。网络
JDK1.4提供了对非阻塞IO(NIO)的支持,JDK1.6版本使用epoll替代了传统的select/poll,极大的提高了NIO通讯的性能多线程
Netty架构按照Reactor模式设计和实现,它的服务端通讯序列图以下架构
Netty的IO线程NioEventLoop因为聚合了多路复用器Selector,能够同时并发处理成百上千个客户端Channel,因为读写操做都是非阻塞的,这就能够充分提高IO线程的运行效率,避免因为频繁IO阻塞致使的线程挂起。另外,因为Netty采用了异步通讯模式,一个IO线程能够并发处理N个客户端链接和读写操做,这从根本上解决了传统同步阻塞IO一链接一线程模型,架构的性能、弹性伸缩能力和可靠性都获得了极大的提高。并发
何为Reactor线程模型?框架
Reactor模式是事件驱动的,有一个或多个并发输入源,有一个Service Handler,有多个Request Handlers;这个Service Handler会同步的将输入的请求(Event)多路复用的分发给相应的Request Handler
从结构上,这有点相似生产者消费者模式,即有一个或多个生产者将事件放入一个Queue中,而一个或多个消费者主动的从这个Queue中Poll事件来处理;而Reactor模式则并无Queue来作缓冲,每当一个Event输入到Service Handler以后,该Service Handler会马上的根据不一样的Event类型将其分发给对应的Request Handler来处理。
这个作的好处有不少,首先咱们能够将处理event的Request handler实现一个单独的线程,即
这样Service Handler 和request Handler实现了异步,加快了service Handler处理event的速度,那么每个request一样也能够以多线程的形式来处理本身的event,即Thread1 扩展成Thread pool 1,
Netty的Reactor线程模型1 Reactor单线程模型 Reactor机制中保证每次读写能非阻塞读写
一个线程(单线程)来处理CONNECT事件(Acceptor),一个线程池(多线程)来处理read,一个线程池(多线程)来处理write,那么从Reactor Thread到handler都是异步的,从而IO操做也多线程化。
到这里跟BIO对比已经提高了很大的性能,可是还能够继续提高,因为Reactor Thread依然为单线程,从性能上考虑依然有所限制
2 Reactor多线程模型
、
这样经过Reactor Thread Pool来提升event的分发能力
3 Reactor主从模型
Netty的高效并发编程主要体如今以下几点:
1) volatile的大量、正确使用;
2) CAS和原子类的普遍使用;
3) 线程安全容器的使用;
4) 经过读写锁提高并发性能。
Netty除了使用reactor来提高性能,固然还有
一、零拷贝,IO性能优化
二、通讯上的粘包拆包
二、同步的设计
三、高性能的序列 ———————————————— 版权声明:本文为CSDN博主「zecoo」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接及本声明。 原文连接:https://blog.csdn.net/king866/article/details/54427447