1Tomcat如何处理请求
Tomcat内部结构图
- Server:Tomcat最顶层的容器,一个Server可以包含多个Service
- Service:一个Service包含多个Connector和一个Container
- Connector用于处理连接相关的事情,并提供Socket与Request和Response相关的转化
- Container用于封装和管理Servlet,以及具体处理Request请求
- Container包含了四个子容器
- Engine:引擎,用来管理多个站点,一个Service最多只能有一个Engine
- Host:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点。Tomcat目录下整个webapps就是一个Host站点
- Context:代表一个应用程序,对应着平时开发的一套程序,或者一个WEB-INF目录以及下面的web.xml文件。Tomcat中默认的配置下webapps下的每一个文件夹目录都是一个Context
- Wrapper:每一Wrapper封装着一个Servlet
处理URL流程分析
如上图模拟请求http://127.0.0.5:8080/demo/user
,流程如下:
- 客户端(或游览器)发送请求至主机的端口8080, 被tomcat在该端口中监听的http/1.1 connector 8080所接收
- Connector将该请求交给它所在的service中的engine来负责处理,并等待engine的回应
- Engine获得请求之后从报文头提取主机名称(127.0.0.5), 在所有虚拟主机Host当中寻找匹配
- 在未匹配到同名虚拟主机的情况下,Engine将该请求交给名为localhost的默认虚拟主机Host处理
- Host获得请求之后将根据URL
(/demo/user)
中的context-path的取值/demo
去匹配它拥有的所有context,将请求交给代表应用demo的context去处理; - context会去构建httpservletrequest和httpservletresponse对象,将其作为参数调用应用demo,由应用完成业务逻辑执行、结果数据存储等过程,等待应用数据;
- context接收到应用返回的httpservletresponse对象之后返回给host;
- host将httpservletresponse对象返回给engine;
- engine将httpservletresponse对象返回给connector;
- connector将httpservletresponse对象返回给客户端(或游览器)