Netty源码研究笔记(2)——Bootstrap系列
1. Netty源码研究笔记(2)——Bootstrap系列
顾名思义,
Bootstrap
是netty提供给使用者的脚手架,类似于Spring的 ApplicationContext
,通过 Bootstrap
我们使用一些自定义选项,将相关的组件打包起来,从而快速的启动服务器、客户端。
Bootstrap
分为: Bootstrap
、 ServerBootstrap
两种,其中前者用于构建客户端、后者用于构建服务端。
Bootstrap
的实现使用的是典型的建造者模式,使用这种模式的好处是使得构造对象时可读性更好,更不容易出错(相比于使用构造函数而言),并且可以在构造的时候进行校验。
Bootstrap
系列还包含相关的 BootstrapConfig
。
BootstrapConfig
的实现类似外观模式,只暴露其内部持有 Bootstrap
的配置信息。(配置信息实际放在 Bootstrap
中)。 1.1. 继承关系
1.2. AbstractBootstrap
注意:
bind
方法定义在 AbstractBoostrap
中。 在使用点对点的传输时,一般在Server端使用
bind
,在Client端使用 connect
。 如果
bind
方法不是通过 ServerBootstrap
使用: - 端到端传输场景下,客户端指定通信端口(非必须)
- 无连接的传输场景,比如:UDP。(必须)
AbstractBootstrap
是一个泛型类,它的泛型参数是其实现类,这样便可以使其链式调用方法返回的类型其具体的实现类。 忽略
EMPTY_OPTION_ARRAY
、 EMPTY_ATTRIBUTE_ARRAY
,这两者用于提供泛型方法的类型入参,从而指示其返回类型,没有实际意义。 我们可以看到在
AbstractBootstrap
中需要配置: - 关联的EventLoopGroup(必选)
- 监听的local socket address:对于端到端的server必选,对于无连接的也必选
- channel handler:必选,一般是channel initializer,负责将需要的channel handler添加到channel pipeline中。
- channel option(可选)
- channel attribute(可选)
- channel factory:一般使用默认的channel factory,它使用反射机制来创建channel
bind
、 connect
方法在前文已经分析过了,这里我们看未谈到的 validate
、 init
方法。 validate :
AbstractBootstrap
只校验了 EventLoopGroup
。 init :
子类中实现。
1.3. ServerBootstrap
在
ServerBootstrap
需要配置: - child channel option:可选,表示和客户端建立的传输信道的配置项。
- child channel attibute:可选,表示和客户端建立的传输信道的属性项。
- child channel handler:必填,一般是channel initializer,表示对客户端请求的处理逻辑
- child event loop group:可选,表示客户端请求处理器的执行线程组。
validate :
校验
child channel handler
init :
ServerBootstrap::init
方法给channel pipeline 添加用户指定的channel handler,以及一个 ServerBootstrapAcceptor
类型的channel handler,它使得服务端可以和客户端建立端到端的连接。
ServerBootstrapAcceptor
以后再谈。 1.4. Bootstrap
validate :
验证channel handler是否存在,即判断对server的response的处理器是否定义了。
init :
给channel pipeline添加用户指定的channel handler。
1.5. AbstractBootstrapConfig、ServerBootstrapConfig、BootstrapConfig
AbstractBootstrapConfig :
ServerBootstrapConfig :
BootstrapConfig :