Netty4(一):Netty4 介绍

综合编程 2018-03-08

Netty 概述

  • Netty 是一个高性能 (异步事件驱动)网络通信框架 ,使用它可以快速简单地开发网络应用程序,比如服务器和客户端的协议
  • 随着互联网规模的不断扩大,系统并发访问量也越来越高,传统基于 Tomcat 等 Web 容器的垂直架构已无法满足需求,需要拆分应用进行服务化,以提高和维护效率,垂直架构拆分之后, 系统采用分布式部署,各个节点之间需要远程服务调用,高性能的 RPC 框架必不可少,Netty 作为异步高性能的通信框架,往往作为基础通信组件被这些 RPC 框架调用
  • 有时候一个通用的协议不能满足需求,比如我们无法使用一个通用的 HTTP 服务器来处理大文件、电子邮件以及实时消息,比如金融系统和多人游戏数据, 在这种情况下可以使用 Netty 自己设计一个全新的协议来准确地实现需求
  • Netty 的异步高性能、高可靠性和高成熟的优点,使得它在通信行业得到大量应用,与它类似的框架有 Mina

Netty 应用案例

  • 阿里分布式服务框架 Dubbo 的 RPC 框架,使用 Dubbo 协议进行节点之间的通信,Dubbo 协议默认使用 Netty 作为基础通信组件,用于实现各进程节点之间的通信
  • 淘宝的消息中间件 RocketMQ 消息生产者和消息消费者之间,也采用 Netty 进行高性能、异步通信
  • 除了阿里系和淘宝系之外,很多其它的大型互联网公司或者电商内部也已经大量使用 Netty 构建高性能、分布式的网络服务器
  • 游戏行业:Java 在游戏后台开发得到了越来越广泛的应用,Netty 本身提供了 TCP/UDP 和 HTTP 协议栈,同时也非常方便定制和开发私有协议栈,进行高性能的通信

cf8Ie.md.png

  • 大数据领域:Hadoop 的高性能通信和序列化组件 Avro 的 RPC 框架,默认采用 Netty 进行跨节点通信,大数据计算往往采用多个节点和 1/N 汇总节点进行分布式部署,各个节点之间进行海量数据交换,由于 Netty 的综合性能是目前各个成熟 NIO 框架中最高的,因此往往会被选中用作大数据各个节点间的通信

Netty 与 Tomcat 有什么区别

  • Netty 和 Tomcat 最大的区别在于通信协议,Tomcat 是基于 HTTP 协议的 Web 容器,而 Netty 能通过编程自定义各种协议,能够自己编/解码

Netty 为什么高并发

  • Netty 是基于 NIO(非阻塞 IO) 开发的网络通信框架,对比 BIO(阻塞 IO)它的并发性能得到很大的提高
  • 在 BIO 中,等待客户端发数据这个过程是阻塞的,这样就造成了一个线程只能处理一个请求的情况,而机器能支持的最大线程数是有限的,这就是为什么 BIO 不能支持高并发的原因

阻塞 IO 的通信方式

  • 在 NIO 中,当一个 Socket 建立好之后,Thread 并不会阻塞去接受这个 Socket,而是将这个请求交给 Selector,Selector 会不断的去遍历所有的 Socket,一旦有一个 Socket 建立完成,他会通知 Thread,然后 Thread 处理完数据再返回给客户端(这个过程是阻塞的),这样就能让一个 Thread 处理更多的请求了

非阻塞 IO 的通信方式

其它 IO 模型

  • BIO :同步阻塞IO,如果连接少,他的延迟是最低的,因为一个线程只处理一个连接,适用于少连接且延迟低的场景,比如说数据库连接
  • NIO :同步非阻塞IO,阻塞业务处理但不阻塞数据接收,适用于高并发且处理简单的场景,比如聊天软件
  • 多路复用IO :他的两个步骤处理是分开的,也就是说,一个连接可能他的数据接收是线程 a 完成的,数据处理是线程 b 完成的,他比 BIO 能处理更多请求,但是比不 上NIO,但是他的处理性能又比 BIO 更差,因为一个连接他需要两次 system call,而 BIO 只需要一次,所以这种 IO 模型应用的不多
  • 信号驱动IO :这种 IO 模型主要用在嵌入式开发
  • 异步IO :他的数据请求和数据处理都是异步的,数据请求一次返回一次,适用于长连接的业务场景

Netty 为何传输快

  • Java 内存有堆内存、栈内存和字符串常量池等,其中堆内存是占用内存空间最大的一块,也是 Java 对象存放的地方,一般我们的数据如果要从 IO 读取到堆内存,中间需要经过 Socket 缓冲区,也就是一个数据会被拷贝两次才能到达它的终点,如果数据量大,就会造成不必要的资源浪费

传输数据拷贝

  • Netty 针对这种情况使用了 NIO 的另一特性 ---- 零拷贝 ,当它需要接收数据时,它会在堆内存之外开辟一块内存,数据直接从 IO 读到那块内存中去,从而加快了传输速度

零拷贝

简书

责编内容by:简书 (源链)。感谢您的支持!

您可能感兴趣的

Netty4(二):概念速览 ---- 改篇文章还处于完善中,仅供参考 ---- Channel 底层网络传输总是使用 Socket( 一个 C...
MQTT—HiveMQ源码详解(十)Netty-Statistics HiveMQ中的内置的统计非常之多,多到可怕,几乎你能想到的统计hivemq都已经帮你想全了;同时第三方plugin还可以定义属于自己的统计。 它的实现采用...
Netty4(十一):实现心跳机制 案例代码下载 Netty 超时机制介绍 Netty 为超时机制提供了几个...
使用Netty构建一个带注解的Http服务器框架... 一个SpringBoot框架搭建起来的项目发布接口服务是这样的 SpringBoot搭建教程点击这里 @Controller @Request...
socket框架netty-socket android客户端方式,内含心跳重连等... 之前自己写了socket建立的连接,但是涉及到一些需要完善的地方,表示自己有点懒。然后就在网上找了一个socket框架, 拿来直接用。 ...