本章主要介绍Netty究竟是怎么工作的
一、Netty的核心组件
先总体认识一下Netty用到的组件及它们在整个Netty架构中是怎么协调工作的,具体有
- Bootstrap or ServerBootstrap
- EventLoop
- EventLoopGroup
- ChannelPipeline
- Channel
- ChannelFuture
- ChannelInitializer
- ChannelHandler
- ChannelHandlerContext
Bootstrap是netty应用程序的开始,它的主要作用是配置整个netty应用,串联各个组件。
ChannelHandler的主要作用是处理各种事件,可以是连接、数据连接、异常和数据收发等,子类有ChannelInboundHandler和ChannelOutboundHandler,用于数据的接收和写出处理,一般的核心逻辑也就实现在Bounder里。
ChannelInitializer是用来配置ChannelHandler的,并提供一个ChannelPipeline,把Handler添加到Pipeline内。
ChannelHandlerContext代表channelHandler和ChannelPipeline的绑定关系,每个channel会分配唯一一个ChannelPipeline,可以动态的添加和移除handler,每个handler和ChannelPipeling的绑定关系就是通过ChannelHandlerContext记录的。
EventLoops的目的是为Channel处理IO操作,一个EventLoop可以为多个Channel服务。
EventLoopGroup会包含多个EventLoop。
Channel代表了一个Socket链接,或者其它和IO操作相关的组件,它和EventLoop一起用来参与IO处理。
Future,在Netty的所有IO操作中都是异步的,IO操作完成会通过Future和ChannelFutures注册的监听器,有监听结果后自动触发。
二、Bootstrap、EventLoop、Channel的对应关系
一个channel会对应一个EventLoop,一个EventLoop会对应一个线程。当一个连接到达时,Netty会注册一个channel,然后EventLoopGroup会分配一个EventLoop绑定到这个channel,在这个channel的整个生命周期过程中,都会由绑定的这个EventLoop来为它服务,而这个EventLoop就是一个线程。
bootstrap分为两种类型,一种是用于client端,另一种是位于Server端。
- ServerBootstrap用于Server端,通过调用bind()方法来绑定到一个端口监听连接;Bootstrap用于Client端,需要调用connect()方法来连接服务器端
- 客户端的Bootstrap一般用一个EventLoopGroup,而服务器端的ServerBootstrap会用到两个(这两个也可以是同一个实例)
ChannelHandler有两个子类ChannelInboundHandler和ChannelOutboundHandler,这两个类对应了两个数据流向,如果数据是从外部流入应用程序,看做是inbound,相反便是outbound。InboundHandler和OutboundHandler在ChannelPipeline中是混合在一起的,那么它们如何区分彼此呢?其实很容易,因为它们各自实现的是不同的接口,对于inbound event,Netty会自动跳过OutboundHandler,相反若是outbound event,ChannelInboundHandler会被忽略掉。数据在各个Handler之间传递,这需要调用方法中传递的ChanneHandlerContext来操作。