Netty的Bootstrap引导类

简介

Bootstrap类是Netty提供的一个便利的工厂类,可以通过它来完成Netty的客户端或服务器端的Netty组件的组装,以及Netty的初始化。
在Netty中,有两个引导类Bootstrap和ServerBootstrap,分别用在服务器和客户端,两个类都继承AbstractBootstrap。两个类的仅是使用的地方不同,配置和使用方法都是相同的。
已ServerBootstrap类作为重点介绍。介绍之前需要了解两个基础概念:父子通道、EventLoopGroup线程组(事件循环线程组)。

父子通道

在Netty中,将有接收关系的NioServerSocketChannel和NioSocketChannel,叫做父子通道。其中,NioServerSocketChannel负责服务器连接监听和接收,也叫父通道(Parent Channel)。对应于每一个接收的NioSocketChannel传输类通道,也叫子通道(Child Channel)

EventLoopGroup线程组

Netty的EventLoopGroup线程组就是一个多线程版本的反应器。NettyLoopGroup,如果不传入线程数或传入的线程数为0,那么默认线程数是最大可用CPU处理器数量的2倍数。
Netty中会设置两个EventLoopGroup线程组,一个EventLoopGroup负责新连接的监听和接受,一个EventLoopGroup负责IO事件处理。

Bootstrap的启动流程

Bootstrap的启动流程,也就是Netty组件的组装、配置,以及Netty服务器或者客户端的启动流程。
首先创建一个服务器端的引导类实例。

ServerBootstrap b = new ServerBootstrap();

第一步:创建反应器线程组,并赋值ServerBootstrap引导类实例

//创建反应器线程组
 //boss 线程组
EventLoopGroup bossLoopGroup = new NioEventLoopGroup(1);
//worker 线程组
 EventLoopGroup workerLoopGroup = new NioEventLoopGroup();
//...
//1 设置反应器线程组
b.group(bossLoopGroup, workerLoopGroup);

第二步:设置通道的IO类型
Netty不止java NIO,也支持阻塞式的OIO(也叫BIO,Block-IO,即阻塞式IO)。

//2 设置 nio 类型的通道
b.channel(NioServerSocketChannel.class);

第三步:设置监听端口

//3 设置监听端口
b.localAddress(new InetSocketAddress(port));

第四步:设置传输通道的配置选项

//4 设置通道的参数
b.option(ChannelOption.SO_KEEPALIVE, true);
b.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);

Bootstrap的option()方法,作用是:给父通道(Parent Channel)接收连接通道设置一些选项。
Bootstrap的childOption()方法,作用是:给子通道(Child Channel)设置一些通道选项。

第五步:装配子通道的Pipeline流水线

//5 装配子通道流水线
b.childHandler(new ChannelInitializer<SocketChannel>() {
 //有连接到达时会创建一个通道的子通道,并初始化
 protected void initChannel(SocketChannel ch) throws Exception {
 // 流水线管理子通道中的 Handler 业务处理器
 // 向子通道流水线添加一个 Handler 业务处理器
 ch.pipeline().addLast(new NettyDiscardHandler());
}
});

第六步:开始绑定服务器新连接的监听端口

// 6 开始绑定端口,通过调用 sync 同步方法阻塞直到绑定成功
ChannelFuture channelFuture = b.bind().sync();
Logger.info(" 服务器启动成功,监听端口: " +
channelFuture.channel().localAddress());

b.bind()方法的功能:返回一个端口绑定Netty的异步任务channelFuture。在这里,并没有给channelFuture异步任务增加回调监听器,而是阻塞channelFuture异步任务,直到端口绑定任务执行完成。
至此,服务器正式启动。
第七步:自我阻塞,直到通道关闭。

// 7 等待通道关闭
// 自我阻塞,直到通道关闭的异步任务结束
ChannelFuture closeFuture = channelFuture.channel().closeFuture();
closeFuture.sync();

如果要阻塞当前线程直到通道关闭,可以使用通道的closeFuture()方法,以获取通道关闭的异步任务。当通道被关闭时,closeFuture实例的sysn()方法会返回。
第八步:关闭EventLoopGroup

// 8 关闭 EventLoopGroup,
// 释放掉所有资源,包括创建的反应器线程
workerLoopGroup.shutdownGracefully();
bossLoopGroup.shutdownGracefully();

ChannelOption通道选项

1、SO_RCVBUF,SO_SNDBUF
每个 TCP socket(套接字)在内核中都有一个发送缓冲区和一个接收缓冲区,
这两个选项就是用来设置 TCP 连接的这两个缓冲区大小的。TCP 的全双工的工作模式以及 TCP 的
滑动窗口便是依赖于这两个独立的缓冲区及其填充的状态。
2. TCP_NODELAY
表示立即发送数据,默认值为 True(Netty 默认为 True,而操作系统默认为
False)。该值用于设置 Nagle 算法的启用,该算法将小的碎片数据连接成更大的报文(或数据包)
来最小化所发送报文的数量,如果需要发送一些较小的报文,则需要禁用该算法。Netty 默认禁用
该算法,从而最小化报文传输的延时。
说明一下:这个参数的值,与是否开启 Nagle 算法是相反的,设置为 true 表示关闭,设置为
false 表示开启。通俗地讲,如果要求高实时性,有数据发送时就立刻发送,就设置为 true,如果需
要减少发送次数和减少网络交互次数,就设置为 false。
3、SO_KEEPALIVE
表示底层 TCP 协议的心跳机制。true 为连接保持心跳,默认值为 false。启用
该功能时,TCP 会主动探测空闲连接的有效性。可以将此功能视为 TCP 的心跳机制,需要注意的
是:默认的心跳间隔是 7200s 即 2 小时。Netty 默认关闭该功能。
4、SO_REUSEADDR
设置为 true 时表示地址复用,默认值为 false。有四种情况需要用到这个参数设置:
当有一个有相同本地地址和端口的 socket1 处于 TIME_WAIT 状态时,而我们希望启动的程序的 socket2 要占用该地址和端口。例如在重启服务且保持先前端口时。
有多块网卡或用 IP Alias 技术的机器在同一端口启动多个进程,但每个进程绑定的本地 IP地址不能相同。
单个进程绑定相同的端口到多个 socket(套接字)上,但每个 socket 绑定的 IP 地址不同。
完全相同的地址和端口的重复绑定。但这只用于 UDP 的多播,不用于 TCP。
5、SO_LINGER
表示关闭socket的延迟时间,默认值为-1,表示禁用该功能。-1表示socket.close()方法立即返回,但操作系统底层会将发送缓冲区全部发送到对端。0 表示 socket.close()方法立即返回,操作系统放弃发送缓冲区的数据,直接向对端发送 RST 包,对端收到复位错误。非 0 整数值表示调用 socket.close()方法的线程被阻塞,直到延迟时间到来、发送缓冲区中的数据发送完毕,若超时,则对端会收到复位错误。
6、SO_BACKLOG
表示服务器端接收连接的队列长度,如果队列已满,客户端连接将被拒绝。默认值,在 Windows 中为 200,其他操作系统为 128。
如果连接建立频繁,服务器处理新连接较慢,可以适当调大这个参数.
7、SO_BROADCAST
表示设置广播模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值