1.项目源码结构
2.Tomcat源码结构
1.在javax中保存的是新的JavaEE规范。可以具体来看看每个目录的作用。
模块 | 作用说明 |
annotation | annotation 这个模块的作用是定义了一些公用的注解,避免在不同的规范中定义相同的注解 |
ejb | ejb是个古老的传说,我们不管 |
el | 在jsp中可以使用EL表达式,这么模块解析EL表达式的 |
和邮件相关的规范 | |
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