寫在前面
最近負責運維的同事反饋說,之前在K8s容器環境下部署的SpringCloudGateway項目對應的磁盤容量會慢慢升高,當磁盤容量達到容器設置的最大容量之后,容器中此項目對應的pod節點就會重啟,至於具體原因他們也沒有查到,不過他們說,在項目對應的臨時存儲文件的tmp文件夾下發現了很多以synchronoss-file-upload開頭命名的空文件,由於這種情況時不時的出現,所以他們建議我看一下是不是程序問題,催促我解決下。
當前SpringCloudGateway項目對應的版本信息如下:
<spring-boot.version>2.3.12.RELEASE</spring-boot.version> <spring-cloud.version>Hoxton.SR12</spring-cloud.version> <spring-cloud-alibaba.version>2.2.7.RELEASE</spring-cloud-alibaba.version>
1、Bug復現
接到通知之后,我查看了一下測試環境K8s容器下部署的SpringCloudGateway項目,在Linux環境下,先執行一下 top 命令,查看了當前pod節點,SpringCloudGateway項目所占用的容量,發現當前pod節點程序所占用容量與當前系統顯示的容量不一致,而且根據運維同事的描述,隨即查看了一下根目錄的tmp文件夾,果然發現了大量以synchronoss-file-upload開頭命名的空文件夾,如下圖所示。

2、問題追溯
看到這些空文件,自己也是很懵,SpringCloudGateway項目中並沒有文件上傳相關的程序,但是雖然沒有,自己還是在 IntelliJ IDEA 中全局搜索了一下synchronoss-file-upload關鍵字,結果發現項目中並沒有搜索到,然后又嘗試搜索了一下 synchronoss 關鍵字,發現在 spring-web-5.2.15.RELEASE項目中的SynchronossPartHttpMessageReader類中定義了synchronoss-file-upload關鍵字,如下圖所示。

關於這個方法,我查看了Spring源碼的Issue,發現也有人遇見過類似問題,如下所示。

關於此Issue對應的github地址如下:https://github.com/spring-projects/spring-framework/issues/27092
所以,這也就導致當程序發出一個請求之后,Spring-Web項目就會在tmp文件夾下臨時創建一個以synchronoss-file-upload開頭命名的空文件夾。
3、問題解決
由於是spring-web-5.2.15.RELEASE版本中出現了此問題,所以后續如果有小伙伴使用此版本,請留意網關是否出現類似問題。既然已經查明問題,所以為了解決此問題,繼續查看了Spring官網的版本信息,發現在spring-web-5.2.16.RELEASE版本中,針對此問題進行了修復,具體信息如下圖所示:

由於官方針對問題已經進行修復,於是在SpringCloudGateway項目中,單獨升級了 Spring-Web依賴的版本信息,依賴信息如下,然后重新部署項目,在測試環境K8S容器下,查看pod節點的磁盤占用情況,使用 top 命令發現,磁盤使用情況保持一致,然后同步更新部署線上環境,后續持續觀察了一段時間再沒有出現類似問題。
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.2.16.RELEASE</version> </dependency>
