来看下面这个图,当客户端发起一次Http请求时,服务端的处理流程时怎么样的?
简单来说可以分为以下几个步骤:
基于TCP协议建立网络通信。
开始向服务端端传输数据。
服务端接受到数据进行解析,开始处理本次请求逻辑。
服务端处理完成后返回结果给客户端。
在这个过程中,会涉及到网络IO通信,在传统的BIO模式下,客户端向服务端发起一个数据读取请求,客户端在收到服务端返回数据之前,一直处于阻塞状态,直到服务端返回数据后完成本次会话。这个过程就叫同步阻塞IO,在BIO模型中如果想实现异步操作,就只能使用多线程模型,也就是一个请求对应一个线程,这样就能够避免服务端的链接被一个客户端占用导致连接数无法提高。
同步阻塞IO主要体现在两个阻塞点
服务端接收客户端连接时的阻塞。
客户端和服务端的IO通信时,数据未就绪的情况下的阻塞。
在这种传统BIO模式下,会造成一个非常严重的问题,如下图所示,如果同一时刻有N个客户端发起请求,按照BIO模型的特点,服务端在同一时刻只能处理一个请求。将导致客户端请求需要排队处理,带来的影响是,用户在等待一次请求处理返回的时间非常长。意味着服务端没有并发处理能力,这显然不合适。
异步IO
异步IO和多路复用机制,最大的区别在于:当数据就绪后,客户端不需要发送内核指令从内核空间读取数据,而是系统会异步把这个数据直接拷贝到用户空间,应用程序只需要直接使用该数据即可。
图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)
的模式。
在很多大厂面试的时候,会涉及到相关的知识点
Netty高性能表现在哪些方面
Netty中有哪些重要组件
Netty的内存池、对象池的设计
很多中间件都是用netty来做网络通信,那么我们在分析这些中间件的源码时,降低网络通信的理解难度
提升Java知识体系,尽可能的实现对技术体系理解的全面性。
Netty的生态介绍
首先,我们需要去了解Netty到底提供了哪些功能,如图2-1所示,表示Netty生态中提供的功能说明。后续内容中会逐步的分析这些功能。
EventLoopGroup。相当于线程池
EventLoop。相当于线程池中的线程
EventLoopGroup本质上是一个线程池,主要负责接收I/O请求,并分配线程执行处理请求。为了更好的理解EventLoopGroup、EventLoop、Channel之间的关系,我们来看图2-4所示的流程。
图2-6 ChannelPipeline从图中可以看出,ChannelPipeline中包含入站ChannelInBoundHandler和出站ChannelOutboundHandler,前者是接收数据,后者是写出数据,其实就是InputStream和OutputStream,为了更好的理解,我们来看图2-7。
图2-7 InBound和OutBound的关系ChannelHandler, 针对IO数据的处理器,数据接收后,通过指定的Handler进行处理。
ChannelHandlerContext,ChannelHandlerContext用来保存ChannelHandler的上下文信息,也就是说,当事件被触发后,多个handler之间的数据,是通过ChannelHandlerContext来进行传递的。ChannelHandler和ChannelHandlerContext之间的关系,如图2-8所示。
每个ChannelHandler都对应一个自己的ChannelHandlerContext,它保留了ChannelHandler所需要的上下文信息,多个ChannelHandler之间的数据传递,是通过ChannelHandlerContext来实现的。
Netty中核心组件的详细介绍
在2.5节中对Netty有了一个全局认识后,我们再针对这几个组件做一个非常详细的说明,加深大家的理解。
启动器Bootstrap和ServerBootstrap作为Netty构建客户端和服务端的路口,是编写Netty网络程序的第一步。它可以让我们把Netty的核心组件像搭积木一样组装在一起。在Netty Server端构建的过程中,我们需要关注三个重要的步骤
配置线程池
Channel初始化
Handler处理器构建
烧脑?放松一下,听下音乐吧
点击下方