你真的理解Netty以及为什么要用吗?(深度干货)

来看下面这个图,当客户端发起一次Http请求时,服务端的处理流程时怎么样的?

f02abcbb33eb601043ba14e75f26673f.png

简单来说可以分为以下几个步骤:

  1. 基于TCP协议建立网络通信。

  2. 开始向服务端端传输数据。

  3. 服务端接受到数据进行解析,开始处理本次请求逻辑。

  4. 服务端处理完成后返回结果给客户端。

在这个过程中,会涉及到网络IO通信,在传统的BIO模式下,客户端向服务端发起一个数据读取请求,客户端在收到服务端返回数据之前,一直处于阻塞状态,直到服务端返回数据后完成本次会话。这个过程就叫同步阻塞IO,在BIO模型中如果想实现异步操作,就只能使用多线程模型,也就是一个请求对应一个线程,这样就能够避免服务端的链接被一个客户端占用导致连接数无法提高。

同步阻塞IO主要体现在两个阻塞点

  • 服务端接收客户端连接时的阻塞。

  • 客户端和服务端的IO通信时,数据未就绪的情况下的阻塞。

2ba4bf149be2c2826299ce427ad298b8.png

在这种传统BIO模式下,会造成一个非常严重的问题,如下图所示,如果同一时刻有N个客户端发起请求,按照BIO模型的特点,服务端在同一时刻只能处理一个请求。将导致客户端请求需要排队处理,带来的影响是,用户在等待一次请求处理返回的时间非常长。意味着服务端没有并发处理能力,这显然不合适。

b4d43d85626507be924d6ba533de1a32.png

f35bf05a180fb7600b76533049d0c7fb.png

42afbdf30a05eedca180154ef7f42a5d.png

10eefe5728e7028c4dd84ec3d2fb437a.png

bab60e1c3566b9146821dd53f429b1da.png

f63452a5f19b756e9870b449083b2c7a.png

e2aea9417cafbe6ec0f96a2514c1370f.png

异步IO

异步IO和多路复用机制,最大的区别在于:当数据就绪后,客户端不需要发送内核指令从内核空间读取数据,而是系统会异步把这个数据直接拷贝到用户空间,应用程序只需要直接使用该数据即可。

6b431c8cd56e49e26a6b6050e36d2c58.png

03af9f20748b21e48e3e1cc2c3b80f4f.png

c4ad13fc872522c485b4fff164bf0e73.png

488b13bbfb8d626a5f33f5a0b903c2c5.png

图2-5 Reactor模型

这是最基本的单Reactor单线程模型(整体的I/O操作是由同一个线程完成的)

其中Reactor线程,负责多路分离套接字,有新连接到来触发connect 事件之后,交由Acceptor进行处理,有IO读写事件之后交给hanlder 处理。

Acceptor主要任务就是构建handler ,在获取到和client相关的SocketChannel之后 ,绑定到相应的hanlder上,对应的SocketChannel有读写事件之后,基于racotor 分发,hanlder就可以处理了(所有的IO事件都绑定到selector上,有Reactor分发)

Reactor 模式本质上指的是使用 I/O 多路复用(I/O multiplexing) + 非阻塞 I/O(non-blocking I/O) 的模式。

0e4c3a21fc8ad3eb0a852b2b01298d2f.png

ed71d23794c0ae93231c7932228ab346.png

bb25d3f701344030db4da0cedbfb658d.png

5370ebe1286131760325a7760b0eda3d.png

40ea5aef87ed48167748c6febc41659c.png

  • 在很多大厂面试的时候,会涉及到相关的知识点

    • Netty高性能表现在哪些方面

    • Netty中有哪些重要组件

    • Netty的内存池、对象池的设计

  • 很多中间件都是用netty来做网络通信,那么我们在分析这些中间件的源码时,降低网络通信的理解难度

  • 提升Java知识体系,尽可能的实现对技术体系理解的全面性。

cbb6cfbaf1f508ea975198fb03d19be3.png

Netty的生态介绍

首先,我们需要去了解Netty到底提供了哪些功能,如图2-1所示,表示Netty生态中提供的功能说明。后续内容中会逐步的分析这些功能。

5b00453365ddf0e59fb747ca27a751bb.png

8416077d2746f2cb34644b891938f7e6.png

8ae4bf99c7a9b6b84479d4f40f4b666d.png

46c40bed5e383a00e39db79795f83c2f.png

2d75bac44a87b30cb2a172891fb4cc1b.png

41814d87f5831717b1dc4ef2152147fd.png

903fdf017670c74a3936b86fb3a00295.png

028870a96d16c363b0dc411f6d2e46e5.png

486fcaddd54ac2b914e631a9d80e7eba.png

468e0b75351c692fe0154afb28a9d6a4.png

6cf0241ea3fb20f719d228f9d48cb8e0.png

e3f14dea5ecbb38b2925820bc19eaa51.png

  • EventLoopGroup。相当于线程池

  • EventLoop。相当于线程池中的线程

EventLoopGroup本质上是一个线程池,主要负责接收I/O请求,并分配线程执行处理请求。为了更好的理解EventLoopGroup、EventLoop、Channel之间的关系,我们来看图2-4所示的流程。

02c6eb3c630f3350bf887d7be457beb5.png

00652eebdf713b9e25121afeda37eb67.png

63f384fb4f4371826b04b17ca3d9ca29.png

643b2f80750faaae02764105d82ea716.png

6971d8f781e860cce7db3c776d3be7fb.png

图2-6 ChannelPipeline

从图中可以看出,ChannelPipeline中包含入站ChannelInBoundHandler和出站ChannelOutboundHandler,前者是接收数据,后者是写出数据,其实就是InputStream和OutputStream,为了更好的理解,我们来看图2-7。

a1b98dd5d20233264ed084b34211be1d.png

图2-7 InBound和OutBound的关系
  • ChannelHandler, 针对IO数据的处理器,数据接收后,通过指定的Handler进行处理。

  • ChannelHandlerContext,ChannelHandlerContext用来保存ChannelHandler的上下文信息,也就是说,当事件被触发后,多个handler之间的数据,是通过ChannelHandlerContext来进行传递的。ChannelHandler和ChannelHandlerContext之间的关系,如图2-8所示。

    每个ChannelHandler都对应一个自己的ChannelHandlerContext,它保留了ChannelHandler所需要的上下文信息,多个ChannelHandler之间的数据传递,是通过ChannelHandlerContext来实现的。

be37e90525c3ebd2ef74794f456d9099.png

77bd931560320895e12d2eceff39281f.png

8c369038f6953f56d11e9958d5fecaf7.png

图2-9 Netty各个组件的工作原理

Netty中核心组件的详细介绍

在2.5节中对Netty有了一个全局认识后,我们再针对这几个组件做一个非常详细的说明,加深大家的理解。

启动器Bootstrap和ServerBootstrap作为Netty构建客户端和服务端的路口,是编写Netty网络程序的第一步。它可以让我们把Netty的核心组件像搭积木一样组装在一起。在Netty Server端构建的过程中,我们需要关注三个重要的步骤

  • 配置线程池

  • Channel初始化

  • Handler处理器构建

63c3063c6ffcaa5255a0f0146c9ae11f.png

烧脑?放松一下,听下音乐吧

ab91f7173adf4803caf557e276164f36.png

点击下方

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值