从源码剖析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之后,都是长连接,那不就更不够了?


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

相关文章
|
17天前
|
前端开发 Java 应用服务中间件
从零手写实现 tomcat-08-tomcat 如何与 springboot 集成?
该文是一系列关于从零开始手写实现 Apache Tomcat 的教程概述。作者希望通过亲自动手实践理解 Tomcat 的核心机制。文章讨论了 Spring Boot 如何实现直接通过 `main` 方法启动,Spring 与 Tomcat 容器的集成方式,以及两者生命周期的同步原理。文中还提出了实现 Tomcat 的启发,强调在设计启动流程时确保资源的正确加载和初始化。最后提到了一个名为 mini-cat(嗅虎)的简易 Tomcat 实现项目,开源于 [GitHub](https://github.com/houbb/minicat)。
|
23天前
|
Web App开发 编解码 Java
B/S基层卫生健康云HIS医院管理系统源码 SaaS模式 、Springboot框架
基层卫生健康云HIS系统采用云端SaaS服务的方式提供,使用用户通过浏览器即能访问,无需关注系统的部署、维护、升级等问题,系统充分考虑了模板化、配置化、智能化、扩展化等设计方法,覆盖了基层医疗机构的主要工作流程,能够与监管系统有序对接,并能满足未来系统扩展的需要。
48 4
|
22天前
|
运维 监控 安全
云HIS医疗管理系统源码——技术栈【SpringBoot+Angular+MySQL+MyBatis】
云HIS系统采用主流成熟技术,软件结构简洁、代码规范易阅读,SaaS应用,全浏览器访问前后端分离,多服务协同,服务可拆分,功能易扩展;支持多样化灵活配置,提取大量公共参数,无需修改代码即可满足不同客户需求;服务组织合理,功能高内聚,服务间通信简练。
33 4
|
2天前
|
监控 Java 应用服务中间件
Spring Boot 源码面试知识点
【5月更文挑战第12天】Spring Boot 是一个强大且广泛使用的框架,旨在简化 Spring 应用程序的开发过程。深入了解 Spring Boot 的源码,有助于开发者更好地使用和定制这个框架。以下是一些关键的知识点:
19 6
|
3天前
|
Java 应用服务中间件 测试技术
深入探索Spring Boot Web应用源码及实战应用
【5月更文挑战第11天】本文将详细解析Spring Boot Web应用的源码架构,并通过一个实际案例,展示如何构建一个基于Spring Boot的Web应用。本文旨在帮助读者更好地理解Spring Boot的内部工作机制,以及如何利用这些机制优化自己的Web应用开发。
15 3
|
17天前
|
前端开发 Java 应用服务中间件
从零手写实现 tomcat-08-tomcat 如何与 springboot 集成?
本文探讨了Spring Boot如何实现像普通Java程序一样通过main方法启动,关键在于Spring Boot的自动配置、内嵌Servlet容器(如Tomcat)以及`SpringApplication`类。Spring与Tomcat集成有两种方式:独立模式和嵌入式模式,两者通过Servlet规范、Spring MVC协同工作。Spring和Tomcat的生命周期同步涉及启动、运行和关闭阶段,通过事件和监听器实现。文章鼓励读者从实现Tomcat中学习资源管理和生命周期管理。此外,推荐了Netty权威指南系列文章,并提到了一个名为mini-cat的简易Tomcat实现项目。
|
5天前
|
前端开发 Java 关系型数据库
Java医院绩效考核系统源码B/S架构+springboot三级公立医院绩效考核系统源码 医院综合绩效核算系统源码
作为医院用综合绩效核算系统,系统需要和his系统进行对接,按照设定周期,从his系统获取医院科室和医生、护士、其他人员工作量,对没有录入信息化系统的工作量,绩效考核系统设有手工录入功能(可以批量导入),对获取的数据系统按照设定的公式进行汇算,且设置审核机制,可以退回修正,系统功能强大,完全模拟医院实际绩效核算过程,且每步核算都可以进行调整和参数设置,能适应医院多种绩效核算方式。
27 2
|
6天前
|
运维 监控 Java
springboot基层区域HIS系统源码
医疗(医院)机构正式使用云HIS系统之前,要先进行院内基础数据的配置,主要在数据管理模块中进行,由系统管理员来操作。
11 0
|
7天前
|
传感器 人工智能 前端开发
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
智慧校园电子班牌,坐落于班级的门口,适合于各类型学校的场景应用,班级学校日常内容更新可由班级自行管理,也可由学校统一管理。让我们一起看看,电子班牌有哪些功能呢?
99 4
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
|
14天前
|
存储 Java 应用服务中间件
Springboot项目打war包部署到外置tomcat容器【详解版】
该文介绍了将Spring Boot应用改为war包并在外部Tomcat中部署的步骤:1) 修改pom.xml打包方式为war;2) 排除内置Tomcat依赖;3) 创建`ServletInitializer`类继承`SpringBootServletInitializer`;4) build部分需指定`finalName`;5) 使用`mvn clean package`打包,将war包放入外部Tomcat的webapps目录,通过startup脚本启动Tomcat并访问应用。注意,应用访问路径和静态资源引用需包含war包名。