基于NIO的Netty网络框架(详解)

 更新时间:2017年06月09日 08:31:13   投稿:jingxian  
下面小编就为大家带来一篇基于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网络框架(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java编程接口调用的作用及代码分享

    Java编程接口调用的作用及代码分享

    这篇文章主要介绍了Java编程接口调用的作用及代码分享,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • springboot使用redis对单个对象进行自动缓存更新删除的实现

    springboot使用redis对单个对象进行自动缓存更新删除的实现

    本文主要介绍了springboot使用redis对单个对象进行自动缓存更新删除的实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Java线程池的四种拒绝策略详解

    Java线程池的四种拒绝策略详解

    jdk1.5 版本新增了JUC并发编程包,极大的简化了传统的多线程开发,下面这篇文章主要介绍了Java线程池的四种拒绝策略的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • Maven profile实现不同环境的配置管理实践

    Maven profile实现不同环境的配置管理实践

    这篇文章主要介绍了Maven profile实现不同环境的配置管理实践,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • java实现多线程交替打印

    java实现多线程交替打印

    这篇文章主要为大家详细介绍了java实现多线程交替打印,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • 一文带你学会Spring JDBC的使用

    一文带你学会Spring JDBC的使用

    JDBC 就是 数据库开发 操作的 代名词,因为只要是现代商业项目的开发那么一定是离不开 数据库 的,不管你搞的是什么,只要是想使用动态的开发结构,那么一定就是 JDBC ,那么下面来教教大家传统JDBC的使用
    2022-09-09
  • Java GZip 基于内存实现压缩和解压的方法

    Java GZip 基于内存实现压缩和解压的方法

    这篇文章主要介绍了Java GZip 基于内存实现压缩和解压的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 浅谈JAVA 类加载器

    浅谈JAVA 类加载器

    这篇文章主要介绍了JAVA 类加载器的的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • SpringBoot与SpringMVC第一讲

    SpringBoot与SpringMVC第一讲

    SpringMVC全名应该叫做SpringWebMVC,它其实是基于servlet来构建的一个原始web框架从一开始就包含在了spring框架中,下面通过实例代码给大家介绍SpringBoot与SpringMVC的相关知识,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • 程序包org.springframework.boot不存在的问题解决

    程序包org.springframework.boot不存在的问题解决

    本文主要介绍了程序包org.springframework.boot不存在的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-09-09

最新评论