Netty Bootstrap(图解)|秒懂 (2)

代码如下:

try { //1 设置reactor 线程 b.group(bossLoopGroup, workerLoopGroup); //2 设置nio类型的channel b.channel(NioServerSocketChannel.class); //3 设置监听端口 b.localAddress(new InetSocketAddress(port)); //4 设置通道选项 b.option(ChannelOption.SO_KEEPALIVE, true); b.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); //5 装配流水线 b.childHandler(new ChannelInitializer<SocketChannel>() { //有连接到达时会创建一个channel protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new ProtobufDecoder()); ch.pipeline().addLast(new ProtobufEncoder()); // pipeline管理channel中的Handler // 在channel队列中添加一个handler来处理业务 ch.pipeline().addLast("serverHandler", serverHandler); } }); // 6 开始绑定server // 通过调用sync同步方法阻塞直到绑定成功 ChannelFuture channelFuture = b.bind().sync(); LOGGER.info(ChatServer.class.getName() + " started and listen on " + channelFuture.channel().localAddress()); // 7 监听通道关闭事件 // 应用程序会一直等待,直到channel关闭 ChannelFuture closeFuture= channelFuture.channel().closeFuture(); closeFuture.sync(); } catch (Exception e) { e.printStackTrace(); } finally { // 8 优雅关闭EventLoopGroup, // 释放掉所有资源包括创建的线程 workerLoopGroup.shutdownGracefully(); bossLoopGroup.shutdownGracefully(); }

接下来就是精彩的8个步骤

1:设置reactor 线程组

​ 在设置 reactor 反应器线程组之前,创建了两个 NioEventLoopGroup 线程组:

bossLoopGroup 表示服务器连接监听线程组,专门接受 accept 新的客户端client 连接

workerGroup 表示处理每一条连接的数据收发的线程组

在线程组和启动器都创建完成后,就可以开始设置线程组:通过 b.group(bossGroup, workerGroup) 方法,给引导器配置两大线程组。

配置完成之后,整个引导类的 reactor 线程正式确定。这里确定的工作模式,为父子线程的模型。

也可以不设置两个线程组,只设置一个线程组。

如果只设置一个线程组,具体的方法为 —— b.group( workerGroup) 。

配置完成一个线程组,则所有的 channel ,包括服务监听通道父亲channel 和所有的子channel ,都工作在同一个线程组中。

说明一下,一个线程组,可不止一条线程哈。

在这里插入图片描述

2 :设置通道的IO类型

Netty 不止支持 Java NIO ,也支持阻塞式的 BIO (在Netty 中 叫做OIO)。

这里配置的是NIO,方法如下。

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

如果想指定 IO 模型为 BIO,那么这里配置上Netty的 OioServerSocketChannel.class 类型即可。由于NIO 的优势巨大,通常不会在Netty中使用BIO。

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

这是最为简单的一步操作。

4:设置通道参数

childOption() 方法

给每条child channel 连接设置一些TCP底层相关的属性,比如上面,我们设置了两种TCP属性,其中 ChannelOption.SO_KEEPALIVE表示是否开启TCP底层心跳机制,true为开

option() 方法

对于server bootstrap而言,这个方法,是给parent channel 连接设置一些TCP底层相关的属性。

TCP连接的参数详细介绍如下。

option设置的参数:

SO_RCVBUF ,SO_SNDBUF

这两个选项就是来设置TCP连接的两个buffer尺寸的。

每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区,TCP的全双工的工作模式以及TCP的滑动窗口便是依赖于这两个独立的buffer以及此buffer的填充状态。

SO_SNDBUF
  Socket参数,TCP数据发送缓冲区大小。该缓冲区即TCP发送滑动窗口,linux操作系统可使用命令:cat /proc/sys/net/ipv4/tcp_smem 查询其大小。

TCP_NODELAY
  TCP参数,立即发送数据,默认值为Ture(Netty默认为True而操作系统默认为False)。该值设置Nagle算法的启用,改算法将小的碎片数据连接成更大的报文来最小化所发送的报文的数量,如果需要发送一些较小的报文,则需要禁用该算法。Netty默认禁用该算法,从而最小化报文传输延时。

​ 这个参数,与是否开启Nagle算法是反着来的,true表示关闭,false表示开启。通俗地说,如果要求高实时性,有数据发送时就马上发送,就关闭,如果需要减少发送次数减少网络交互,就开启。

SO_KEEPALIVE
  底层TCP协议的心跳机制。Socket参数,连接保活,默认值为False。启用该功能时,TCP会主动探测空闲连接的有效性。可以将此功能视为TCP的心跳机制,需要注意的是:默认的心跳间隔是7200s即2小时。Netty默认关闭该功能。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppxzg.html