1. 程式人生 > 實用技巧 >zuul閘道器上傳大檔案到微服務file為空的問題

zuul閘道器上傳大檔案到微服務file為空的問題

問題描述:

最近一個上傳檔案的功能,上傳了一個較大的檔案700M,一直出現接收的檔案為空的問題,記憶體和磁碟都非常充足,也沒有出現記憶體溢位的錯誤,一直都是空指標的問題,這讓我百思不得七屆.經過一系列的原始碼追蹤才最終發現了問題所在

環境:

通過spring cloud zuul 路由轉發到對應的檔案上傳服務,並且加了字首為/zuul的路徑,直接跳過spring mvc的檔案處理

解決辦法和過程:

經過自己不斷的測試,小檔案上傳是沒有任何問題的,但是一旦出現了較大的檔案那麼上傳的檔案則為空.下面上原始碼,最後轉發微服務的程式碼在這個類中RibbonRoutingFilter;

問題就出在了下面的方法中,因為我開啟了閘道器重試機制,所以會走下面的if (!(this.requestEntity instanceof ResettableServletInputStreamWrapper)) 這個方法,,但是因為檔案過大,讀取會失敗,只會讀取到了一部分的流,但是上下文物件記錄的是完整的流長度,最後轉發到微服務的時候就會出現封裝失敗,空指標的問題,而小檔案則沒有關係可以全部讀取出來.

最後想解決這個問題的話有三個方案可以給大家參考一下

1. 關閉閘道器重試機制

2. 檔案上傳介面不使用閘道器轉發

3. 使用nginx反向代理