3.3 引导程序:是什么和为什么

Netty中的引导程序是配置Netty应用程序的过程。当需要将客户端连接到某些主机和端口,或将服务器绑定到给定的端口时,可以使用引导程序。正如前面的陈述所暗示的,Bootstrap有两种类型,一种通常用于客户端,但也用于DatagramChannel(简称为Bootstrap),另一种用于服务器(简称为ServerBootstrap)。无论您的应用程序使用哪种协议,决定您使用哪个引导程序的唯一决定因素是您是否尝试创建客户端或服务器。两种类型的引导程序之间有很多相似之处,实际上,相似之处多于区别。表3.1显示了两者之间的一些关键相似点和不同点。

Similarities

Bootstrap

ServerBootstrap

Responsible for

Connects to a remote host and port

Binds to local port

Number of EventLoopGroups

1

2

Groups, transports 和handlers在本章的后面分别介绍,因此我们只看一下Bootstrap类型之间的主要区别。第一个区别应该很明显。 ServerBoostrap绑定到端口,因为当Bootstrap用于客户端应用程序或DatagramChannel时,服务器必须侦听连接。使用Bootstrap类,通常可以调用connect(),但是也可以调用bind(),然后稍后使用从bind()返回的ChannelFuture中包含的Channel进行连接。

第二个差异也许是最重要的。客户端引导程序/应用程序使用单个EventLoopGroup,而ServerBootstrap使用2个(实际上可以是同一实例)。关于为什么会这样,可能不是立即显而易见的,但这是一个很好的理由。可以将ServerBootstrap视为具有两组通道。第一组包含单个ServerChannel,该ServerChannel表示已绑定到本地端口的服务器自己的套接字。第二组包含代表服务器已接受的连接的所有Channel。如图3.3。

Figure 3.3 - Represents the distinction between server and client groups

在图3.3中,EventLoopGroup A的唯一目的是接受连接并将其移交给EventLoopGroup B。Netty之所以能够使用两组不同的组,是因为在应用程序接受大量连接的情况下,如果EventLoop忙于处理已经接受的连接,因此无法在合理的时间内接受新的连接,则单个EventLoopGroup将成为瓶颈。最终结果将是某些连接超时。通过具有两个EventGroup,即使在极高的负载下也可以接受所有连接,因为EventLoops(以及基础线程)接受连接不会与已经接受的连接共享。

EventLoopGroup and EventLoop

EventLoopGroup可能包含一个以上的EventLoop,但如果包含,则取决于配置。一旦创建,每个通道将具有一个EventLoop绑定,该绑定永远不会改变。因为EventLooopGroup包含的EventLoop自然更少,所以您拥有多个Channel的Channel数量将共享同一EventLoop。这意味着让一个通道中的EventLoop保持繁忙状态将不允许处理绑定到同一EventLoop的其他Channel。这就是为什么在任何情况下都不得阻塞EventLoop的原因之一。

图3.4显示了如果您决定使用同一EventLoopGroup实例配置Netty服务器。

Figure 3.4  Netty server configured with only 1 EventLoopGroup

Netty允许将同一EventLoopGroup用于处理IO和接受连接。实际上,这对于许多应用程序都适用。图3.4中表示了这种情况,其中一个组既接受连接又处理IO。在下一节中,我们将讨论Netty如何以及何时执行IO操作。

最后更新于

这有帮助吗?