Tomcat创建
springboot使用的是AnnotationConfigServletWebServerApplicationContext,AnnotationConfigServletWebServerApplicationContext继承了AbstractApplicationContext,
AnnotationConfigServletWebServerApplicationContext重写了AbstractApplicationContext的onRefresh方法,springboot就是在这个方法里创建tomcat
上面这张图的代码就是真正创建一个Tomcat,按照下面图片的结构创建一些组件
Server里面会创建Services,Services里面会有Connector,engine,engine下面会创建host
创建完Tomcat,对tomcat进行初始化,对service和engine等进行初始化
初始化完这些,springboot继续初始化springbean,等springbean初始化完,会调用finishRefresh这个方法,AnnotationConfigServletWebServerApplicationContext重写了这个方法,通过startWebServer()启动tomcat
这里就真正创建完tomcat了,通过Acceptor接收数据,Poller监听事件,交给线程处理
- 创建线程池(10,200)核心线程10,最多线程200
- limitlatch(10000)最大连接数
- Acceptor 线程负责接收连接,调用 accept 方法阻塞接收建立的连接
- Poller会循环监听事件队列(SynchronizedQueue),
整个tomcat就这样创建好了,接下来就是接收数据
Tomcat接收数据
Acceptor接收数据会调用setSocketOptions方法,把SocketChannel注册到PollerEvent阻塞队列里
Poller会循环监听事件队列(SynchronizedQueue)
CoyoteAdapter把socket的数据转成request和response格式的数据,然后差不多就是按Engine->host->context->wapper这个顺序传输数据
到了wrapper进行过滤处理
过滤接口弄好然后就是servlet处理了,看servlet处理那块
Servlet处理数据
servlet.service(request, response);就是通过DispatcherServlet处理数据了,通过service调用doGet,doPost等方法
doDispatch就是开始真正MVC的事情了
然后返回响应,整个过程就这样
SpringMVC流程
springmvc工作流程
1、 用户向服务端发送一次请求,这个请求会先到前端控制器DispatcherServlet(也叫中央控制器)。
2、DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器。由此得知,该请求该由哪个Controller来处理(并未调用Controller,只是得知)
3、DispatcherServlet调用HandlerAdapter处理器适配器,告诉处理器适配器应该要去执行哪个Controller
4、HandlerAdapter处理器适配器去执行Controller并得到ModelAndView(数据和视图),并层层返回给DispatcherServlet
5、DispatcherServlet将ModelAndView交给ViewReslover视图解析器解析,然后返回真正的视图。
6、DispatcherServlet将模型数据填充到视图中
7、DispatcherServlet将结果响应给用户
组件说明
- DispatcherServlet:前端控制器,也称为中央控制器,它是整个请求响应的控制中心,组件的调用由它统一调度。
- HandlerMapping:处理器映射器,它根据用户访问的 URL 映射到对应的后端处理器 Handler。也就是说它知道处理用户请求的后端处理器,但是它并不执行后端处理器,而是将处理器告诉给中央处理器。
- HandlerAdapter:处理器适配器,它调用后端处理器中的方法,返回逻辑视图 ModelAndView 对象。
- ViewResolver:视图解析器,将 ModelAndView 逻辑视图解析为具体的视图(如 JSP)。
- Handler:后端处理器,对用户具体请求进行处理,也就是我们编写的 Controller 类。
Spring Boot 内嵌 Tomcat 性能调优问题:
- 你有哪些方法来优化 Spring Boot 内嵌 Tomcat 的性能?答:性能调优策略可能包括配置连接池以提高数据库连接性能、调整内嵌 Tomcat 的线程池以提高并发性能、启用GZIP压缩、配置静态资源缓存、监控性能指标、使用反向代理和负载均衡等。
- 如何配置内嵌 Tomcat 连接池以提高数据库连接的性能?答:你可以使用Spring Boot的配置属性来配置连接池,如 spring.datasource 下的属性。选择合适的连接池库(如HikariCP)、设置最大连接数、最小空闲连接数和连接超时等参数。
- 如何配置内嵌 Tomcat 的线程池以提高并发性能?答:你可以通过配置Spring Boot属性来调整内嵌 Tomcat 的线程池,如 server.tomcat.* 下的属性。可以设置最大线程数、最小线程数、线程闲置时间等参数。
- 如何配置内嵌 Tomcat 的最大线程数以控制并发请求?答:可以使用 server.tomcat.max-threads 属性来配置内嵌 Tomcat 的最大线程数,以控制并发请求的数量。
- 如何监控 Spring Boot 内嵌 Tomcat 的性能和健康状态?答:可以使用Spring Boot Actuator来监控应用程序的性能和健康状态。它提供了各种端点,如 /actuator/metrics 和 /actuator/health,用于获取性能指标和健康状态信息。
- 如何缓存静态资源以减少服务器负载?答:可以配置Spring Boot的静态资源缓存来减少对静态资源的重复请求。使用HTTP缓存头来控制资源的缓存策略,或者使用CDN(内容分发网络)来加速静态资源的传输。
组件作用
- Server:Server 是 Tomcat 的最高级别组件,它用于管理整个服务器的配置和生命周期。在 Server 下可以包含一个或多个 Service,每个 Service 可以配置不同的网络接口、端口和 Web 应用程序
- Service:Service是Tomcat服务器的一个独立服务,通常监听一个或多个Connector,它包含一个或多个Engine。每个Service代表一个独立的虚拟主机。
- Connector:Connector负责处理客户端与Tomcat服务器之间的通信。它监听指定的网络端口,接收HTTP请求并将其传递给Engine进行处理。Tomcat支持多种Connector,如HTTP、HTTPS、AJP等,每个Connector适用于不同的通信协议。
-
- Http11Protocol->Endpoint
-
-
- Acceptor 线程负责接收连接,调用 accept 方法阻塞接收建立的连接,并对 socket 进行封装成 PollerEvent,指定注册的事件为 op_read,并放入到 EventQueue 队列中,PollerEvent 的 run 方法逻辑的是将 Selector 注册到 socket 的指定事件。
- Poller 线程从 EventQueue 获取 PollerEvent,并执行 PollerEvent 的 run 方法,调用 Selector 的 select 方法,如果有可读的 Socket 则创建 Http11NioProcessor,放入到线程池中执行。
- processKey ->processSocket 线程池负责处理接收的数据
-
- CoyoteAdapter:解析用户发来的HTTP协议信息,将其转化为 Request 和 Response 对象,并将它们传递给 Tomcat 的 Engine 组件。Servlet 处理完请求后,CoyoteAdapter 再次介入,将 Servlet 生成的响应封装到 HTTP 响应中,然后发送回客户端。
- Engine:Engine是一个虚拟主机容器,可以包含多个Host。它用于处理多个虚拟主机的请求,每个虚拟主机都有一个独立的Host配置。
- Host:Host用于定义一个虚拟主机(例如,通过不同的域名访问不同的Web应用程序)。每个Host可以包含多个Context。
- Context:Context代表一个Web应用程序,它包含了Web应用程序的配置信息、Servlet定义和资源映射等。每个Web应用程序都有一个唯一的Context。Context通常对应于一个WAR文件或者一个Web应用程序的根目录。
- Wrapper:Wrapper是一个Servlet的包装器,用于管理和执行Servlet。它可以将多个Servlet映射到同一个Context中,每个Wrapper对应一个Servlet类。
- Filter:调用过滤方法
- Servlet:Servlet是Java应用程序的组件,用于处理HTTP请求和生成HTTP响应。Servlet通常被包装在Web应用程序中,由Servlet容器负责加载、初始化和执行。
-
- 初始化
- service
-
-
- 通过http的不同操作方式GET,DELETE,PUT,POST
- doGet->processRequest->doDispatch->getHandler(mappedHandler)->HandlerAdapter->invokeHandlerMethod->getModelAndView->响应response
-
-
- 销毁
当涉及到面试问题时,提供答案的详细程度通常取决于面试的性质和面试者的经验水平。以下是一些关于 Spring Boot 内嵌 Tomcat 的面试问题以及简要的答案,但请注意,答案可能需要根据实际情况进行详细解释: