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 流程
- 首先是 AbstractProtocol 接受到请求,做了一些处理后
- 走 connector pipeline。其中 在 StandardWrapperValve 中会获取所有的 filter(对请求做一些拦截如权限、限流等)。遍历完 filter 之后,就会走 DispatcherServlet 逻辑
- 走 DispatcherServlet 逻辑 获取 Handler 执行 handler 的 preHandle 执行 handler 执行 handler 的 postHandle 执行 processDispatchResult(即,如果异常走统一异常切面) 执行 handler 的 afterCompletion
注: 如果2、3 执行异常,处理 4 不会执行,5和6仍然会执行
