springboot emmbed tomcat 扩展及 springmvc 流程

emmbed tomcat

spring emmbed tomcat 核心类是:TomcatServletWebServerFactory

这个核心类是在 org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration.EmbeddedTomcat#tomcatServletWebServerFactory 初始化的

其中 springboot 提供了 ServletWebServerFactoryCustomizer,用于设置一些通用的配置

如 端口、最大header大小、是否优雅停机 等。具体配置在 ServerProperties 类中

提供了 TomcatServletWebServerFactoryCustomizer、TomcatWebServerFactoryCustomizer 用于设置 tomcat 相关的配置

如:最大线程数、最小线程数、acceptCount(即socket backlog)、maxConnections、最大上传文件大小、最大最大请求body大小等。具体配置在 ServerProperties 类中

还有一些配置 springboot 可能没有提供对应的配置项。这时就需要自定义 customizer 来设置配置项了。

springboot 提供了两处扩展点给我们自定义配置

第一个扩展点

org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration.EmbeddedTomcat#tomcatServletWebServerFactory

通过此代码可以看出,我们可以自定义 TomcatConnectorCustomizer、TomcatContextCustomizer、TomcatProtocolHandlerCustomizer来设置相关的配置

第二个扩展点

org.springframework.boot.web.server.WebServerFactoryCustomizerBeanPostProcessor#postProcessBeforeInitialization(org.springframework.boot.web.server.WebServerFactory)

其中有个 getCustomizers() 方法,这里从容器中获取所有的WebServerFactoryCustomizer实现类,我们可以自定义实现类来实现扩展

如可以编写 TomcatPropertiesCustomizer 类来配置 maxKeepAliveRequests 和 keepAliveTimeout

springmvc 流程

  1. 首先是 AbstractProtocol 接受到请求,做了一些处理后
  2. 走 connector pipeline。其中 在 StandardWrapperValve 中会获取所有的 filter(对请求做一些拦截如权限、限流等)。遍历完 filter 之后,就会走 DispatcherServlet 逻辑
  3. 走 DispatcherServlet 逻辑 获取 Handler 执行 handler 的 preHandle 执行 handler 执行 handler 的 postHandle 执行 processDispatchResult(即,如果异常走统一异常切面) 执行 handler 的 afterCompletion

注: 如果2、3 执行异常,处理 4 不会执行,5和6仍然会执行

经验分享 程序员 微信小程序 职场和发展