SpringBoot内嵌Tomcat总结

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监听事件,交给线程处理

  1. 创建线程池(10,200)核心线程10,最多线程200

  1. limitlatch(10000)最大连接数

  1. Acceptor 线程负责接收连接,调用 accept 方法阻塞接收建立的连接
  2. 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 性能调优问题:

  1. 你有哪些方法来优化 Spring Boot 内嵌 Tomcat 的性能?答:性能调优策略可能包括配置连接池以提高数据库连接性能、调整内嵌 Tomcat 的线程池以提高并发性能、启用GZIP压缩、配置静态资源缓存、监控性能指标、使用反向代理和负载均衡等。
  2. 如何配置内嵌 Tomcat 连接池以提高数据库连接的性能?答:你可以使用Spring Boot的配置属性来配置连接池,如 spring.datasource 下的属性。选择合适的连接池库(如HikariCP)、设置最大连接数、最小空闲连接数和连接超时等参数。
  3. 如何配置内嵌 Tomcat 的线程池以提高并发性能?答:你可以通过配置Spring Boot属性来调整内嵌 Tomcat 的线程池,如 server.tomcat.* 下的属性。可以设置最大线程数、最小线程数、线程闲置时间等参数。
  4. 如何配置内嵌 Tomcat 的最大线程数以控制并发请求?答:可以使用 server.tomcat.max-threads 属性来配置内嵌 Tomcat 的最大线程数,以控制并发请求的数量。
  5. 如何监控 Spring Boot 内嵌 Tomcat 的性能和健康状态?答:可以使用Spring Boot Actuator来监控应用程序的性能和健康状态。它提供了各种端点,如 /actuator/metrics/actuator/health,用于获取性能指标和健康状态信息。
  6. 如何缓存静态资源以减少服务器负载?答:可以配置Spring Boot的静态资源缓存来减少对静态资源的重复请求。使用HTTP缓存头来控制资源的缓存策略,或者使用CDN(内容分发网络)来加速静态资源的传输。

组件作用

  1. ServerServer 是 Tomcat 的最高级别组件,它用于管理整个服务器的配置和生命周期。在 Server 下可以包含一个或多个 Service,每个 Service 可以配置不同的网络接口、端口和 Web 应用程序
  2. Service:Service是Tomcat服务器的一个独立服务,通常监听一个或多个Connector,它包含一个或多个Engine。每个Service代表一个独立的虚拟主机。
  3. Connector:Connector负责处理客户端与Tomcat服务器之间的通信。它监听指定的网络端口,接收HTTP请求并将其传递给Engine进行处理。Tomcat支持多种Connector,如HTTP、HTTPS、AJP等,每个Connector适用于不同的通信协议。
    1. Http11Protocol->Endpoint
      1. Acceptor 线程负责接收连接,调用 accept 方法阻塞接收建立的连接,并对 socket 进行封装成 PollerEvent,指定注册的事件为 op_read,并放入到 EventQueue 队列中,PollerEvent 的 run 方法逻辑的是将 Selector 注册到 socket 的指定事件。
      2. Poller 线程从 EventQueue 获取 PollerEvent,并执行 PollerEvent 的 run 方法,调用 Selector 的 select 方法,如果有可读的 Socket 则创建 Http11NioProcessor,放入到线程池中执行。
      3. processKey ->processSocket 线程池负责处理接收的数据
  1. CoyoteAdapter:解析用户发来的HTTP协议信息,将其转化为 RequestResponse 对象,并将它们传递给 Tomcat 的 Engine 组件。Servlet 处理完请求后,CoyoteAdapter 再次介入,将 Servlet 生成的响应封装到 HTTP 响应中,然后发送回客户端。
  2. Engine:Engine是一个虚拟主机容器,可以包含多个Host。它用于处理多个虚拟主机的请求,每个虚拟主机都有一个独立的Host配置。
  3. Host:Host用于定义一个虚拟主机(例如,通过不同的域名访问不同的Web应用程序)。每个Host可以包含多个Context。
  4. Context:Context代表一个Web应用程序,它包含了Web应用程序的配置信息、Servlet定义和资源映射等。每个Web应用程序都有一个唯一的Context。Context通常对应于一个WAR文件或者一个Web应用程序的根目录。
  5. Wrapper:Wrapper是一个Servlet的包装器,用于管理和执行Servlet。它可以将多个Servlet映射到同一个Context中,每个Wrapper对应一个Servlet类。
  6. Filter:调用过滤方法
  7. Servlet:Servlet是Java应用程序的组件,用于处理HTTP请求和生成HTTP响应。Servlet通常被包装在Web应用程序中,由Servlet容器负责加载、初始化和执行。
    1. 初始化
    2. service
      1. 通过http的不同操作方式GET,DELETE,PUT,POST
      2. doGet->processRequest->doDispatch->getHandler(mappedHandler)->HandlerAdapter->invokeHandlerMethod->getModelAndView->响应response
    1. 销毁

当涉及到面试问题时,提供答案的详细程度通常取决于面试的性质和面试者的经验水平。以下是一些关于 Spring Boot 内嵌 Tomcat 的面试问题以及简要的答案,但请注意,答案可能需要根据实际情况进行详细解释:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值