ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Netty-01

2022-04-10 21:31:24  阅读:139  来源: 互联网

标签:Netty 01 NIO 阻塞 线程 IO channel


 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,NIO,阻塞,线程,IO,channel
来源: https://www.cnblogs.com/xkkdev/p/16113584.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有