SpringBoot默认200个线程对于Websocket长连接够用吗?(一)

简介: 上篇推文从源码剖析SpringBoot中Tomcat的默认最大连接数中我们知道,SpringBoot的内嵌Tomcat默认的最大连接数为200。那么,这个默认值对于项目中引入了WebSocket使用长连接后,是否足够用呢?今天强哥就带大家一起从源码的角度来分析一下。

上篇推文从源码剖析SpringBoot中Tomcat的默认最大连接数中我们知道,SpringBoot的内嵌Tomcat默认的最大连接数为200。那么,这个默认值对于项目中引入了WebSocket使用长连接后,是否足够用呢?今天强哥就带大家一起从源码的角度来分析一下。


我们还是从上一篇推文给的代码入手(需要源码的小伙伴可后台回复:WebSocket获取)。强哥想了想,要判断200个线程是否够,可能并不是那么好量化,不如我们就先配置1个线程入手看看效果如何:


server.tomcat.max-threads=1


然后启动项目,前端试试来5个WebSocket请求是否可以成功连上:


20.png


没问题,都连上了。为了节省篇幅,我们直接来Chrome浏览器最大限制的WebSocket个数256:


21.png


同样也是可以,那么问题来了,为什么这一个线程就可以处理这么多个WebSocket长连接请求呢?


哈哈,想必有一些基础的小伙伴应该能想到:会不会用的是Java NIO来处理的这些请求呢?那么,我们就从源码(本篇涉及的SpringBoot源码版本为:2.2.3.BUILD-SNAPSHOT)入手先来看看这个猜想是否正确。


对于Java NIO不熟悉的同学,今天的另一篇推文强哥也搜了一篇比较优质的科普文,想了解或是复习一下的可以跳过去看看哦。


可是,源码又要从哪里入手呢?当然还是我们上面的那个配置啦。上篇文章中我们知道,按住ctrl然后鼠标点击该配置便能进入对应的ServerProperties配置类中该属性对应的set方法:


22.png


然后,找到maxThreads使用的地方:


23.png


即在customize方法中调用:


24.png


我们进到customizeMaxThreads方法中:


25.png


我们在上篇文章中也见过这个方法,重点来了,AbstractProtocol protocol这个便是我们内嵌Tomcat使用的协议。我们在上图位置打个断点然后重启项目试试:


26.png


通过Debug我们可以看出,AbstractProtocol的实现是:Http11NioProtocol,从这个类名称我们便可以很明显的看出确实使用的是NIO,从而也证明了我们前面的猜想。不过,这只是打断点看到的,没看到源码心里还是有点不痛快。怎么从源码里找到这个Http11NioProtocol被设置到内嵌Tomcat中呢。


我们还是留意这个方法,方法是调用了factory的addConnectorCustomizers方法,而该方法的作用从名称上便知道是为了设置用户自定义连接配置的。那么这个factory是什么呢,从类名ConfigurableTomcatWebServerFactory定义上,我们可以猜想,应该是生成内嵌Tomcat的工厂类。


那么,我们就进入这个类一探究竟:


27.png


哦,原来是个接口,有两个实现,用的会是哪个呢?不用多说,还是打断点看一下吧:


28.png


用的是TomcatServletWebServerFactory类,那就进去看看。哈哈,我们在类结构中可以找到一个静态属性DEFAULT_PROTOCOL,其内容恰好是我们Debug的时候protocol显示的内容:org.apache.coyote.http11.Http11NioProtocol。


29.png


而这个静态属性又被赋值给了protocol变量:


30.png


再看看这个protocol的调用:


31.png


我的天,我们看到了什么?


Tomcat tomcat = new Tomcat();


这个不就是SpringBoot内嵌生成的那个Tomcat吗?哈哈哈,原来是在这里,真是有种发现新大陆的感觉。看看他的包路径基本可以确认无疑(并不是我们上篇推文中映射自定义配置用的Tomcat类):


32.png


而那个protocol就是用在了这里啦:


Connector connector = new Connector(this.protocol);


至此,我们就能够证实只设置一个线程却可以同时连接上多个WebSocket请求的原因是由于SpringBoot的内嵌Tomcat是用了Java NIO多路复用来处理请求的。同时,我们也“幸运”地发现了SpringBoot内嵌Tomcat生成的具体位置是在TomcatServletWebServerFactory类中。


不过,爱刨根问底的小伙伴可能又会有所疑问,既然使用的是Java NIO来处理请求,那么一个线程能最多处理多少个请求呢?如果处理的不多的话,默认200个线程不是还是不够用吗?


由于篇幅问题,这些疑问就留在强哥的下一篇推文继续和大家一起探讨啦~


相关文章
|
24天前
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
110 0
|
13天前
|
开发框架 前端开发 网络协议
Spring Boot结合Netty和WebSocket,实现后台向前端实时推送信息
【10月更文挑战第18天】 在现代互联网应用中,实时通信变得越来越重要。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为客户端和服务器之间的实时数据传输提供了一种高效的解决方案。Netty作为一个高性能、事件驱动的NIO框架,它基于Java NIO实现了异步和事件驱动的网络应用程序。Spring Boot是一个基于Spring框架的微服务开发框架,它提供了许多开箱即用的功能和简化配置的机制。本文将详细介绍如何使用Spring Boot集成Netty和WebSocket,实现后台向前端推送信息的功能。
161 1
|
1月前
|
算法 NoSQL Java
Springboot3新特性:GraalVM Native Image Support和虚拟线程(从入门到精通)
这篇文章介绍了Spring Boot 3中GraalVM Native Image Support的新特性,提供了将Spring Boot Web项目转换为可执行文件的步骤,并探讨了虚拟线程在Spring Boot中的使用,包括如何配置和启动虚拟线程支持。
63 9
Springboot3新特性:GraalVM Native Image Support和虚拟线程(从入门到精通)
|
17天前
|
前端开发 Java C++
RSocket vs WebSocket:Spring Boot 3.3 中的两大实时通信利器
本文介绍了在 Spring Boot 3.3 中使用 RSocket 和 WebSocket 实现实时通信的方法。RSocket 是一种高效的网络通信协议,支持多种通信模式,适用于微服务和流式数据传输。WebSocket 则是一种标准协议,支持全双工通信,适合实时数据更新场景。文章通过一个完整的示例,展示了如何配置项目、实现前后端交互和消息传递,并提供了详细的代码示例。通过这些技术,可以大幅提升系统的响应速度和处理效率。
|
27天前
|
Java
SpringBoot线程问题
SpringBoot线程问题
25 0
|
3月前
|
开发框架 网络协议 Java
SpringBoot WebSocket大揭秘:实时通信、高效协作,一文让你彻底解锁!
【8月更文挑战第25天】本文介绍如何在SpringBoot项目中集成WebSocket以实现客户端与服务端的实时通信。首先概述了WebSocket的基本原理及其优势,接着详细阐述了集成步骤:添加依赖、配置WebSocket、定义WebSocket接口及进行测试。通过示例代码展示了整个过程,旨在帮助开发者更好地理解和应用这一技术。
215 1
|
3月前
|
小程序 Java API
springboot 微信小程序整合websocket,实现发送提醒消息
springboot 微信小程序整合websocket,实现发送提醒消息
|
3月前
|
Java UED
基于SpringBoot自定义线程池实现多线程执行方法,以及多线程之间的协调和同步
这篇文章介绍了在SpringBoot项目中如何自定义线程池来实现多线程执行方法,并探讨了多线程之间的协调和同步问题,提供了相关的示例代码。
687 0
|
3月前
|
Java 测试技术
Java SpringBoot Test 单元测试中包括多线程时,没跑完就结束了
Java SpringBoot Test 单元测试中包括多线程时,没跑完就结束了
40 0
|
3月前
|
JavaScript 前端开发 网络协议
WebSocket在Java Spring Boot+Vue框架中实现消息推送功能
在现代Web应用中,实时消息提醒是一项非常重要的功能,能够极大地提升用户体验。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为实现实时消息提醒提供了高效且低延迟的解决方案。本文将详细介绍如何在Java Spring Boot后端和Vue前端框架中利用WebSocket实现消息提醒功能。
132 0