Netty,认识和深入
Netty 的介绍
Netty
,百度百科地址:点击跳转
Netty
,官网地址地址:点击跳转
Netty
, 是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端。
Netty
,是由JBOSS
提供的一个JAVA开源框架,现为GIthub
项目;
Netty
,是一个异步的,基于事件驱动的网络应用框架,用以快速开发高性能,高可靠性的网络IO程序;
Netty
,主要针对在TCP
协议下,面向Clients
端的高并发应用,或者Peer-to-Peer
场景下的大量数据持续传输的应用;
Netty
,本质是一个NIO
框架,适用于服务器通讯相关的多种应用场景;
Netty,结构构成大致如下:
什么是事件驱动?
百度百科地址:点击跳转
事件驱动是指在持续事务管理过程中,进行决策的一种策略,即跟随当前时间点上出现的事件,调动可用资源,执行相关任务,使不断出现的问题得以解决,防止事务堆积。在计算机编程、公共关系、经济活动等领域均有应用。
简单地说就是你点什么按钮(即产生什么事件),电脑执行什么操作(即调用什么函数). 当然事件不仅限于用户的操作。事件驱动的核心自然是事件。从事件角度说,事件驱动程序的基本结构是由一个事件收集器、一个事件发送器和一个事件处理器组成。事件收集器专门负责收集所有事件,包括来自用户的(如鼠标、键盘事件等)、来自硬件的(如时钟事件等)和来自软件的(如操作系统、应用程序本身等)。事件发送器负责将收集器收集到的事件分发到目标对象中。事件处理器做具体的事件响应工作,它往往要到实现阶段才完全确定,因而需要运用虚函数机制(函数名往往取为类似于
HandleMsg
的一个名字)。对于框架的使用者来说,他们能够看到的是事件处理器。这也是他们所关心的内容
Netty 能做什么
有了 Netty,你可以实现自己的
HTTP
服务器,FTP
服务器,UDP
服务器,RPC
服务器,WebSocket
服务器,Redis
的Proxy
服务器,MySQL
的Proxy
服务器等等。如果你想知道Nginx
是怎么写出来的,如果你想知道 Tomcat 和 Jetty 是如何实现的,如果你也想实现一个简单的Redis
服务器,它们高性能的原理都是类似的。
传统的 HTTP 服务器的原理。
-
创建一个
ServerSocket
,监听并绑定一个端口; -
一系列客户端来请求这个端口;
-
服务器使用
Accept
,获得一个来自客户端的Socket
连接对象 -
启动一个新线程处理连接
- 读 Socket,得到字节流
- 解码协议,得到
Http
请求对象 - 处理
Http
请求,得到一个结果,封装成一个HttpResponse
对象 - 编码协议,将结果序列化字节流
- 写
Socket
,将字节流发给客户端
-
继续循环步骤 3
HTTP 服务器之所以称为 HTTP 服务器,是因为编码解码协议是 HTTP 协议,如果协议是 Redis
协议,那它就成了 Redis
服务器,如果协议是WebSocket
,那它就成了 WebSocket
服务器,等等。
使用 Netty 你就可以定制编解码协议,实现自己的特定协议的服务器。
上面我们说的是一个传统的多线程服务器,这个也是 Apache
处理请求的模式。在高并发环境下,线程数量可能会创建太多,操作系统的任务调度压力大,系统负载也会比较高。那怎么办呢?
于是 NIO
诞生了,NIO
并不是 Java
独有的概念,NIO
代表的一个词汇叫着 IO 多路复用。它是由操作系统提供的系统调用,早期这个操作系统调用的名字是 select,但是性能低下,后来渐渐演化成了 Linux 下的 epoll
和 Mac 里的kqueue
。我们一般就说是 epoll
,因为没有人拿苹果电脑作为服务器使用对外提供服务。而 Netty 就是基于 Java NIO
技术封装的一套框架。为什么要封装,因为原生的Java NIO
使用起来没那么方便,而且还有臭名昭著的 bug,Netty 把它封装之后,提供了一个易于操作的使用模式和接口,用户使用起来也就便捷多了。
Netty 特性
设计
-
统一的
API
,适用于不同的协议(阻塞和非阻塞); -
基于灵活、可扩展的事件驱动模型;
-
高度可定制的线程模型;
-
可靠的无连接数据
Socket
支持(UDP
);
性能
-
更好的吞吐量,低延迟;
-
更省资源;
-
尽量减少不必要的内存拷贝;
安全
-
完整的
SSL
/TLS
和STARTTLS
的支持; -
能在
Applet
与Android
的限制环境运行良好;
健壮性
-
不再因过快、过慢或超负载连接导致
OutOfMemoryError
; -
不再有在高速网络环境下
NIO
读写频率不一致的问题;
易用
-
完善的
JavaDoc
,用户指南和样例; -
简洁简单;
-
仅信赖于
JDK1.5
;
Netty ,应用场景
官方地址,点击跳转
互联网行业
- 互联网行业:在分布式系统中,各个节点之间需要远程服务调用,高性能的
RPC
框架必不可少,Netty
作为异步高性能的通信框架,往往作为基础通信组件被这些RPC
框架使用; - 典型的应用有:阿里分布式框架
Dubbo
的RPC
框架使用的Dubbo
协议进行节点间通信,Dubbo
协议默认使用Netty
作为基础通信组件,用于实现各进程节点之间的内部通信;
游戏行业
- 无论是手游服务端还是大型的网络游戏,
JAVA
语言得到了越来越广泛的应用; Netty
,作为高性能的基础通信组件,提供了TCP/UDP
和HTTP
协议栈,方便定制和开发私有协议栈,账号登录服务器;- 地图服务器之间可以方便的通过Netty进行高性能的通信;
大数据领域
- 经典的
Hadoop
的高性能通信和序列化组件(AVRO
实现数据文件共享)的RPC
框架,默认采用Netty进行跨界点通信; - 它的
Netty Service
基于Netty
框架二次开发;
相关学习资料
I/O,模型
I/O
模型简单的理解:就是用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能;JAVA
共支持3种网络编程模型,I/O模式:BIO
,NIO
,AIO
;JAVA AIO
:异步非阻塞,AIO
引入异步通道的概念,采用了Proactor
模式,简化了程序编写,有效的请求才启动线程,它的特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用;使用于连接数目多且比较长的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。