Netty 理论详解

Netty 简介

  • Netty 是 JBoss 公司用 Java 写的一个 Jar 包(库),目的是快速开发高性能、高可靠性的网络服务器和客户端程序
  • Netty 提供异步、无阻塞、事件驱动的网络应用程序框架和工具
  • Netty 是目前公认的网络编程最好的框架,官网地址:http://netty.io/
  • GitHub 托管地址:https://github.com/netty/netty
  • Netty 底层封装的也是 Java NIO,所以也叫NIO框架,常用于开发分布式系统

Netty is an asynchronous event-driven network application framework
for rapid development of maintainable high performance protocol servers & clients.

Netty is a NIO client server framework which enables quick and easy development of network applications such as protocol servers and clients. It greatly simplifies and streamlines network programming such as TCP and UDP socket server.

'Quick and easy' doesn't mean that a resulting application will suffer from a maintainability or a performance issue. Netty has been designed carefully with the experiences earned from the implementation of a lot of protocols such as FTP, SMTP, HTTP, and various binary and text-based legacy protocols. As a result, Netty has succeeded to find a way to achieve ease of development, performance, stability, and flexibility without a compromise.

Netty Features( 特色)

Design( 设计)

  • 统一的 API,适用于不同的协议(阻塞和非阻塞)
  • 基于灵活、可扩展的事件驱动模型
  • 高度可定制的线程模型,单线程、多线程池
  • 可靠的无连接数据Socket支持(UDP)
  • Unified API for various transport types - blocking and non-blocking socket
  • Based on a flexible and extensible event model which allows clear separation of concerns
  • Highly customizable thread model - single thread, one or more thread pools such as SEDA
  • True connectionless datagram socket support (since 3.1)

Ease of use( 易用性)

Well-documented Javadoc, user guide and examples

No additional dependencies, JDK 5 (Netty 3.x) or 6 (Netty 4.x) is enough

Note: Some components such as HTTP/2 might have more requirements. Please refer to the Requirements page for more information.

  • 最早 Java 网络编程:使用 java.net + java.io,熟悉的 Socket API 就是在 java.net 包中。
  • 从 JDK 1.4 开始,Java 网络编程可以使用性能更好的:java.nio
  • 目前 Java 网络编程通常使用成熟的框架,如:Netty 、Mina,Grizzly

Performance( 性能)

  • 更好的吞吐量,低延迟 (Better throughput, lower latency)
  • 更省资源 (Less resource consumption)
  • 尽量减少不必要的内存拷贝 (Minimized unnecessary memory copy)
  • 不再因过快、过慢或超负载连接导致 OutOfMemoryError
  • 不再有在高速网络环境下 NIO 读写频率不一致的问题

Security( 安全)

  • 完整的 SSL/TLS 和 STARTTLS 的支持 (Complete SSL/TLS and StartTLS support)
  • 能在 Applet 与 Android 的限制环境运行良好

Netty VS Mina

  • JBOOS 的 Netty 与 Apache 的 Mima 都是目前 Java 网络编程主流的框架之一。
  • Mina 将内核和一些特性的联系过于紧密,使得用户在不需要这些特性的时候无法脱离,相比之下性能会有所下降,而 Netty解决了这个设计问题
  • Netty 的文档更清晰,很多 Mina 的特性在 Netty 里都有
  • Netty 更新周期更短,新版本的发布比较快
  • 两者架构差别不大,Mina 靠 apache生存,而 Netty 靠 jboss,和 jboss 的结合度非常高,Netty 有对 google protocal buf 的支持,有更完整的 ioc 容器支持( spring,guice,jbossmc 和 osgi);
  • Netty 比 Mina 使用起来更简单,Netty 中可以自定义的处理 upstream events 和 downstream events,可以使用 decoder 和encoder 来解码和编码发送内容
  • Netty 和 Mina 在处理 UDP 时有一些不同,Netty 将 UDP 无连接的特性暴露出来;而 Mina 对 UDP 进行了高级层次的抽象,可以把 UDP 当成"面向连接"的协议,而要 Netty 做到这一点比较困难。

应用领域

·互联网行业·

  • 随着网站规模的不断扩大,系统并发访问量也越来越高,传统基于 Tomcat 等 Web 容器的垂直架构已经无法满足需求,需要拆分应用进行服务化,以提高开发和维护效率。从组网情况看,垂直的架构拆分之后,系统采用分布式部署,各个节点之间需要远程服务调用,高性能的 RPC(Remote Procedure Call Protocol-远程过程调用协议) 框架必不可少,Netty 作为异步高性能的通信框架,往往作为基础通信组件被这些 RPC 框架使用。
  • 典型的应用有:阿里分布式服务框架 Dubbo 的 RPC 框架使用 Dubbo 协议进行节点间通信,Dubbo 协议默认使用 Netty 作为基础通信组件,用于实现各进程节点之间的内部通信,它的架构图如下:

  • 其中,服务提供者和服务消费者之间,服务提供者、服务消费者和性能统计节点之间使用 Netty 进行异步/同步通信。
  • 除了 Dubbo 之外,淘宝的消息中间件 RocketMQ 的消息生产者和消息消费者之间,也采用 Netty 进行高性能、异步通信。
  • 除了阿里系和淘宝系之外,很多其它的大型互联网公司或者电商内部也已经大量使用 Netty 构建高性能、分布式的网络服务器。

·游戏行业·

  • 无论是手游服务端、还是大型的网络游戏,Java 语言得到了越来越广泛的应用。Netty 作为高性能的基础通信组件,它本身提供了 TCP/UDP 和 HTTP 协议栈,非常方便定制和开发私有协议栈
  • 账号登陆服务器、地图服务器之间可以方便的通过 Netty 进行高性能的通信,架构示意图如下:
     

·大数据领域·

  • 经典的 Hadoop 的高性能通信和序列化组件 Avro 的 RPC 框架,默认采用 Netty 进行跨节点通信,它的 Netty Service 基于 Netty 框架二次封装实现
  • 大数据计算往往采用多个计算节点和一个/N个汇总节点进行分布式部署,各节点之间存在海量的数据交换。由于 Netty 的综合性能是目前各个成熟 NIO 框架中最高的,因此,往往会被选中用作大数据各节点间的通信。

·通信行业·

  • Netty 的异步高性能、高可靠性和高成熟度的优点,使它在通信行业得到了大量的应用。

自学建议

······下一篇《 Netty 入门示例详解

猜你喜欢

转载自blog.csdn.net/wangmx1993328/article/details/83035760