做为一个学Java的,若是没有研究过Netty,那么你对Java语言的使用和理解仅仅停留在表面水平,会点SSH,写几个MVC,访问数据库和缓存,这些只是初等Java程序员干的事。若是你要进阶,想了解Java服务器的深层高阶知识,Netty绝对是一个必需要过的门槛。java
有了Netty,你能够实现本身的HTTP服务器,FTP服务器,UDP服务器,RPC服务器,WebSocket服务器,Redis的Proxy服务器,MySQL的Proxy服务器等等。程序员
若是你想知道Nginx是怎么写出来的,若是你想知道Tomcat和Jetty是如何实现的,若是你也想实现一个简单的Redis服务器,那都应该好好理解一下Netty,它们高性能的原理都是相似的。spring
咱们回顾一下传统的HTTP服务器的原理数据库
HTTP服务器之因此称为HTTP服务器,是由于编码解码协议是HTTP协议,若是协议是Redis协议,那它就成了Redis服务器,若是协议是WebSocket,那它就成了WebSocket服务器,等等。apache
使用Netty你就能够定制编解码协议,实现本身的特定协议的服务器。缓存
上面咱们说的是一个传统的多线程服务器,这个也是Apache处理请求的模式。在高并发环境下,线程数量可能会建立太多,操做系统的任务调度压力大,系统负载也会比较高。那怎么办呢?安全
因而NIO诞生了,NIO并非Java独有的概念,NIO表明的一个词汇叫着IO多路复用。它是由操做系统提供的系统调用,早期这个操做系统调用的名字是select,可是性能低下,后来渐渐演化成了Linux下的epoll和Mac里的kqueue。咱们通常就说是epoll,由于没有人拿苹果电脑做为服务器使用对外提供服务。而Netty就是基于Java NIO技术封装的一套框架。为何要封装,由于原生的Java NIO使用起来没那么方便,并且还有臭名昭著的bug,Netty把它封装以后,提供了一个易于操做的使用模式和接口,用户使用起来也就便捷多了。服务器
那NIO到底是什么东西呢?网络
NIO的全称是NoneBlocking IO,非阻塞IO,区别与BIO,BIO的全称是Blocking IO,阻塞IO。那这个阻塞是什么意思呢?多线程
因此传统的多线程服务器是BlockingIO模式的,从头至尾全部的线程都是阻塞的。这些线程就干等在哪里,占用了操做系统的调度资源,什么事也不干,是浪费。
那么NIO是怎么作到非阻塞的呢。它用的是事件机制。它能够用一个线程把Accept,读写操做,请求处理的逻辑全干了。若是什么事都没得作,它也不会死循环,它会将线程休眠起来,直到下一个事件来了再继续干活,这样的一个线程称之为NIO线程。
while true { events = takeEvents(fds) // 获取事件,若是没有事件,线程就休眠 for event in events { if event.isAcceptable { doAccept() // 新连接来了 } elif event.isReadable { request = doRead() // 读消息 if request.isComplete() { doProcess() } } elif event.isWriteable { doWrite() // 写消息 } } }
NIO的流程大体就是上面的伪代码描述的过程,跟实际真实的代码有较多差别,不过对于初学者,这样理解也是足够了。
Netty是创建在NIO基础之上,Netty在NIO之上又提供了更高层次的抽象。
在Netty里面,Accept链接可使用单独的线程池去处理,读写操做又是另外的线程池来处理。
Accept链接和读写操做也可使用同一个线程池来进行处理。而请求处理逻辑既可使用单独的线程池进行处理,也能够跟放在读写线程一块处理。线程池中的每个线程都是NIO线程。用户能够根据实际状况进行组装,构造出知足系统需求的并发模型。
Netty提供了内置的经常使用编解码器,包括行编解码器[一行一个请求],前缀长度编解码器[前N个字节定义请求的字节长度],可重放解码器[记录半包消息的状态],HTTP编解码器,WebSocket消息编解码器等等
Netty提供了一些列生命周期回调接口,当一个完整的请求到达时,当一个链接关闭时,当一个链接创建时,用户都会收到回调事件,而后进行逻辑处理。
Netty能够同时管理多个端口,可使用NIO客户端模型,这些对于RPC服务是颇有必要的。
Netty除了能够处理TCP Socket以外,还能够处理UDP Socket。
在消息读写过程当中,须要大量使用ByteBuffer,Netty对ByteBuffer在性能和使用的便捷性上都进行了优化和抽象。
总之,Netty是Java程序员进阶的必备神奇。若是你知其然,还想知其因此然,必定要好好研究下Netty。若是你以为Java枯燥无谓,Netty则是从新开启你对Java兴趣大门的钥匙。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1)本质:JBoss作的一个Jar包
2)目的:快速开发高性能、高可靠性的网络服务器和客户端程序
3)优势:提供异步的、事件驱动的网络应用程序框架和工具
通俗的说:一个好使的处理Socket的东东
若是没有Netty?
远古:
java.net + java.io
近代:
java.nio
其余:
Mina,Grizzly
与Mina相比有什么优点?
一、都是Trustin Lee的做品,Netty更晚;
二、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作到这一点比较困难。
-----------------------------------------------------------------------------------------------------------------------------------------Netty的特性
1)设计
统一的API,适用于不一样的协议(阻塞和非阻塞)
基于灵活、可扩展的事件驱动模型
高度可定制的线程模型
可靠的无链接数据Socket支持(UDP)
2)性能
更好的吞吐量,低延迟
更省资源
尽可能减小没必要要的内存拷贝
3)安全
完整的SSL/TLS和STARTTLS的支持
能在Applet与Android的限制环境运行良好
4)健壮性
再也不因过快、过慢或超负载链接致使OutOfMemoryError
再也不有在高速网络环境下NIO读写频率不一致的问题
5)易用
完善的JavaDoc,用户指南和样例
简洁简单
仅信赖于JDK1.5
-------------------------------------------------------------------------------------------------------------------------------------------
Netty 在哪些行业获得了应用?
互联网行业:随着网站规模的不断扩大,系统并发访问量也愈来愈高,传统基于 Tomcat 等 Web 容器的垂直架构已经没法知足需求,须要拆分应用进行服务化,以提升开发和维护效率。从组网状况看,垂直的架构拆分以后,系统采用分布式部署,各个节点之间须要远程服务调用,高性能的 RPC 框架必不可少,Netty 做为异步高性能的通讯框架,每每做为基础通讯组件被这些 RPC 框架使用。
典型的应用有:阿里分布式服务框架 Dubbo 的 RPC 框架使用 Dubbo 协议进行节点间通讯,Dubbo 协议默认使用 Netty 做为基础通讯组件,用于实现各进程节点之间的内部通讯。它的架构图以下:
其中,服务提供者和服务消费者之间,服务提供者、服务消费者和性能统计节点之间使用 Netty 进行异步/同步通讯。
除了 Dubbo 以外,淘宝的消息中间件 RocketMQ 的消息生产者和消息消费者之间,也采用 Netty 进行高性能、异步通讯。
除了阿里系和淘宝系以外,不少其它的大型互联网公司或者电商内部也已经大量使用 Netty 构建高性能、分布式的网络服务器。
游戏行业:不管是手游服务端、仍是大型的网络游戏,Java 语言获得了愈来愈普遍的应用。Netty 做为高性能的基础通讯组件,它自己提供了 TCP/UDP 和 HTTP 协议栈,很是方便定制和开发私有协议栈。帐号登录服务器、地图服务器之间能够方便的经过 Netty 进行高性能的通讯,架构示意图以下:
图1-2 Netty 在游戏服务器架构中的应用
大数据领域:经典的 Hadoop 的高性能通讯和序列化组件 Avro 的 RPC 框架,默认采用 Netty 进行跨节点通讯,它的 Netty Service 基于 Netty 框架二次封装实现。
大数据计算每每采用多个计算节点和一个/N个汇总节点进行分布式部署,各节点之间存在海量的数据交换。因为 Netty 的综合性能是目前各个成熟 NIO 框架中最高的,所以,每每会被选中用做大数据各节点间的通讯。
企业软件:企业和 IT 集成须要 ESB,Netty 对多协议支持、私有协议定制的简洁性和高性能是 ESB RPC 框架的首选通讯组件。事实上,不少企业总线厂商会选择 Netty 做为基础通讯组件,用于企业的 IT 集成。
通讯行业:Netty 的异步高性能、高可靠性和高成熟度的优势,使它在通讯行业获得了大量的应用。