Spring Boot Stater Web IO模型源码Trace
本文主要探索spring servlet中的web服务器的IO模型,目的是为了理解和spring webflux中的有什么不同。这里记录的是 spring-boot-stater-web;
结论
IO模型

切入点 大胆 猜测、实践、验证!
SpringBoot的Web服务器启动后,处理请求日志中会看到
[http-nio-xxx-exec-x] 线程名称,我们知道在Java线程Thread的名称是可以设置的,那么就可以尝试IDE全局搜索“http”、“http-nio”、“-exec-”的字符串搜索定位,然后debug断点此处,最后发起一个请求,然后就可以开始尝试探索web服务器的IO模型了。启动
创建
springboot基础配置:spring-boot-autoconfigure-3.3.0.jar
在
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration.class中定义TomcatWebServerFactoryCustomizerConfiguration ,Spring启动时条件加载:@ConditionalOnClass({ Tomcat.class, UpgradeProtocol.class })和@Configuration(proxyBeanMethods = false),同理Jetty、Undertow其他容器也是一样的方式启动从而实现web服务器Bean后面的初始化就是
org.springframework.boot.web.embeddedTomcat的逻辑,也就是WEB服务器启动的核心逻辑初始化
org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory#getWebServer在
org.springframework.boot.autoconfigure.web.embedded.TomcatWebServerFactoryCustomizer会在configureExecutor()中配置org.apache.catalina.core.StandardThreadExecutor 
然后在
org.apache.catalina.core.StandardThreadExecutor#StandardThreadExecutor 创建后创建并初始化org.apache.tomcat.util.threads.ThreadPoolExecutor#ThreadPoolExecutor 线程池最后随着Tomcat的启动在
org.apache.tomcat.util.net.NioEndpoint#startInternal 中完成启动web服务器 server.port 监听运行时
- 在
org.apache.tomcat.util.net.NioEndpoint.Poller#run中循环监听,然后processKey(sk, socketWrapper);处理请求
相关源码
org.apache.tomcat.util.net.NioEndpoint.Poller#processKey,到processSocket中处理socket
相关源码
org.apache.tomcat.util.net.AbstractEndpoint#processSocket,提交executor.execute(sc);请求
相关源码
作者:A-Persimmons
声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
Previous
UML类图详解
Next
常用软件工具问题汇总