关于Netty配置的ServerBootstrap.option()和ServerBootstrap.childOption()
option主要是针对boss线程组,child主要是针对worker线程组
1、option/handler/attr方法
option: 设置通道的选项参数,对于服务端而言就是ServerSocketChannel,客户端而言就是SocketChannel;
handler: 设置主通道的处理器,对于服务端而言就是ServerSocketChannel,也就是用来处理Acceptor的操作;对于客户端的SocketChannel,主要是用来处理业务操作;
attr: 设置通道的属性;
option/handler/attr方法都定义在AbstractBootstrap中, 所以服务端和客户端的引导类方法调用都是调用的父类的对应方法。
2、childHandler/childOption/childAttr方法(只有服务端ServerBootstrap才有child类型的方法)
对于服务端而言,有两种通道需要处理,一种是ServerSocketChannel:用于处理用户连接的accept操作, 另一种是SocketChannel,表示对应客户端连接。而对于客户端,一般都只有一种channel,也就是SocketChannel。
因此以child开头的方法,都定义在ServerBootstrap中,表示处理或配置服务端接收到的对应客户端连接的SocketChannel通道。
3、服务端由两种线程池,用于Acceptor的React主线程和用于I/O操作的React从线程池; 客户端只有用于连接及IO操作的React的主线程池;
4、ServerBootstrap中定义了服务端React的"从线程池"对应的相关配置,都是以child开头的属性。 而用于"主线程池"channel的属性都定义在AbstractBootstrap中;
channelOption含义
ChannelOption.SO_BACKLOG
:用于设置TCP套接字的连接队列大小。指定等待接受的连接的最大数量。
ChanneOption.SO_REUSEADDR
: 对应于套接字选项中的SO_REUSEADDR,这个参数表示允许重复使用本地地址和端口,比如,某个服务器进程占用了TCP的80端口进行监听,此时再次监听该端口就会返回错误,使用该参数就可以解决问题,该参数允许共用该端口,这个在服务器程序中比较常使用,比如某个进程非正常退出,该程序占用的端口可能要被占用一段时间才能允许其他进程使用,而且程序死掉以后,内核一需要一定的时间才能够释放此端口,不设置SO_REUSEADDR
就无法正常使用该端口。
Channeloption.SO_KEEPALIVE
: 用于启用或禁用TCP的KeepAlive机制。当设置为true时,TCP会定期发送KeepAlive探测包,用于检测连接是否仍然有效,一般是两小时。
ChannelOption.SO_SNDBUF
和ChannelOption.SO_RCVBUF
: 参数对应于套接字选项中的SO_SNDBUF
,ChannelOption.SO_RCVBUF
参数对应于套接字选项中的SO_RCVBUF
这两个参数用于操作接收缓冲区和发送缓冲区的大小,接收缓冲区用于保存网络协议站内收到的数据,直到应用程序读取成功,发送缓冲区用于保存发送数据,直到发送成功。
ChannelOption.SO_LINGER
: 参数对应于套接字选项中的SO_LINGER
,Linux内核默认的处理方式是当用户调用close()方法的时候,函数返回,在可能的情况下,尽量发送数据,不一定保证会发生剩余的数据,造成了数据的不确定性,使用SO_LINGER
可以阻塞close()的调用时间,直到数据完全发送
ChannelOption.TCP_NODELAY
: 控制是否启用Nagle算法。Nagle算法通过将小的数据块组合成更大的数据块来减少网络传输,从而提高效率。当设置为true时,禁用Nagle算法,即使用小的数据块发送数据。
ChannelOption.SO_TIMEOUT
: 设置Socket的超时时间。用于设置读取或写入操作的超时时间。
ChannelOption.ALLOCATOR
: 设置ByteBuf的分配器。可以配置为PooledByteBufAllocator.DEFAULT
以启用内存池。