阅读更多
1 源码Maven坐标
1 | <dependency> |
2 Echo Server示例
Handler代码清单如下
1 | package org.liuyehcf.protocol.echo; |
Server代码清单如下
1 | package org.liuyehcf.protocol.echo; |
从示例代码中,我们找出几个核心的类型
ServerBootstrap
NioEventLoopGroup
NioServerSocketChannel
ChannelInitializer
3 ServerBootstrap
由于Netty启动涉及到很多复杂的步骤,因此提供了一个辅助类ServerBootstrap
来帮助用户启动Netty,由于可配置参数种类繁多,为了保持较好的可伸缩性以及可扩展性,ServerBootstrap采用了建造者模式
ServerBootstrap的继承关系如下
其中ServerBootstrap包含如下字段
Map<ChannelOption<?>, Object> childOptions
:一个MapMap<AttributeKey<?>, Object> childAttrs
:一个MapServerBootstrapConfig config
:该字段用于获取ServerBootstrap的各项参数EventLoopGroup childGroup
:ChannelHandler childHandler
:
这里涉及到两个概念,parent
以及child
- parent:用于accept连接的那些组件
- child:用于客户端连接的那些组件
3.1 ServerBootstrapConfig
ServerBootstrapConfig用于获取ServerBootstrap的各项参数,即使ServerBootstrap的功能趋于单一
ServerBootstrapConfig的继承结构图如下
AbstractBootstrapConfig
- 用于返回AbstractBootstrap的各项参数
ServerBootstrapConfig
- 用于返回ServerBootstrap相比于AbstractBootstrap所额外提供的参数(child相关的参数)
4 NioEventLoopGroup
NioEventLoopGroup管理了一组线程池,而其本身又可以被抽象成一个线程池,对NioEventLoopGroup执行的操作会通过相应策略,从其管理的线程池组中选择一个线程池进行执行
NioEventLoopGroup的继承结构图如下
EventExecutorGroup
- 管理了一组Executor(一个Executor可以理解为一个线程池)
- 另一方面,由于
EventExecutorGroup
接口间接继承自ExecutorService
接口,因此EventExecutorGroup
也可以看成是一个Executor,这是比较奇特的一个地方 - 提供了一个重要的方法next
EventLoopGroup
- 在
EventExecutorGroup
基础之上,提供了异步的register
方法
- 在
AbstractEventExecutorGroup
- 为那些从JDK接口中继承而来的方法提供基础实现,就是调用next()方法然后调用对应的方法
- next()方法依据不同策略从管理的所有Executor中选出下一个
MultithreadEventExecutorGroup
- 该类主要作用就是进行一些关键的初始化动作
- 该类定义了关键字段children(EventExecutor数组)以及chooser(依据children的大小选择不同的next的策略)
MultithreadEventLoopGroup
- 为
EventLoopGroup
接口提供的方法提供基础实现
- 为
4.1 NioEventLoop
NioEventLoop本质上就是一个线程池,被NioEventLoopGroup管理
NioEventLoop的继承结构图如下
EventExecutor
- 增加了几个新的方法,包括
parent
、inEventLoop
、以及创建Future和Promise的方法
- 增加了几个新的方法,包括
AbstractEventExecutor
- 为
EventExecutor
接口以及EventLoopGroup
接口提供的方法提供基础实现
- 为
AbstractScheduledEventExecutor
- 为
ScheduledExecutorService
接口提供的方法提供基础实现
- 为
OrderedEventExecutor
- 空接口
EventLoop
- 修改parent方法的返回值
SingleThreadEventExecutor
- 实现了线程池的主要逻辑
SingleThreadEventLoop
- 综合两条继承链路
- 为
EventLoopGroup
接口提供的方法提供基础实现
5 ChannelInitializer
ChannelInitializer的继承结构图如下
ChannelHandler
- 提供了添加和移除Handler的方法
ChannelHandlerAdapter
- 为
ChannelHandler
接口提供基本的“骨架”实现
- 为
ChannelInboundHandler
- 在channel状态改变时插入相应的hook method,用于回调
ChannelInboundHandlerAdapter
- 为
ChannelInboundHandler
接口提供的方法提供基础实现,以便让用户自行选择是否覆盖某个hook method
- 为
6 DefaultChannelPipeline
DefaultChannelPipeline继承结构图如下
ChannelInboundInvoker
- 将接收数据这一个过程抽象出多个生命周期,用于用户自定义处理逻辑
ChannelOutboundInvoker
- 将发送数据这一个过程抽象出多个生命周期,用于用户自定义处理逻辑
ChannelPipeline
- 将
ChannelInboundInvoker
与ChannelOutboundInvoker
进行合并 - 添加了一系列add以及remove方法用于添加handler
- 将
那么这些生命周期由谁触发呢?大部分IO的底层操作由AbstractChannel
完成,因此这些生命周期会在这些底层操作之中显式触发。这些触发的操作大致由AbstractChannelHandlerContext
、DefaultChannelPipeline
以及AbstractChannel
协作完成,在此先不深究细节
7 NioServerSocketChannel
NioServerSocketChannel继承结构图如下
AttributeMap
- 用于存放属性值的Map
DefaultAttributeMap
- 为
AttributeMap
接口提供基础实现
- 为
Channel
- 定义Netty中Channel的一系列方法
- 此外,还定义了Unsafe接口(不是sun实现中的Unsafe)
AbstractChannel
- 为
Channel
接口提供基础实现 - 基本上所有底层的IO操作都在这个类中实现
- 为
AbstractNioChannel
- Netty中底层的NIO操作,都在这个类中实现,包括Selector等
AbstractNioMessageChannel
- 相比于
AbstractNioChannel
,AbstractNioMessageChannel
提供更高一层的抽象,提供可以处理Message
的抽象方法
- 相比于
ServerChannel
- 空接口,仅用于标记
ServerSocketChannel
- 定义用于监听连接的ServerChannel
8 DefaultChannelPromise
DefaultChannelPromise继承结构图如下
Future
- 该Future继承自JUC中的同名Future接口
- 增加了添加和删除监听器的方法,以及sync方法和await方法等
AbstractFuture
- 为JUC中的Future接口的get方法提供基础实现
Promise
- 增加了
setSuccess/setFailure
、trySuccess/tryFailure
等方法
- 增加了
ChannelFuture
- 增加了返回Channel的方法,以及判断是否为Void型的channel的方法
ChannelPromise
- 结合了
ChannelFuture
以及Promise
接口
- 结合了
DefaultPromise
- 为
Promise
以及Future
接口提供了基础实现
- 为
DefaultChannelPromise
- 为
ChannelPromise
接口提供默认实现
- 为
9 SocketUtils
该类封装了一系列底层Java NIO API的基本操作