首页 > 编程语言 >Tomcat源码解析(二)

Tomcat源码解析(二)

时间:2024-03-26 14:24:01浏览次数:35  
标签:容器 请求 Tomcat 虚拟主机 源码 Context 解析 Servlet

 1.项目源码结构

2.Tomcat源码结构

 

1.在javax中保存的是新的JavaEE规范。可以具体来看看每个目录的作用。

模块 作用说明
annotation annotation 这个模块的作用是定义了一些公用的注解,避免在不同的规范中定义相同的注解
ejb ejb是个古老的传说,我们不管
el 在jsp中可以使用EL表达式,这么模块解析EL表达式的
mail 和邮件相关的规范
persistence 持久化相关的
security 和安全相关的内容
servlet 这个指定的是Servlet的开发规范,Tomcat本质上就是一个实现了Servlet规范的一个容器,Servlet定义了服务端处理Http请求和响应的方式(规范)
websocket 定义了使用 websocket 协议的服务端和客户端 API
xml.ws 定义了基于 SOAP 协议的 xml 方式的 web 服务

 

2.org.apache这个包是Tomcat的源码包,也是针对上面的JavaEE规范的部分实现,Tomcat的本质就是对JavaEE的某些规范的实现合集,首先肯定实现了Servlet规范

模块 作用说明
catalina catalina是Tomcat的核心模块,里面完整的实现了Servlet规范,Tomcat启动的主方法也在里面,后面我们分析的重点。
coyote tomcat 的核心代码,负责将网络请求转化后和 Catalina 进行通信。
el 这个是上面javax中的el规范的实现。
jasper 主要负责把jsp代码转换为java代码。
juli 日志相关的工具。
naming 命名空间相关的内容。
tomcat 各种辅助工具,包括 websocket 的实现。

3.Tomcat架构图

1.组件

  Server:表示一个Tomcat实例 (单例的);Server代表整个catalina servlet容器;包含一个或多个service子容器。主要是用来管理容器下各个Serivce组件的生命周期。

  Service:代表Tomcat中一组提供服务、处理请求的组件。是一个分组结构,包括多个Connector和一个Container。

  Connector:是客户端连接到Tomcat容器的服务点,定义监听的IP地址、端口号、所支持的协议,并发处理传入请求的最大线程数、IO模型以及线程池等。

  Container:是容器的父接口,用于封装和管理Servlet,以及具体处理Request请求,该容器的设计用的是典型的责任链的设计模式,它由四个自容器组件构成,分别是Engine、Host、Context、Wrapper。这四个组件是负责关系,存在包含关系。只包含一个引擎。

     Engine 引擎:表示可运行的Catalina的servlet引擎实例,并且包含了servlet容器的核心功能。在一个服务中只能有一个引擎。同时,作为一个真正的容器,Engine元素之下可以包含一个或多个虚拟主机。它主要功能是将传入请求委托给适当的虚拟主机处理。如果根据名称没有找到可处理的虚拟主机,那么将根据默认的Host来判断该由哪个虚拟主机处理。

  Host 虚拟主机:作用就是运行多个应用,它负责安装和展开这些应用,并且标识这个应用以便能够区分它们。它的子容器通常是 Context。一个虚拟主机下都可以部署一个或者多个Web App,每个Web App对应于一个Context,当Host获得一个请求时,将把该请求匹配到某个Context上,然后把该请求交给该Context来处理。主机组件类似于Apache中的虚拟主机,但在Tomcat中只支持基于FQDN(完全合格的主机名)的“虚拟主机”。Host主要用来解析web.xml。

  Context上下文:代表 Servlet 的 Context,它具备了 Servlet 运行的基本环境,它表示Web应用程序本身。Context 最重要的功能就是管理它里面的 Servlet 实例,一个Context对应于一个Web Application,一个Web Application由一个或者多个Servlet实例组成。

  Wrapper包装器: 代表一个 Servlet,它负责管理一个 Servlet,包括的 Servlet 的装载、初始化、执行以及资源回收。Wrapper 是最底层的容器,它没有子容器了,所以调用它的 addChild 将会报错。

  Mapper:映射关系最核心的、最重要的类。完成url与Host,Context,Wrapper映射关系的初始化、变更、存储及映射

    Valve阀门:类似于Servlet规范中定义的过滤器,用来拦截请求并在将其转至目标之前进行某种处理操作。Valve可以定义在任何容器类的组件中。Valve常被用来记录客户端请求、客户端IP地址和服务器等信息,这种处理技术通常被称作请求转储(request dumping)。请求转储valve记录请求客户端请求数据包中的HTTP首部信息和cookie信息文件中,响应转储valve则记录响应数据包首部信息和cookie信息至文件中。

四.客户端请求运行架构图

1.协议类说明

  Protocal:根据协议和IO模型不同实现,Http11Protocal使用阻塞IO,Http11NioProtocal使用非阻塞IO,服务器端使用Socket类和ServerSocket类负责请求的接入。

  Acceptor:负责接收socket,然后从线程池中找出空闲的线程处理socket,如果线程池没有空闲线程,则Acceptor将阻塞。

  NIoEndpoint:将Acceptor接收socket后,不是直接放到线程池中处理,而是先将socket封装为一个Channel放进Poller的通道队列中,而Poller是实现NIO的关键,在Poller中,维护了一个Selector选择器对象,Poller从通道队列中取出socket后注册到该Selector中,然后通过Selector轮询,找出其中可读的socket,并放到线程池中进行后续处理。
  Processor:负责从Socket中解析出对应协议格式的数据并封装为Request 或者反向。然后通过适配器Adapter将Request转换为标准的ServletRequest传递给Servlet容器进行处理。

  CoyoteAdapter:会先将Request对象转化成Servlet Request对象再去调用容器的service方法,相当于作了一层适配,CoyoteAdapter的service方法返回后,Processor组件就拿到了Response对象,可以返回响应给用户了。

2.Container接口实现

 

标签:容器,请求,Tomcat,虚拟主机,源码,Context,解析,Servlet
From: https://www.cnblogs.com/double-efficiency/p/18095933

相关文章