你真的了解Netty吗?

你真的了解Netty吗?

初识 Netty

先来了解一下 Netty 的一些基本信息吧!

首先是官网

https://netty.io/

这个还是很重要的,好多人学习新的技术的时候往往最先忽略的就是官网,然而官网上才是最权威的知识,还是很有必要了解一下的。

Netty 是什么呢?

  1. Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github 上的独立项目。
  2. Netty 是一个异步的、基于事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络 IO 程序。
  3. Netty 主要针对在 TCP 协议下,面向Clients端的高并发应用,或者 Peer-to-Peer 场景下的大量数据持续传输的应用。
  4. Netty 本质是一个 NIO 框架,适用于服务器通讯相关的多种应用场景

为什么要用 Netty?

可以类比我们链接数据库不用 JDBC

原生 NIO 存在的问题

  1. NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。

  2. 需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序。

  3. 开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等。

  4. JDK NIO 的 Bug:例如臭名昭著的 Epoll Bug,它会导致 Selector 空轮询,最终导致 CPU 100%。直到 JDK 1.7 版本该问题仍旧存在,没有被根本解决。

Netty的优点是什么?

  1. Netty 对 JDK 自带的 NIO 的 API 进行了封装,解决了上述问题。
  2. 设计优雅:适用于各种传输类型的统一 API 阻塞和非阻塞 Socket;基于灵活且可扩展的事件模型,可以清晰地分离关注点;高度可定制的线程模型 - 单线程,一个或多个线程池–>高并发.
  3. 使用方便:详细记录的 Javadoc,用户指南和示例;没有其他依赖项,JDK 5(Netty 3.x)或 6(Netty 4.x)就足够了。
  4. 高性能、吞吐量更高:延迟更低;减少资源消耗;最小化不必要的内存复制。
  5. 安全:完整的 SSL/TLS 和 StartTLS 支持。
  6. 社区活跃、不断更新:社区活跃,版本迭代周期短,发现的 Bug 可以被及时修复,同时,更多的新功能会被加入

应用场景

Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序

Netty 可以帮助你快速、简单的开发出一个网络应用,相当于简化和流程化了 NIO 的开发过程

Netty 是目前最流行的 NIO 框架,Netty 在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,知名的 Elasticsearch 、Dubbo 框架内部都采用了 Netty。

推荐书籍

不聊Netty

在初步认识 Netty 之后,我们先放下它,先不聊它,我们先聊一下 IO 模型。具体内容我都整理到了脑图中,欢迎一起沟通学习~

BIO(同步阻塞)

同步阻塞,一个连接一个线程

  1. 服务器端启动一个 ServerSocket

  2. 客户端启动 Socket 对服务器进行通信,默认情况下服务器端需要对每个客户 建立一个线程与之通讯

  3. 客户端发出请求后, 先咨询服务器是否有线程响应,如果没有则会等待,或者被拒绝

  4. 如果有响应,客户端线程会等待请求结束后,在继续执行

NIO(同步非阻塞)

Java NIO 全称 java non-blocking IO,是指 JDK 提供的新 API,也可以叫 New IO,是同步非阻塞的

核心:NIO 有三大核心部分:Channel(通道),Buffer(缓冲区), Selector(选择器)

通俗理解:NIO 是可以做到用一个线程来处理多个操作的。

假设有10000个请求过来,根据实际情况,可以分配50或者100个线程来处理。

不像之前的阻塞 IO 那样,非得分配10000个。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XOl9839z-1641794232188)(C:\Users\zhum\AppData\Roaming\Typora\typora-user-images\image-20211207153109743.png)]

AIO(异步非阻塞)

Java AIO(NIO.2) : 异步非阻塞,AIO 引入异步通道的概念,采用了 Proactor 模式,简化了程序编写,有效的请求才启动线程,它的特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用。

Netty模型

传统阻塞 I/O 服务模型

采用阻塞 IO 模式获取输入的数据,每个连接都要独立的线程完成数据的输入,业务处理,数据返回,这样在并发数很大的情况下,就会创建大量线程,占用很大的系统资源。

Reactor 模式

Reactor 是一种基于事件驱动的设计模式。

针对传统阻塞 I/O 服务模型的 2 个缺点,解决方案:

基于 I/O 复用模型:多个连接共用一个阻塞对象,应用程序只需要在一个阻塞对象等待,无需阻塞等待所有连接。当某个连接有新的数据可以处理时,操作系统通知应用程序,线程从阻塞状态返回,开始进行业务处理

Reactor 对应的叫法:

  1. 反应器模式
  2. 分发者模式(Dispatcher)
  3. 通知者模式(notifier)

基于线程池复用线程资源:不必再为每个连接创建线程,将连接完成后的业务处理任务分配给线程进行处理,一个线程可以处理多个连接的业务。

异步模型

Netty核心组件

Netty 的核心组件也是非常繁多的,也很有必要整理在脑图中,欢迎一起沟通学习,共同进步。

BootStrap和ServerBootStrap

Bootstrap 意思是引导,一个 Netty 应用通常由一个 Bootstrap 开始,主要作用是配置整个 Netty 程序,串联各个组件,Netty 中 Bootstrap 类是客户端程序的启动引导类,ServerBootstrap 是服务端启动引导类

EventLoopGroup 和 EventLoop

EventLoopGroup 是一组 EventLoop 的抽象,Netty 为了更好的利用多核 CPU 资源,一般会有多个 EventLoop 同时工作,每个 EventLoop 维护着一个 Selector 实例。

EventLoopGroup 提供 next 接口,可以从组里面按照一定规则获取其中一个 EventLoop 来处理任务。在 Netty 服务器端编程中,我们一般都需要提供两个 EventLoopGroup,例如:BossEventLoopGroup 和 WorkerEventLoopGroup。

ChannelFuture

Netty 中所有的 IO 操作都是异步的,不能立刻得知消息是否被正确处理。但是可以过一会等它执行完成或者直接注册一个监听,具体的实现就是通过 Future 和 ChannelFutures,他们可以注册一个监听,当操作执行成功或失败时监听会自动触发注册的监听事件

Selector

  1. Netty 基于 Selector 对象实现 I/O 多路复用,通过 Selector 一个线程可以监听多个连接的 Channel 事件。

  2. 当向一个 Selector 中注册 Channel 后,Selector 内部的机制就可以自动不断地查询(Select) 这些注册的 Channel 是否有已就绪的 I/O 事件(例如可读,可写,网络连接完成等),这样程序就可以很简单地使用一个线程高效地管理多个 Channel

Channel

  1. Netty 网络通信的组件,能够用于执行网络 I/O 操作。

  2. 通过Channel 可获得当前网络连接的通道的状态

  3. 通过Channel 可获得 网络连接的配置参数 (例如接收缓冲区大小)

  4. Channel 提供异步的网络 I/O 操作(如建立连接,读写,绑定端口),异步调用意味着任何 I/O 调用都将立即返回,并且不保证在调用结束时所请求的 I/O 操作已完成

  5. 调用立即返回一个 ChannelFuture 实例,通过注册监听器到 ChannelFuture 上,可以 I/O 操作成功、失败或取消时回调通知调用方

  6. 支持关联 I/O 操作与对应的处理程序

  7. 不同协议、不同的阻塞类型的连接都有不同的 Channel 类型与之对应,常用的 Channel 类型

ChannelPipeLine

  1. ChannelPipeline 是一个 Handler 的集合,它负责处理和拦截 inbound 或者 outbound 的事件和操作,相当于一个贯穿 Netty 的链。(也可以这样理解:ChannelPipeline 是 保存 ChannelHandler 的 List,用于处理或拦截 Channel 的入站事件和出站操作)

  2. ChannelPipeline 实现了一种高级形式的拦截过滤器模式,使用户可以完全控制事件的处理方式,以及 Channel 中各个的 ChannelHandler 如何相互交互

ChannelHandler

  1. ChannelHandler 是一个接口,处理 I/O 事件或拦截 I/O 操作,并将其转发到其 ChannelPipeline(业务处理链)中的下一个处理程序。

  2. ChannelHandler 本身并没有提供很多方法,因为这个接口有许多的方法需要实现,方便使用期间,可以继承它的子类

ChannelHandlerContext

  1. 保存 Channel 相关的所有上下文信息,同时关联一个 ChannelHandler 对象

  2. 即 ChannelHandlerContext 中 包 含 一 个 具 体 的 事 件 处 理 器 ChannelHandler , 同 时 ChannelHandlerContext 中也绑定了对应的 pipeline 和 Channel 的信息,方便对 ChannelHandler 进行调用.

Unpooled

Netty 提供一个专门用来操作缓冲区(即Netty的数据容器)的工具类,通过给定的数据和字符编码返回一个 ByteBuf 对象(类似于 NIO 中的 ByteBuffer 但有区别)

面试时如何回答

在这里给大家提供一个面试时的回答思路,亲测有效!

一般面试官会问你:了解Netty吗?

你按照以下思路来回答就可以:

  1. IO模型,介绍 BIO 和 NIO
  2. 线程模型,引入到Netty的线程模型
  3. 介绍Netty的核心组件,按照上述我贴出来的图,按照理解回答即可,无需死记硬背
  4. 如果有实际项目经验的话,最好能够结合项目经验再巴拉几句

按照这个思路回答完之后,面试官基本也没有什么需要问的了,会认为你对 Netty 有一个很系统和深入的了解了。

以上就是关于Netty的介绍了,掌握了上述知识,无论是对你在日常中的开发,还是面试的时候吊打面试官,都会有很大帮助的,赶紧学起来吧~

另外欢迎一起沟通学习哦~

如果觉得我的创作对你有帮助,还请给我点个赞同~


4. 如果有实际项目经验的话,最好能够结合项目经验再巴拉几句

按照这个思路回答完之后,面试官基本也没有什么需要问的了,会认为你对 Netty 有一个很系统和深入的了解了。

以上就是关于Netty的介绍了,掌握了上述知识,无论是对你在日常中的开发,还是面试的时候吊打面试官,都会有很大帮助的,赶紧学起来吧~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值