简介

  • Netty 是由JBOSS提供的一个 Java开源框架, 现在是 Github上的开源项目
  • Netty 是一个异步的、基于事件驱动的网络应用框架式, 用以快速开发高性能、高可靠性的网路IO程序
  • Netty主要针对在TCP协议下, 面向客户端的高并发应用, 或者 Peer to Peer(对等的) 场景下的大量数据持续传输的应用。
  • Netty的本质就是对NIO(None Blocked IO) 的一种封装。

应用场景

  • 互联网行业:

    • 在分布式系统中, 各个节点之间需要远程服务调用, 高性能的RPC框架必不可少, Netty作为异步高性能的通信框架, 往往作为基础通信组件被这些RPC框架使用。
  • 典型应用:

    • 阿里分布式服务框架 Dubbo 的 RPC 框架使用 Dubbo 协议进行节点间通信(默认使用Netty, 可改为mina, grizzy).
  • 大数据领域

    • Hadoop 的高性能通信和序列化组件(AVRO 实现数据文件共享) 的 RPC 框架, 默认采用Netty进行跨节点通信
    • 常用的 Netty Service 其实是 Netty 框架二次封装。
    • Spark1.6及其之后的版本, 之前使用的是akka, 1.6实验性的引入netty, akka在2.0版本移除, 只使用netty(其实akka底层还是用了netty...)。
    • Kafka 零拷贝技术(其实本质上是省去了操作系统由内核态且换到用户态的过程)

I/O 模型

  • 用什么样的channel(通道)进行数据的发送和接收, 很大程度上决定了通信的性能。

  • Java共支持3种网络编程模型/IO模式: BIO(Blocked IO)、NIO(None Blocked IO)、AIO(Asynchronized IO)

  • BIO: 同步且阻塞(传统阻塞型), 服务器实现模式为一个连接一个线程, 即客户端有连接请求时服务器就需要启动一个线程进行处理, 如果该连接不做任何事情就会造成不必要的线程开销

  • NIO: 同步非阻塞, 服务器实现模式为一个线程处理多个请求(连接), 即客户端发送的连接请求都会注册到多路复用器上, 多路复用轮询到连接有I/O请求就进行处理

    Netty简单认识-LMLPHP

  • AIO: 异步非阻塞, AIO 引入异步channel(通道)的概念, 采用了Proactor模式, 简化了程序编写, 有效的请求才启动线程, 它的特点是先由操作系统完成后才通知服务端程序启动线程去处理, 一般适用于连接数较多且连接时间较长的应用。

    • 但是Linux系统并没有提供对AIO的优化, 导致其在Linux上的运行性能不高, 目前用的不多。
  • 适用场景分析

    • BIO方式适用于连接数目比较小且固定的架构, 这种方式对服务器资源要求比较高, 并发局限于应用中, jdk1.4以前的唯一选择, 但程序简单易理解。
    • NIO方式适用于连接数目多且连接比较端的(轻操作) 的架构, 如聊天服务器, 弹幕系统, 服务器间通讯等。编程比较复杂, JDK1.4开始支持
    • AIO方式适用于连接数组多且连接比较长(重操作)的架构, 比如相册服务器, 充分调用OS参与并发操作, 编程比较复杂, JDK7开始支持
05-26 13:49