netty介绍
netty是一个高性能、事件驱动、异步非阻塞的 IO java 开源框架,由Jboss提供,建立tcp等底层连接。基于netty可以建立高性能的http服务器,快速开发,高性能高可靠的网络服务器和客户端程序,支持http、websocket、tcp、udp等。很多高性能的项目,把他作为socket底层的通信基础。
netty是基于nio的客户服务端、服务端编程框架。使用netty可以快速的开发出简单的一个网络应用,netty相当简化的和流线化了网络应用的开发过程
稳定性和伸缩性
使用场景
1、广泛的应用于高性能领域,netty作为一个高性能的NIO框架,比如说游戏,大数据分布式计算领域得到广泛应用
2、多线程并发领域
3、异步通信领域
IO通信
网络通信在编程世界中是必不可少的一部分,到目前为止网络通信主要经历了三个阶段BIO,NIO,AIO。
Java IO实现方式
1)、同步,阻塞IO——BIO-(JDK1.4以前)
2)、IO事件轮询,多路复用技术(select)——NIO-(JDK1.4—1.6)
3)、异步非阻塞IO——AIO-(JDK1.7以及以后)
BIO通信
采用BIO通信模型的服务端,通常都会使用一个Acceptor线程负责监听客户端的连接!接收到客户端的连接请求之后,为每一个客户端创建一个新的线程进行链路处理,处理完成之后,通过输出流返回应答给客户端!线程销毁!典型的一请求一应答的通信模型!
缺点:缺乏弹性伸缩能力;当客户端并发访问量增加以后,服务端的 线称个数,和访问数呈1:1的正比关系,但是线称是java非常宝贵的系统资源,线程数量膨胀之后将十分影响系统性能,随着访问量的持续增加,将会导致系统的线称堆栈溢出,创建新线程失败等问题。导致线称宕机,不能对外提供服务
伪异步IO通信
当有新的客户端通信接入时候,客户端的socket封装成一个task到后端的线程池中处理
当有M个客户端接入,会创建具有N个线称的线程池对客户端的请求进行处理
线程池可以设置线程池大小和最大线程数,那么他占用的资源是可控制的
缺点:当有大量的客户端接入时候,随着并发访问量的不断增加,伪异步IO可能会导致线程池阻塞
NIO通信
分布式rpc框架有很多,比如dubbo,netty,还有很多其他的产品。但他们大部分都是基于nio的
nio是非阻塞的io,那么它的内部机制是怎么实现的呢。
1.由一个专门的线程处理所有IO事件,并负责分发。
2.事件驱动机制,事件到来的时候触发操作,不需要阻塞的监视事件。
3.线程之前通过wait,notify通信,减少线程切换。
4.所有数据都是通过缓冲区处理的,任何时候访问NIO数据都是通过缓冲区操作
AIO通信
连接注册读写事件和回调函数
读写