Netty 能作什么

做为一个学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服务器的原理数据库

  1. 建立一个ServerSocket,监听并绑定一个端口
  2. 一系列客户端来请求这个端口
  3. 服务器使用Accept,得到一个来自客户端的Socket链接对象
  4. 启动一个新线程处理链接
    1. 读Socket,获得字节流
    2. 解码协议,获得Http请求对象
    3. 处理Http请求,获得一个结果,封装成一个HttpResponse对象
    4. 编码协议,将结果序列化字节流
    5. 写Socket,将字节流发给客户端
  5. 继续循环步骤3

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。那这个阻塞是什么意思呢?多线程

  1. Accept是阻塞的,只有新链接来了,Accept才会返回,主线程才能继
  2. Read是阻塞的,只有请求消息来了,Read才能返回,子线程才能继续处理
  3. Write是阻塞的,只有客户端把消息收了,Write才能返回,子线程才能继续读取下一个请求

因此传统的多线程服务器是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 的异步高性能、高可靠性和高成熟度的优势,使它在通讯行业获得了大量的应用。

相关文章
相关标签/搜索