Netty是一个非阻塞I/O客户端-服务器框架,主要用于开发Java网络应用程序,如协议服务器和客户端。异步事件驱动的网络应用程序框架和工具用于简化网络编程,例如TCPUDP套接字服务器。[2]Netty包括了反应器编程模式的实现。Netty最初由JBoss开发,现在由Netty项目社区开发和维护。

除了作为异步网络应用程序框架,Netty还包括了对HTTPHTTP2DNS及其他协议的支持,涵盖了在Servlet容器内运行的能力、对WebSockets的支持、与Google Protocol Buffers的集成、对SSL/TLS的支持以及对用于SPDY协议和消息压缩的支持。自2004年以来,Netty一直在被积极开发。[3]

从版本4.0.0开始,Netty在支持NIO和阻塞Java套接字的同时,还支持使用NIO.2作为后端。

Netty介绍

Netty是 一个异步 事件驱动的 网络应用程序框架用于快速开发可维护的高性能协议服务器和客户端。

Netty是一个NIO客户端服务器框架,可以快速轻松地开发网络应用程序,例如协议服务器和客户端。它极大地简化和简化了网络编程,例如TCP和UDP套接字服务器。

“快速简便”并不意味着最终的应用程序将遭受可维护性或性能问题的困扰。Netty经过精心设计,结合了许多协议(例如FTP,SMTP,HTTP以及各种基于二进制和文本的旧式协议)的实施经验。结果,Netty成功地找到了一种无需妥协即可轻松实现开发,性能,稳定性和灵活性的方法。

特征

设计

  • 适用于各种传输类型的统一API-阻塞和非阻塞套接字
  • 基于灵活且可扩展的事件模型,可将关注点明确分离
  • 高度可定制的线程模型-单线程,一个或多个线程池,例如SEDA
  • 真正的无连接数据报套接字支持(从3.1开始)

性能

  1. Better throughput, lower latency ( 更好的吞吐量,低延迟)
  2. Less resource consumption ( 资源消耗减少)
  3. Minimized unnecessary memory copy. ( 减少不必要的内存复制 (零拷贝) .)

安全

  • 完整的SSL / TLS和StartTLS支持

netty架构图

请输入图片描述

  • core(核心模块):Extensible Event Model(可扩展的事件模型),Universal Communication API(通用的通讯API),Zero-Copy-Capable Rich Byte Buffer(零拷贝的字节缓冲区)
  • Transport Services(传输服务): Socket & Datagram,HTTp Tunnel,In-Vm Pipe
  • Protocol Support(协议支持): HTTP & WebSocket,SSl.StartTLS,Google Protobuf,zlib/gzip Compression,Large File Transfer,RTSP(和流媒体有关),Legacy Text.Binary Protocols with Unit Testability

异步

传统的MVC编码方式(例如SpringMVC/Springboot):定义自己的controller,实现若干个方法每个方法上指定一个url的映射地址,当用户请求了与之映射的地址并携带了对应的参数,流程就会将请求映射到我们编写的对应的方法上,执行相应代码和逻辑,最后把结果返回给客户端。

Netty与之是有较大差别的,因为他是异步的,比如当我们执行完一个回调或一个处理逻辑之后实际上这个事情完成与否是不确定的,他需要通过一个回调(监听器),实现后续的逻辑判断。

例如:把一个消息以响应的方式发回给用户,这个消息发出去之后流程立刻就返回了,并且往下执行。但是这个消息是否真正的成功发出到达了客户端,其实这是不一定的,他是通过相应的监听器作为一个回调的方式,通过不同的状态来判断消息是真的发出去了还是在处理的过程中发生了异常等等,都是通过监听器的方式来进行进一步的判断。这就是所谓的异步

事件驱动框架

对于netty来说他是实现了很多协议,这个协议都是一个一个阶段构成的

例如:使用WebSocket长连接的方式,让客户端与服务器端持续在一个连接上进行双向的数据通信,实际上就是一个双工的网络通信。对于这种方式来说实际上WebSocket本身是基于http的,首先客户端要发出一个http请求,请求完之后会upgrade(升级到一个WebSocket协议之上)一旦连接建立好之后,客户端与服务器端就可以进行一个双向的数据通信。

在这整个过程当中会发生很多很多事情,这些事情本身就对应一个一个的事件,而netty是将这些事件根据协议的规范将这些事件一个一个的抽取出来形成一个一个的回调方法,使得开发者只需要去处理相关的回调方法就可以了

比如:在连接建立好之后去重写相应的方法实现相应的代码。如果获取到客户端发过来的数据相当于一个read,这个事件一旦发生之后netty就会将流程转向一个特定的读方法,对于开发者来说只需要去复写对应的read就可以了,当数据发来时read方法就会的到调用。连接属于不活跃状态时,连接关闭(不管是服务器还是客户端关闭)时,都会调用相应的回调

实际上就是将一个一个的事件抽取出来,将这些事件映射到一个一个对应的回调方法上面,当这个事件一旦发生之后对应的回到方法就会立刻得到调用,进行执行

SEDA

Staged Event Driven Architecture (阶段性的事件驱动的架构)

主要架构理念就是将一个请求的处理过程分成若干个阶段(Staged),每一个Staged根据自己的情况可以使用不同数量的线程来分别进行处理。而不是将一个请求作为一个整体由几个线程池或几个线程来处理,他是将请求分成了若干个阶段每个阶段可以根据自己的情况可以用不同数量的线程来分别进行处理。阶段与阶段之间是通过事件驱动的异步通讯模式来进行通信的