1.Tomcat整体结构和组件
Server: 代表Tomcat的一个运行实例,一个JVM中只包含一个Server。
包含关系:
- Listener,为了方便拓展
- GlobalNamingResources,为了集成JNDI
- 多个Service组件
Service: 服务的抽象,代表请求从接受到处理的所有组件的集合。
包含关系:
- 若干Connector组件,用于接收客户端消息
- 一个Engine组件,处理客户端消息
- 若干Executor,为Service内所有组件提供线程池执行任务
Connector:接收客户端连接并接收消息报文,消息报文经由它解析后送往容器中处理。
分类:
-
按协议:HTTP/AJP
-
网络I/O方式:阻塞/非阻塞/APR(JIO/NIO/APR)
包含关系:
- 一个协议组件XXXXProtocol
- Mapper,客户端请求的路由导航组件,通过它能对一个完整的请求地址进行路由,它能通过请求地址找到对应的Servlet。
- CoyoteAdapter,将Connector和Engine连接起来的适配器
HTTP11Protocol:是HTTP协议1.1版本的抽象。包含接受客户端连接,接收客户端消息报文,报文解析处理,对客户端响应等整个过程。
包含关系:
- JIO/NIO/APR Endpoint(包含Acceptor和Executor)
- Processor
工作流程:
Acceptor启动某个端口的监听,一个请求到来后扔进线程池,进行任务处理,处理过程中通过Processor对HTTP协议解析并传到Engine容器继续解析。
Engine:全局Servlet引擎
包含关系:
- 若干Host
- Listener,完成Engine相关工作的监听器。
- AccessLog, 客户端访问日志,所有客户端访问都会被记录。
- Cluster, 提供集群功能,共享Engine内数据到集群中的其他Tomcat实例。
- Pipeline,Engine容器对请求进行处理的管道。
- Realm,提供Engine容器级别的用户-密码-权限的数据对象,配合资源认证模块使用
Host组件: 代表虚拟主机,这些虚拟主机可以存放若干Web应用的抽象(Context容器)。
还包含:
- Listenner
- AccessLog,只记录该虚拟主机上的Web应用的访问记录。
- Cluster
- Pipeline
- Realm
Context组件:Web应用的抽象
包含:
- Listenner
- AccessLog
- Pipeline
- Realm
- Loader,Web应用加载器,用于加载Web应用的资源,它要保证不同Web应用之间的资源隔离
- Manager, 会话管理器,维护会话的生成,更新和销毁
- NamingResource, 命名组件,将conf/server.xml和Web应用的context.xml资源和属性映射到内存中
- Mapper
- Wrapper,Servlet相关的包装容器。
Wrapper:对应一个Servlet
包含:
- Servlet
- Pipeline
- ServletPool,当Servlet实现了SingleThreadModel接口时,会在Wrapper中产生 一个Servlet对象池。线程执行时,需要先从对象池中取一个Servlet对象。ServletPool组件能保证Servlet对象的线程安全
2. 请求处理的整体过程
- Tomcat启动,Connector组件的接收器(Acceptor)将会监听是否有客户端套接字连接并接收Socket。
- 一旦监听到客户端连接,则将连接交由线程池Executor处理,开始执行请求响应任务。
- Processor负责从客户端连接中读取消息报文,然后开始解析请求行、请求体。封装成Request对象,方便后面处理时通过Request对象获取HTTP协议相关值。
- Mapper组件根据HTTP协议请求行中的URL属性值和请求头部的Host属性值匹配由哪个Host容器、哪个Context容器、哪个Wrapper容器处理请求,这个过程中根据请求从Tomcat中找到对应的Servlet。然后将路由的结果封装到Request对象中,方便后面处理时通过Request对象选择容器。
- CoyoteAdapter负责将Connector和Engine连接起来,把前面处理过程中生成的请求对象Request和响应对象Response传递给Engine容器中,调用它的管道。
- Engine容器的管道开始处理请求,管道里包含了若干阀门(Valve),每个阀门负责某些处理逻辑。它会调用Host容器的管道。
- Host容器的管道开始处理请求,类似Engine的处理流程。继续调用下层Context容器的管道。
- Context管道处理若干阀门之后,调用Wrapper的管道。
- Wrapper,执行若干阀门之后,会执行该Wrapper对应的Servlet对象的处理方法,对请求进行逻辑处理,将结果输出到客户端。