Java教程

Netty-01

本文主要是介绍Netty-01,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 Netty简介

  • Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github 上的独立项目。
  • Netty 是一个异步的、基于事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络 IO 程序。
  • Netty 主要针对在 TCP 协议下,面向 Client 端的高并发应用,或者 Peer-to-Peer 场景下的大量数据持续传输的应用。
  • Netty 本质是一个 NIO 框架,适用于服务器通讯相关的多种应用场景。
  • 要透彻理解 Netty,需要先学习 NIO,这样我们才能阅读 Netty 的源码。

Netty 的应用场景

互联网行业

  1. 互联网行业:在分布式系统中,各个节点之间需要远程服务调用,高性能的 RPC 框架必不可少,Netty 作为异步高性能的通信框架,往往作为基础通信组件被这些 RPC 框架使用。
  2. 典型的应用有:阿里分布式服务框架 Dubbo 的 RPC 框 架使用 Dubbo 协议进行节点间通信,Dubbo 协议默认使用 Netty 作为基础通信组件,用于实现各进程节点之间的内部通信。

游戏行业

  1. 无论是手游服务端还是大型的网络游戏,Java 语言得到了越来越广泛的应用。
  2. Netty 作为高性能的基础通信组件,提供了 TCP/UDP 和 HTTP 协议栈,方便定制和开发私有协议栈,账号登录服务器。
  3. 地图服务器之间可以方便的通过 Netty 进行高性能的通信。

大数据领域

  1. 经典的 Hadoop 的高性能通信和序列化组件 Avro 的 RPC 框架,默认采用 Netty 进行跨界点通信。
  2. 它的 NettyService 基于 Netty 框架二次封装实现。

其它开源项目使用到 Netty

网址:https://netty.io/wiki/related-projects.html

为了更好的学习netty,我们必须先了解NIO

NIO

NIO是什么?

java.nio全称java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO) ,为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络。

简单点来说就是非阻塞性IO。以下用个图来表示下

可以看出一个线程来处理三个客户端端连接,上图为啥说是非阻塞的呢?

同步非阻塞:服务器实现模式是一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求就进行处理。说人话就是一个线程轮询处理这三个请求,类似cpu处理线程一样。

以上就是NIO的简单概括在这顺便说下其它IO模式:

  • BIO (Blocking I/O):同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。这里使用那个经典的烧开水例子,这里假设一个烧开水的场景,有一排水壶在烧开水,BIO的工作模式就是, 叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。但是实际上线程在等待水壶烧开的时间段什么都没有做。
  • NIO (New I/O):同时支持阻塞与非阻塞模式,但这里我们以其同步非阻塞I/O模式来说明,那么什么叫做同步非阻塞?如果还拿烧开水来说,NIO的做法是叫一个线程不断的轮询每个水壶的状态,看看是否有水壶的状态发生了改变,从而进行下一步的操作。
  • AIO ( Asynchronous I/O):异步非阻塞I/O模型。异步非阻塞与同步非阻塞的区别在哪里?异步非阻塞无需一个线程去轮询所有IO操作的状态改变,在相应的状态改变后,系统会通知对应的线程来处理。对应到烧开水中就是,为每个水壶上面装了一个开关,水烧开之后,水壶会自动通知我水烧开了。

在这主要说下NIO对于其它IO模式不再赘述。

NIO的三大组件 Channel & Buffer&Selector

Channel

channel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入(InputStream),要么是输出(OutputStream),channel 比 stream 更为底层。其实可以理解为一个供数据流转的通道。

常见的 Channel 有

  • FileChannel

  • DatagramChannel

  • SocketChannel

  • ServerSocketChannel

以上是channel和buffer的关系图,因为数据是在channel中流转的,数据暂存区在哪呢?那当然就是buffer了。

Buffer

buffer 则用来缓冲读写数据,常见的 buffer 有

  • ByteBuffer

  • ShortBuffer

  • IntBuffer

  • LongBuffer

  • FloatBuffer

  • DoubleBuffer

  • CharBuffer

Selector

selector 单从字面意思不好理解,需要结合服务器的设计演化来理解它的用途

⚠️ 多线程版缺点

  • 内存占用高

  • 线程上下文切换成本高

  • 只适合连接数少的场景

线程池版设计

 

⚠️ 线程池版缺点

  • 阻塞模式下,线程仅能处理一个 socket 连接

  • 仅适合短连接场景

selector 版设计

selector 的作用就是配合一个线程来管理多个 channel,获取这些 channel 上发生的事件,这些 channel 工作在非阻塞模式下,不会让线程吊死在一个 channel 上。适合连接数特别多,但流量低的场景(low traffic)

调用 selector 的 select() 会阻塞直到 channel 发生了读写就绪事件,这些事件发生,select 方法就会返回这些事件交给 thread 来处理

 

这篇关于Netty-01的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!