从源码剖析SpringBoot中Tomcat的默认最大连接数

简介: 上篇推文为什么你的websocket只能建立256个连接?推出后,有许多小伙伴问:关键是怎么解决256这个问题。嗯,可能是我的标题起的有点问题,不过如果有认真阅读文章的话,应该会知道,其实256的限制是Chrome浏览器对WebSocket进行的限制。不过,对于一个客户端来说,假如一个窗口建立一个WebSocket连接的话,想要达到256个连接,需要打开256个窗口,这个一般来说很少出现。所以大家并不需要太多的担心这个前端限制。

上篇推文为什么你的websocket只能建立256个连接?推出后,有许多小伙伴问:关键是怎么解决256这个问题。嗯,可能是我的标题起的有点问题,不过如果有认真阅读文章的话,应该会知道,其实256的限制是Chrome浏览器对WebSocket进行的限制。不过,对于一个客户端来说,假如一个窗口建立一个WebSocket连接的话,想要达到256个连接,需要打开256个窗口,这个一般来说很少出现。所以大家并不需要太多的担心这个前端限制。


不过,谈到请求连接数限制的问题,我们倒是可以将注意力转移到后端的配置上来。上篇推文中有提到在后端配置文件有如下配置用于定义tomcat请求连接数的:


server.tomcat.max-connections=10000

我们设置为10000可见已经挺大的了。但是,当请求由前端到达后端时,除了连接数与之有关外,还有一个关键的配置那就是线程数。tomact设置允许的最大线程数,也在很大程度上影响着我们后端能够处理的请求个数。


不知道大家在开发过程中有没有这种感觉,当我们真的用上新的框架或功能的时候,遇到一些属性参数,虽然我们有进行配置,但是,还是会希望了解在框架中对应配置项的默认值是多少。尤其是SpringBoot这类“约定优于配置”原则的框架,更需要我们花时间去学习。


强哥个人觉得能够保有这种追根溯源的精神,对我们技术的提升还是很有帮助的。毕竟只会CV的码农太多了,而对于CV回来的东西,无法做到胸有成竹的话,当遇到问题时,只会让我们手足无措。


所以,既然我们考虑到了性能问题,那么当我们没有配置最大请求连接数和最大线程数时,SpringBoot默认对这两个属性的配置值又是多少呢?今天强哥就带着大家一起从源码的角度来探寻一番。不过由于SpringBoot发展较为迅速,我们先从稍老的版本说起,毕竟很多公司的项目用SpringBoot2以下的还比比皆是。强哥接下来先带大家查看SpringBoot1.5.9.RELEASE版本的源码。之后再会提到新版本的改动。


那么从哪里入手进行源码追溯呢?于其像无头苍蝇一样到百度上胡乱搜索不如我们从现有的内容出发。那现在有什么呢?没错就是server.tomcat.max-connections=10000这个配置了。使用IDEA的小伙伴,直接按住Ctrl键再移动鼠标到该配置,鼠标左键点击后,便会跳转到如下类方法中:


8.jpg


ServerProperties是SpringBoot为我们提供的一个配置类,这里也简单提一下SpringBoot中的属性配置类。即利用@ConfigurationProperties注解,获取到配置文件中的内容,然后映射到我们的类中:


9.png


从上面的代码我们便可以得知,ServerProperties是用于映射配置文件中以server开头的属性。同理可知,既然server找到映射了,那么server.tomcat.max-connections=10000中的tomcat呢?很简单,就是作为成员变量配置在ServerProperties类中啦:


10.png


你没看错,哈哈,居然还有Jetty相关的内容,是不是发现了新大陆一般。


有的小伙伴在看到这段代码时肯定会有所联想:Tomcat tomcat = new Tomcat(),嗯?这个Tomcat难不成就是SpringBoot自带的那个内嵌Tomcat?原来它的实现就在这里??额,秀儿,请你先坐下。


其实,这个Tomcat并不是什么所谓的内嵌Tomcat,而只是ServerProperties的内部类而已。那么对他设置值又有什么用呢?这就是SpringBoot的精妙之处,通过我们配置文件中配置的server.tomcat.max-connections=10000便能够拿用户自定义的属性值去替换框架默认的属性值。


好的,了解了这点之后,顺藤摸瓜,我们便可以猜到,max-connections肯定就是Tomcat这个内部类的内部属性了:


11.png


哈哈,果然没错,可是默认值居然是0!!什么情况?难不成SpringBoot默认最大连接数为0,这不可能啊,那不是什么请求都收不到了。既然默认设置了0,肯定有其他地方对其进行了修改。带着疑问找一下,在Tomcat类中,除了对该属性的get,set方法(我们配置文件中配置的属性即调用的这个方法对该值就行修改)之外,我们可以在Tomcat类中的customizeTomcat()方法中,找到对maxConnection的修改:


12.png


点进该方法看看:


13.jpg


关键在这句代码:


protocol.setMaxConnections(Tomcat.this.maxConnections);


可见,它就是将我们在配置文件中自定义配置的max-connections的值在这里进行真正的赋值使用的。那么可想而知,默认值就是在protocol之中。我们继续往上摸:


14.jpg


哦吼,setMaxConnections中对endpoint又进行了赋值,那下一个目标就是endpoint咯,endpoint是个成员属性:


15.png


那就继续进入AbstractEndpoint,找与maxConnections相关内容:


16.jpg


哈哈哈,终于我们摸到瓜啦,从上面代码可以看出,maxConnections的默认值就是10000。不容易啊,历经九九八十一难终于修得正果。为自己呱唧呱唧!!!


同理,上下再找找,发现maxThreads也是在此类中设置了默认值:


17.jpg


默认值是200哦。


到此,我们便完成了对SpringBoot 1.5.9.RELEASE版本中tomcat默认最大连接数的源码追寻过程。那么,为什么要特地提到版本号呢?当然是因为新版的会有所不同了。强哥也在SpringBoot 2.2.3.BUILD-SNAPSHOT中找了一下,这两个配置值直接就在ServerPropertise中进行定义了:


18.jpg


19.png


同样默认最大线程数还是200。


到了这里,可能大家又会有疑问了,maxConnections最大值10000可以理解,毕竟一个服务同时保持10000个连接确实资源也就消耗的差不多了,可是,maxThreads却只有200,是不是少了点。加入了WebSocket之后,都是长连接,那不就更不够了?


这个问题就留给下一篇推文吧,今天就先到这里了,如果感觉我的推文对你有帮助的话,欢迎关注、点再看支持一波哦~

相关文章
|
前端开发 Java 关系型数据库
基于Java+Springboot+Vue开发的鲜花商城管理系统源码+运行
基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。技术学习共同进步
823 7
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
1216 1
|
8月前
|
NoSQL Java 网络安全
SpringBoot启动时连接Redis报错:ERR This instance has cluster support disabled - 如何解决?
通过以上步骤一般可以解决由于配置不匹配造成的连接错误。在调试问题时,一定要确保服务端和客户端的Redis配置保持同步一致。这能够确保SpringBoot应用顺利连接到正确配置的Redis服务,无论是单机模式还是集群模式。
696 5
|
9月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
1658 5
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
731 70
|
供应链 JavaScript BI
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
这是一款专为小微企业打造的 SaaS ERP 管理系统,基于 SpringBoot+Vue+ElementUI+UniAPP 技术栈开发,帮助企业轻松上云。系统覆盖进销存、采购、销售、生产、财务、品质、OA 办公及 CRM 等核心功能,业务流程清晰且操作简便。支持二次开发与商用,提供自定义界面、审批流配置及灵活报表设计,助力企业高效管理与数字化转型。
921 2
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
|
机器学习/深度学习 数据采集 人机交互
springboot+redis互联网医院智能导诊系统源码,基于医疗大模型、知识图谱、人机交互方式实现
智能导诊系统基于医疗大模型、知识图谱与人机交互技术,解决患者“知症不知病”“挂错号”等问题。通过多模态交互(语音、文字、图片等)收集病情信息,结合医学知识图谱和深度推理,实现精准的科室推荐和分级诊疗引导。系统支持基于规则模板和数据模型两种开发原理:前者依赖人工设定症状-科室规则,后者通过机器学习或深度学习分析问诊数据。其特点包括快速病情收集、智能病症关联推理、最佳就医推荐、分级导流以及与院内平台联动,提升患者就诊效率和服务体验。技术架构采用 SpringBoot+Redis+MyBatis Plus+MySQL+RocketMQ,确保高效稳定运行。
849 0
|
小程序 Java 关系型数据库
weixin117新闻资讯系统设计+springboot(文档+源码)_kaic
本文介绍了一款基于微信小程序的新闻资讯系统,涵盖其开发全过程。该系统采用Java的SSM框架进行后台管理开发,使用MySQL作为本地数据库,并借助微信开发者工具确保稳定性。管理员可通过个人中心、用户管理等功能模块实现高效管理,而用户则能注册登录并查看新闻与视频内容。系统设计注重可行性分析(技术、经济、操作),强调安全性与数据完整性,界面简洁易用,功能全面,极大提升了信息管理效率及用户体验。关键词包括基于微信小程序的新闻资讯系统、SSM框架和MYSQL数据库。
|
小程序 JavaScript Java
基于SpringBoot的智慧停车场微信小程序源码分享
智慧停车场微信小程序主要包含管理端和小程序端。管理端包括停车场管理,公告信息管理,用户信息管理,预定信息管理,用户反馈管理等功能。小程序端包括登录注册,预约停车位,停车导航,停车缴费,用户信息,车辆信息,钱包充值,意见反馈等功能。
1020 5
基于SpringBoot的智慧停车场微信小程序源码分享
|
监控 前端开发 Java
SpringBoot集成Tomcat、DispatcherServlet
通过这些配置,您可以充分利用 Spring Boot 内置的功能,快速构建和优化您的 Web 应用。
1271 21