当前位置: 首页 > 科技观察

面试官:Tomcat是如何处理Http请求的?

时间:2023-03-19 16:53:02 科技观察

Servlet技术是我们java后端工程师必须要掌握的。这里我们可以把javaweb的技术路线大致概括为如下过程:因为tomcat实现了Servlet规范,所以我们要掌握什么是Servlet?什么是Servlet规范?什么是Servlet?Servlet是JavaEE规范的一种,主要是扩展Java作为Web服务的功能,统一接口。Web功能由其他内部供应商(例如tomcat和jetty)在内部实现。例如,当一个http请求到达时:容器将请求封装成一个HttpServletRequest对象在servlet中,调用init()、service()等方法输出一个response,容器将其包装成一个httpresponse返回给客户端。Servlet规范是什么?从Jar包的角度来看,Servlet规范就是两个Jar文件。servlet-api.jar和jsp-api.jar,Jsp也是一个Servlet。从包的角度来说,就是javax.servlet和javax.servlet.http两个包。在接口方面,标准化了Servlet接口、Filter接口、Listener接口、ServletRequest接口、ServletResponse接口等。类图如下:为什么我们称tomcat为Web容器或Servlet容器?我们用一张图来表示它们之间的关系:简单理解:启动一个ServerSocket,监听8080端口。Servlet容器用于安装我们开发的Servlet。Tomcat架构介绍Tomcat架构图架构图与tomcat中conf下server.xml中内容对比:架构图和服务器。xml内容对比,server.xml是架构图的xml版本,所以我们可以猜测在我们的java代码中应该有对应的类,比如:Listener类,Service类,Host类,Engine类等。这样就可以了后面会详细分析,这里只是猜测一下我们java代码中的实现。看过之前Mybatis源码分析文章的同学应该能猜到这里,这个server.xml配置文件的解析方式,以及这些配置信息是如何存放的。tomcat在启动时,通过读取server.xml配置文件的参数,加载对应的各个组件。同时在文件中配置了tomcat的相关可调参数。实际项目中对tomcat的大部分优化工作都是基于这个配置文件中的参数调整。tomcat组件介绍了server和tomcat的关系。可以理解为启动一个tomcat就是启动一个server。Server组件作为Tomcat最外层的核心组件,主要有以下功能。提供了处理Tomcat整个生命周期中不同事件的监听器机制;提供Tomcat容器的全局命名资源实现;监听某个端口接收SHUTDOWN命令;serviceService代表一个或多个Connector的集合,这些Connector共享同一个Container来处理它们的请求。同一个Tomcat实例中可以包含任意数量的Service实例,并且它们相互独立。Connector用于接受请求,将请求封装成Request和Response,然后交给Container处理。Container处理完后交给Connector,返回给client。ContainerContainer用于封装和管理Servlet,具体处理Request请求;它包括4个主要的请求处理组件:引擎、虚拟主机和上下文组件。Container是容器的父接口,用于封装和管理Servlet,具体处理Request请求。容器的设计是典型的责任链设计模式。它由四个自容器组件组成,分别是Engine、Host、Context、Wrapper。这四个组件存在主管关系和包含关系。仅包含一个引擎。Engine代表整个Servlet引擎。在Tomcat中,Engine是最高级的容器对象。Engine虽然不是直接处理请求的容器,但却是获取目标容器的入口。engine代表一个可运行的Catalinaservlet引擎实例,包含了servlet容器的核心功能。一项服务中只能有一个引擎。同时,作为一个真实的容器,Engine元素可以包含一个或多个虚拟主机Host。Host代表一个站点,也可以称为虚拟主机。可以通过配置主机来添加站点。主机容器是引擎容器的子容器。上面也提到了Host是由Engine容器管理的,Engine容器指的是一个虚拟主机。比如localhost就是我们访问某个特定jsp页面的url中的一个虚拟主机。它的功能是运行多个应用程序。而管理这些应用,它的子容器是Context,一个host也保存了host的相关信息。ContextContext作为一种容器来表示Servletcontext。在Servlet规范中,一个Servletcontext代表一个独立的Web应用程序。代表一个应用程序,对应通常开发的一组程序,或者WEB-INF目录和下面的web.xml文件。WapperWapper作为一种容器,用来表示Web应用中定义的Servlet,每一个Wrapper都封装了这个Servlet。组件关系tomcat的两个核心组件,Connector:主要负责处理Socket连接以及Request和Response的转换。Container:包括Engine、Host、Context和Wrapper,主要负责内部处理和Servlet管理tomcat处理Http请求流程tomcat的整体结构上面说完了,下面说说,假设我们在浏览器输入http://如何localhost:8080/my-web-mave/index.jsp在tomcat中处理这个请求过程:我们的请求发送到本地的8080端口,由那里监听的CoyoteHTTP/1.1Connector获取。Connector将请求交给所属Service的Engine处理,等待Engine的响应。Engine获取请求localhost/my-web-maven/index.jsp,匹配自己拥有的所有虚拟主机。server.xml中我们虚拟主机的默认配置是localhost。Engine匹配name=localhost的Host(即使不匹配,请求也会交给Host处理,因为Host被定义为Engine的默认主机)。localhost主机获取请求/my-web-maven/index.jsp,匹配它拥有的所有上下文。Host匹配路径为/my-web-maven的Context(如果没有匹配到,则将请求交给路径名为“”的Context)。path=”/my-web-maven”的Context获取request/index.jsp,在其映射表中查找对应的servlet。Context匹配URLPATTERN为*.jsp的servlet,对应JspServlet类。构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法。Context将执行后的HttpServletResponse对象返回给Host。Host将HttpServletResponse对象返回给Engine。引擎将HttpServletResponse对象返回给连接器。连接器将HttpServletResponse对象返回给客户端浏览器。流程图:有点模糊。本文转载自微信公众号《Java后端技术全栈》,可通过以下二维码关注。转载本文请联系Java后端技术全栈公众号。