1. Netty是什么?
Netty是由JBOSS提供的一个java开源网络通讯框架。Netty可以提供异步的,非阻塞的,事件驱动的网络应用程序框架和工具,非常适合用来快速开发高性能、高可靠性的网络服务器和客户端程序。
Netty是一个基于NIO的客户、服务器端编程框架,使用Netty 可以让我们快速和简单地进行网络通讯和数据传输。
2. 接收请求和处理流程
首先先介绍在Netty中会用到的关键概念:
EventLoopGroup:一个 Netty 程序启动时, 至少要指定一个 EventLoopGroup对象,EventLoopGroup内有很多个EventLoop,负责处理事件
EventLoop: 负责处理各种事件
Channel:即通讯的通道,发送接受数据
ChannelPipeline:Channel的数据管道
ChannelHandler:可看作是处理ChannelPipeline中传输的数据的工具
ChannelHandlerContext:使得ChannelHandler可以和ChannelPipeline或其他handler进行交互等。
在Netty中,当有连接请求时,会从EventLoopGroup中拿到一个EventLoop,EventLoop会绑定一个Channel,随后做出具体的处理。每一个请求都有一个EventLoop去处理。EventLoop在这里扮演的角色就相当于线程,而EventLoopGroup就相当于线程池,负责管理调度EventLoop。Netty处理连接请求的结构框图如下:
那么在完成绑定Channel的操作后,具体怎么处理数据呢?Netty中,将Channel的数据管道抽象为ChannelPipeline,消息数据会在ChannelPipeline中流动和传递。ChannelPipeline是ChannelHandler的容器,持有I/O事件拦截器ChannelHandler的链表,负责对ChannelHandler的管理和调度。ChannelHandler可以看成处理ChannelPipeline中数据的工具,可以处理I/O事件或者拦截I/O操作, 并转发给它所在ChannelPipeline中的下一个handler。我们可以方便地新增和删除ChannelHandler来实现不同业务逻辑的处理。但是ChannelPipeline不是直接管理ChannelHandler的,而是通过ChannelHandlerContext来间接管理。Channel处理框图如下:
Netty中根据事件源头的不同将handler分为两种:InBound和OutBound。InBound事件通常由I/O线程触发,例如TCP连接建立和关闭、读事件等等,分别会触发相应的handler的方法。而OutBound事件则一般由用户主动发起的网络I/O操作,例如用户发起的连接操作,绑定操作和消息发送操作等,也会分别触发相应的方法。
可以从上图看到,Handler由headHandler到tailHandler组成了一条双向链表,Handler链使用了责任链的设计模式(类似在web开发中的filter和拦截器),当事件传入ChannelPipeline中后,会经过一个个handler的处理。当触发ChannelRead事件的时候,消息将从headHandler至tailHandler依次处理;当调用ChannelHandlerContext的write方法发送消息进行通讯时,消息先从tailHandler开始,经过一系列handler处理后传递至headHandler,最终被添加到消息发送缓冲区后刷新输出。
了解了Netty中大致的一些概念以及原理后,下篇博客中我们来写一个简单的Netty服务器与客户端通讯的例子~
那么,点个赞再走?