Netty(一):基础概念及消息处理流程

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服务器与客户端通讯的例子~

  那么,点个赞再走?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值