五、Jetty的Connector连接器组件

一、Jetty的整体架构

Jetty也是一个开源的Servlet容器,也是用Java编写的,比Tomcat更轻量级。主要由Connector组件实现HTTP服务器功能和Handler组件实现Servlet容器功能,以及一个全局的线程池。如下图:

Jetty中的多个Connector监听不同的端口,并对请求进行处理然后转发到Handler。Jetty中Handler也有不同的类型,例如支持Servlet的Servlethandler。在org.eclipse.jetty.server.Server#doStart方法中启动ConnectorHandler

Tomcat 中设计了两个核心组件连接器(Connector)和容器(Container)来分别做这两件事情。连接器负责对外交流,容器负责内部处理

  • Jetty与Tomcat不同,Tomcat在连接器和容器之上又设计一个Service来管理,可以配置多个Service,每个Service又可以配置多个连接器,但是Jetty没有Service

  • Tomcat中每个Service中的连接器是隔离的,Jetty中的Connector是可以被多个Handler共享的。

  • Tomcat中每个连接器都有自己的一个线程池,Jetty的线程池是共享的,ConnectorHandler共同使用一个全局线程池。

可了解Tomcat的连接器:一步步带你了解Tomcat中的连接器是如何设计的

二、Connector组件

Connector组件主要的功能就是对I/O模型和应用层协议进行封装,在Github上拉取Jetty的最新代码发现仅支持NIO。

在连接器的具体实现类上也表示:HTTP connector using NIO ByteChannels and Selectors(使用NIO的ByteChannels和Selector实现的HTTP连接器)

1
2
3
4
5
@ManagedObject("HTTP connector using NIO ByteChannels and Selectors")
public class ServerConnector extends AbstractNetworkConnector
{
    ...
}

那NIO我们都知道是基于Channel、Buffer和Selector操作的。Channel相当于一个连接,把写入或读取数据到Buffer,并不直接操作数据。数据的操作都是在Buffer上执行的。Selector用来检查Channel上的I/O事件,并且可以处理多个Channel,提高并发能力。

在服务端上使用NIO我们一般需要三个步骤:

1、创建服务端Channel,然后注册到Selector,Selector监听连接

2、I/O事件查询

3、数据读写

这三个步骤在Jetty中通过:AcceptorSelectorMangerConnection 分别来处理这三件事。

2.1 Acceptor

Acceptor是用于接收请求,Jetty中的Acceptor有独立的线程组用于处理连接请求。在ServerConnector类中有一个Acceptor数组:_acceptor,在Connector启动的时候,会根据遍历 _acceptor 的数组长度,创建对应的Acceptor个数。Acceptor是ServerConnector的内部类,同时还实现了Runnable接口,Acceptor

2.2 SelectorManger

2.3 Connetion

三、Handler组件

Licensed under CC BY-NC-SA 4.0