为什么你的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键再移动鼠标到该配置,鼠标左键点击后,便会跳转到如下类方法中:

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

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

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

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

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

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

哈哈,果然没错,可是默认值居然是0!!什么情况?难不成SpringBoot默认最大连接数为0,这不可能啊,那不是什么请求都收不到了。既然默认设置了0,肯定有其他地方对其进行了修改。

带着疑问找一下,在Tomcat类中,除了对该属性的get,set方法(我们配置文件中配置的属性即调用的这个方法对该值就行修改)之外,我们可以在Tomcat类中的customizeTomcat()方法中,找到对maxConnection的修改:

点进该方法看看:

关键在这句代码:

protocol.setMaxConnections(Tomcat.this.maxConnections);

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

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

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

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

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

默认值是200哦。

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

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

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

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

  1. Swoft 源码剖析 - Swoft 中的注解机制

    作者:bromine 链接:https://www.jianshu.com/p/ef7... 來源:简书 著作权归作者所有,本文已获得作者授权转载,并对原文进行了重新的排版. Swoft Github ...

  2. python字符串代码对象_Python源码剖析 - Python中的字符串对象

    1. 前言 我们已经在 [Python中的整数对象] 章节中对定长对象进行了详细的讲解,接下来我们将介绍变长对象,而字符串类型,则是这类对象的典型代表. 这里必须先引入一个概念: Python 中的变 ...

  3. python源码剖析—— python中的列表对象

    1. PyListObject对象 PyListObject 对象可以有效地支持插入,添加,删除等操作,在 Python 的列表中,无一例外地存放的都是 PyObject 的指针.所以实际上,你可以这 ...

  4. python源码剖析—— python中的字节码对象初探

    一.代码对象 每个初学python的人都会认为python是一种解释型语言,这个不能说错.但是python并不是真的对执行的python代码的每一行进行解释,虽然我们有一个所谓的"解释器&q ...

  5. 深入源码分析SpringBoot中使用@ConditionalOnBean无效的问题(@ConditionalOnBean did not find any beans of type)

    一.前言 最近在使用SpringBoot的@ConditionalOnBean的时候遇到一个很很奇特的问题.即在@Bean中使用@ConditionalOnBean注解,在可以确保需要依赖的Bean一 ...

  6. 源码剖析Redis中如何使用跳表的

    前言 阿里云今年春招校招面试题,面试官问Redis在是如何使用跳表的?让很多同学赶到很头疼.今天我们就来讲一讲吧. Sorted Set的结构 redis的数据类型中有序集合(sorted set)使 ...

  7. (附源码)springboot中北创新创业官网 毕业设计 271443

    Springboot中北创新创业官网 摘 要 进入21世纪以来,计算机有了迅速的发展.计算机应用.信息技术全面渗透到了人类社会的各个方面,信息化已成为世界经济和社会发展的大趋势.本文主要通过对中北创新 ...

  8. SpringBoot 源码解析——SpringBoot 中的日志基础服务

    背景 在看 spring-boot module 的时候,看到有一个专门的 logging 的 package,因为日志是平时接触的非常多的一个东西,不仅仅是应用本身的日志需要关心,如果是要去做一个统 ...

  9. frp源码剖析-frp中的mux模块

    前言 frp几乎所有的连接处理都是构建在mux模块之上的,重要性不必多说,来看一下这是个啥吧 ps: 安装方法 go get "github.com/fatedier/golib/net/m ...

最新文章

  1. 机器学习系列之手把手教你实现一个分类回归树
  2. linux挂载盘符扫描,Linux下挂载ISCSI的盘符问题
  3. 前端必读:浏览器内部工作原理
  4. 移动端开发问题及技巧汇总
  5. 4.12任务 apache结合php以及apache默认虚拟主机
  6. How to resolve ASSERTION_FAILED error when you register the odata service expose
  7. django实现上传文件并保存
  8. 对于数据库视图的一些理解
  9. 串口IO、定时器、回调函数
  10. wex5 导入mysql_wex5 sqllite本地数据库的运用
  11. 用TestComplete实现一个关键字驱动测试框架
  12. 剧情介绍:“遗愿清单”
  13. 信号处理中简单实用的方法——对信号进行平滑处理
  14. excel 度分秒转度
  15. OPPO云VPC网络实践
  16. webpack安装及配置
  17. 李宏毅 线性代数 Introduction
  18. 基于PHP排课和选课系统设计与实现 开题报告
  19. java基础笔记系列_Day04
  20. 叶小天的功课忙了许多

热门文章

  1. No overload for 'OnStartup' matches delegate 'System.Windows.StartupEventHandler'
  2. 最好用的枚举多选方法
  3. SPList和SPDocumentLibrary 通过代码更新审批状态
  4. CentOS 8 正式发布
  5. 一步一步做一个linux文件传输软件(一)
  6. Windows server 2008 r2 开启Aero
  7. POJ2112 Optimal Milking
  8. Visual Studio 2005中C++的变化
  9. sqlyog软件的使用
  10. 深入Java -JVM 垃圾回收