javascript
从源码剖析SpringBoot中Tomcat的默认最大连接数
為什么你的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的默认最大连接数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot maxConnec
- 下一篇: Jetty 与 Tomcat 比较,及性