基于NIO的Netty网络框架(详解)
netty是一个高性能、异步事件驱动的nio框架,它提供了对tcp、udp和文件传输的支持,netty的所有io操作都是异步非阻塞的,通过future-listener机制,用户可以方便的主动获取或者通过通知机制获得io操作结果。
netty的优点有:
a、功能丰富,内置了多种数据编解码功能、支持多种网络协议。
b、高性能,通过与其它主流nio网络框架对比,它的综合性能最佳。
c、可扩展性好,可通过它提供的channelhandler组件对网络通信方面进行灵活扩展。
d、易用性,api使用简单。
e、经过了许多商业应用的考验,在互联网、网络游戏、大数据、电信软件等众多行业得到成功商用。
netty采用了典型的三层网络架构进行设计,逻辑架构图如下:
第一层:reactor通信调度层。该层的主要职责就是监听网络的连接和读写操作,负责将网络层的数据读取到内存缓冲区中,然后触发各种网络事件,例如连接创建、连接激活、读事件、写事件等,将这些事件触发到pipeline中,再由pipeline充当的职责链来进行后续的处理。
第二层:职责链pipeline层。负责事件在职责链中有序的向前(后)传播,同时负责动态的编排职责链。pipeline可以选择监听和处理自己关心的事件。
第三层:业务逻辑处理层,一般可分为两类:a. 纯粹的业务逻辑处理,例如日志、订单处理。b. 应用层协议管理,例如http(s)协议、ftp协议等。
我们都知道影响网络服务通信性能的主要因素有:网络i/o模型、线程(进程)调度模型和数据序列化方式。
在网络i/o模型方面,netty采用基于非阻塞i/o的实现,底层依赖的是jdknio框架的selector。
在线程调度模型方面,netty采用reactor线程模型。常用的reactor线程模型有三种,分别是:
a、reactor单线程模型:reactor单线程模型,指的是所有的i/o操作都在同一个nio线程上面完成。对于一些小容量应用场景,可以使用单线程模型。
b、reactor多线程模型:rector多线程模型与单线程模型最大的区别就是有一组nio线程处理i/o操作。主要用于高并发、大业务量场景。
c、主从reactor多线程模型:主从reactor线程模型的特点是服务端用于接收客户端连接的不再是一个单独的nio线程,而是一个独立的nio线程池。利用主从nio线程模型,可以解决一个服务端监听线程无法有效处理所有客户端连接的性能不足问题。netty线程模型并非固定不变的,它可以支持三种reactor线程模型。
在数据序列化方面,影响序列化性能的主要因素有:
a、序列化后的码流大小(网络带宽占用)。
b、序列化和反序列化操作的性能(cpu资源占用)。
c、并发调用时的性能表现:稳定性、线性增长等。
netty默认提供了对googleprotobuf二进制序列化框架的支持,但通过扩展netty的编解码接口,可以实现其它的高性能序列化框架,例如avro、thrift的压缩二进制编解码框架。
以上这篇基于nio的netty网络框架(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。