一个 SpringBoot 项目能处理多少请求?(小心有坑)

发布时间:2026/7/2 5:58:21
一个 SpringBoot 项目能处理多少请求?(小心有坑) 能处理多少呢我也不知道但是当问题变成上面这样之后我找到了探索答案的角度。既然“未进行任何特殊配置”那我自己搞个 Demo 出来压一把不就完事了吗坐稳扶好准备发车。Demo小手一抖先搞个 Demo 出来。这个 Demo 非常的简单就是通过 idea 创建一个全新的 SpringBoot 项目就行。我的 SpringBoot 版本使用的是 2.7.13。整个项目只有这两个依赖整个项目也只有两个类要得就是一个空空如也一清二白。项目中的 TestController里面只有一个 getTest 方法用来测试方法里面接受到请求之后直接 sleep 一小时。目的就是直接把当前请求线程占着这样我们才能知道项目中一共有多少个线程可以使用Slf4j RestController public class TestController { GetMapping(/getTest) public void getTest(int num) throws Exception { log.info({} 接受到请求:num{}, Thread.currentThread().getName(), num); TimeUnit.HOURS.sleep(1); } }项目中的 application.properties 文件也是空的这样一个“未进行任何特殊配置”的 SpringBoot 不就有了吗基于这个 Demo前面的面试题就要变成了我短时间内不断的调用这个 Demo 的 getTest 方法最多能调用多少次问题是不是又变得更加简单了一点那么前面这个“短时间内不断的调用”用代码怎么表示呢很简单就是在循环中不断的进行接口调用就行了。public class MainTest { public static void main(String[] args) { for (int i 0; i 1000; i) { int finalI i; new Thread(() - { HttpUtil.get(127.0.0.1:8080/getTest?num finalI); }).start(); } //阻塞主线程 Thread.yield(); } }当然了这个地方你用一些压测工具比如 jmeter 啥的会显得逼格更高更专业。我这里就偷个懒直接上代码了。答案经过前面的准备工作Demo 和测试代码都就绪了。接下来就是先把 Demo 跑起来然后跑一把 MainTest。当 MainTest 跑起来之后Demo 这边就会快速的、大量的输出这样的日志也就是我前面 getTest 方法中写的日志好现在我们回到这个问题我短时间内不断的调用这个 Demo 的 getTest 方法最多能调用多少次来请你告诉我怎么得到这个问题的答案我这里就是一个大力出奇迹直接统计“接受到请求”关键字在日志中出现的次数就行了很显然答案就是所以当面试官问你一个 SpringBoot 项目能同时处理多少请求你装作仔细思考之后笃定的说200 次。面试官微微点头并等着你继续说下去。你也暗自欢喜幸好看了歪歪歪师傅的文章背了个答案。然后等着面试官继续问其他问题。气氛突然就尴尬了起来。接着你就回家等通知了。200 次这个回答是对的但是你只说 200 次这个回答就显得有点尬了。重要的是这个值是怎么来的所以下面这一部分你也要背下来。怎么来的在开始探索怎么来的之前我先问你一个问题这个 200 个线程是谁的线程或者说是谁在管理这个线程是 SpringBoot 吗肯定不是SpringBoot 并不是一个 web 容器。应该是 Tomcat 在管理这 200 个线程。这一点我们通过线程 Dump 也能进行验证通过线程 Dump 文件我们可以知道大量的线程都在 sleep 状态。而点击这些线程查看其堆栈消息可以看到 Tomcat、threads、ThreadPoolExecutor 等关键字at org.apache.Tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791) at org.apache.Tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at org.apache.Tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.Tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.Tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)基于“短时间内有 200 个请求被立马处理的”这个现象结合你背的滚瓜烂熟的、非常扎实的线程池知识你先大胆的猜一个Tomcat 默认核心线程数是 200。接下来我们就是要去源码里面验证这个猜测是否正确了。我之前分享过阅读源码的方式《我试图通过这篇文章教会你一种阅读源码的方式。》其中最重要的一条就是打一个有效的断点然后基于断点处的调用栈去定位源码。这里我再教你一个不用打断点也能获取到调用栈的方法。在前面已经展示过了就是线程 Dump。右边就是一个线程完整的调用栈从这个调用栈中由于我们要找的是 Tomcat 线程池相关的源码所以第一次出现相关关键字的地方就是这一行org.apache.Tomcat.util.threads.ThreadPoolExecutor.Worker#run然后我们在这一行打上断点。重启项目开始调试。进入 runWorker 之后这部分代码看起来就非常眼熟了简直和 JDK 里面的线程池源码一模一样。如果你熟悉 JDK 线程池源码的话调试 Tomcat 的线程池那个感觉就像是回家一样。如果你不熟悉的话我建议你尽快去熟悉熟悉。随着断点往下走在 getTask 方法里面可以看到关于线程池的几个关键参数org.apache.Tomcat.util.threads.ThreadPoolExecutor#getTask