Netty使用详解
netty概述
netty是一个高性能的NIO网络通信框架,是对NIO网络模型的封装,提供了一些简单,易用的Api,并且进行了许多优化操作,如零拷贝机制,高性能无所队列,内存池等优化策略。netty支持多种通信协议,如HTTP,webSoket等,并且针对数据通信拆包黏包的一些问题,netty也进行了许多拆包策略。
netty-bio
同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器就需要启动一个线程进行处理,如果这个连接不做任何事情就会进入阻塞等待状态,造成不必要的线程开销。
适用于连接数据小且连接固定的系统架构。
netty-Nio
异步非阻塞,在bio的架构上进行改进,引入channel(通道)、buffer(缓冲区)、selector(选择器)的概念,采用事件驱动的方式,使用单个线程就可以监听多个客户端通道,改进bio模式下线程阻塞等待造成的资源浪费。
为什使用netty
相较于使用jdk传统的NIo模型来说,netty,有以下几点优势
一、统一的API
他支持多种传输模型,如,阻塞,非阻塞,以及poll、epoll等模型
二、简易开发
可以使用少量的代码实现多线程Reactor模型以及主从多线程Reactor模型
三、自带边解码器
自带的边解码器,去解决TCP 黏包/拆包问题
四、自带各种通信协议
netty 支持 协议包括 TCP/ UDP. HTTP/HTTPS,WEBSOCKET,SPDY/HTTP2,MATT\COAP
五、更高的吞吐量
由于netty对JDKNIO进行了优化,它提供了更高的吞吐量,更低的延迟,以及更少的资源消耗和更少的内存复制
六、 安全性
它有完整的SSL/TLS的支持
七、活跃度
他有着良好的社区活跃度,经历了各种大的项目考验,在Dubbo,Zookeeper,RoketMQ中的项目,都有用到Netty
Netty能解决什么
netty能解决服务器承载更多用户访问的问题,netty的本质是和NIO扮演的角色是一样的,都是为了提升服务端的吞吐量,让用户获得更好的体验。
Netty结构以及核心组件作用
网络通信层
Bootstrap
负责客户端启动。并且链接远程的netty Server
ServerBootstrap
负责服务端的监听,用来监听指定的端口
Channer
负责网络通信的载体
事件调度层
eventLoopGroup
本质上是一个线程池,主要负责接受IO请求,并分配线程去处理请求
eventLoop
是一个具体的线程
服务编排层
channelPipeline
负责处理多个channelHandler,将多个channelhandler过程一个链,形成一个Pipeline
channelhandler
针对IO数据的一个数据处理器,数据接受后通过指定的Handler进行处理
channelhandlerContext
用来保存channelhandler的上下文信息
Reactor模型三个组件
reactor
负责将IO事件分配对应的Handel
Acceptor
处理客户端的连接请求
handlers
执行业务逻辑的读写操作
netty的三种Reactor线程模型
一、单线程单Reactor模型
单线程中连接进来都由一个线程处理:如下图所示
缺点:当某一个handler阻塞,会导致后续的客户端请求无法被处理
二、多线程单Reactor模型
请求过来后,由单个Reactor进行分发,多线程池异步进行处理
缺点:所有的Io请求都是由一个handler进行处理,会有性能瓶颈存在,在高并发场景中很可能因为单个reactor的阻塞或性能导致整个的吞吐量收到影响,会导致大量客户端连接超时,客户端会再次进行重试,反而会再次家中线程的负载,导致大量的消息积压和处理的超时
三、主从多线程Reactor模型
在这个模型中 由一个mainReactor惊喜客户端的连接请求,将连接请求传给subreactor ,subreactor可以配置多个 ,就提的IO炒作由subreactor完成绑定给对应的handler。mianreactor的职责没有变化,还是接受客户端的请求,然后再将接收到的请求交给subreactor进行分发
代码实现
引入依赖
服务端代码实现
客户端代码实现
总结
在网络应用编程中netty可以使得服务器可以获得更高的吞吐量,帮助解决网络通信中黏包/拆包问题,支持多种协议开发,以较少的代码实现网络通信开发。