一、Jetty的整体架构
Jetty也是一个开源的Servlet容器,也是用Java编写的,比Tomcat更轻量级。主要由Connector
组件实现HTTP服务器功能和Handler
组件实现Servlet容器功能,以及一个全局的线程池。如下图:
Jetty中的多个Connector
监听不同的端口,并对请求进行处理然后转发到Handler
。Jetty中Handler
也有不同的类型,例如支持Servlet的Servlethandler
。在org.eclipse.jetty.server.Server#doStart
方法中启动Connector
和Handler
。
Tomcat 中设计了两个核心组件连接器(Connector)和容器(Container)来分别做这两件事情。连接器负责对外交流,容器负责内部处理
-
Jetty与Tomcat不同,Tomcat在连接器和容器之上又设计一个Service来管理,可以配置多个Service,每个Service又可以配置多个连接器,但是Jetty没有Service。
-
Tomcat中每个Service中的连接器是隔离的,Jetty中的
Connector
是可以被多个Handler
共享的。 -
Tomcat中每个连接器都有自己的一个线程池,Jetty的线程池是共享的,
Connector
和Handler
共同使用一个全局线程池。
可了解Tomcat的连接器:一步步带你了解Tomcat中的连接器是如何设计的
二、Connector组件
Connector
组件主要的功能就是对I/O模型和应用层协议进行封装,在Github上拉取Jetty的最新代码发现仅支持NIO。
在连接器的具体实现类上也表示:HTTP connector using NIO ByteChannels and Selectors
(使用NIO的ByteChannels和Selector实现的HTTP连接器)
|
|
那NIO我们都知道是基于Channel、Buffer和Selector操作的。Channel相当于一个连接,把写入或读取数据到Buffer,并不直接操作数据。数据的操作都是在Buffer上执行的。Selector用来检查Channel上的I/O事件,并且可以处理多个Channel,提高并发能力。
在服务端上使用NIO我们一般需要三个步骤:
1、创建服务端Channel,然后注册到Selector,Selector监听连接
2、I/O事件查询
3、数据读写
这三个步骤在Jetty中通过:Acceptor、SelectorManger、Connection 分别来处理这三件事。
2.1 Acceptor
Acceptor是用于接收请求,Jetty中的Acceptor有独立的线程组用于处理连接请求。在ServerConnector
类中有一个Acceptor数组:_acceptor,在Connector
启动的时候,会根据遍历 _acceptor 的数组长度,创建对应的Acceptor个数。Acceptor是ServerConnector
的内部类,同时还实现了Runnable接口,Acceptor