前言
??????今天還要跟大家分享的一個點就是微服務網關gateway用webflux響應式不用servlet后,引發的一個忽略點差點在演示的時候炸鍋,也不多講廢話,說說現象,說說處理就了事。
一、上傳超過20MB的視頻報錯
- 配置在nacos里,讀取配置用的@value注解
- 發布新配置,攔截不生效
- 用了nginx
就是這么個現象,其實大概也知道原因。
二、初步分析原因
- 首先這是小弟寫的,我不想動。
- 其次可以理解是培養試驗小弟,誰知道中午小弟直接就去吃飯了,留我一個人在這。
- 最后,還得是自己頂上。
??????目前,自己確實是軟開的小管理,但是其實還是處于協管,因為我才來,其他人都是老資歷,所以老板派了個老資歷主管幫我協管。
??????這小弟也是在這做兼職,覺得可以,留下來換血的。
??????運維是自己招的,去吃飯還說了聲,小弟啥都沒說,回頭就看不到人了。。。。。。
原因就下面: - gateway是webflux響應式的,基因就不支持大文件
- 上傳接口的網關
- 配置限制在nacos里,但是讀取姿勢不對
- 使用@value注解讀取的
三、正確處理
1.nacos里的配置
spring:servlet:multipart:max-file-size: 102MBmax-request-size: 300MB
2.nginx的代理配置
location /upload/{proxy pass http://ip:子服務端口/;#后端服務直連
}
??????這里其實就是按照國際慣例處理,上傳文件繞過gateway網管,直連上傳接口的子服務。其實國際慣例是上傳到第三方服務,但是我們這不是才開始,經費有限,先磁盤吧。
3.nginx配置大文件
??????這里是配置的全局max_client_body:2048MB
4.前端代理
??????前端處理代理,將/upload代理直接到子服務端口。
5.讀取配置采用
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;/*** 上傳配置類** @author zwmac*/
@Component
@ConfigurationProperties(prefix = "spring.servlet.multipart")
@Data
public class UploadConfig {private String maxFileSize;private String maxRequestSize;
}
6.使用配置
import com.rs.gov.config.upload.UploadConfig;
import com.rs.gov.entity.RestResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MaxUploadSizeExceededException;@ControllerAdvice
public class GlobalFileExceptionHandler {@Autowiredprivate UploadConfig uploadConfig;@ExceptionHandler(MaxUploadSizeExceededException.class)@ResponseBodypublic RestResponse<String> handleMaxSizeException(MaxUploadSizeExceededException exc) {// 返回自定義的錯誤信息String maxSize = uploadConfig.getMaxFileSize();return RestResponse.fail("文件大小超過"+maxSize+"限制");}
}
??????基本上就ok了,小弟還給前端整了個獲取上傳大小的接口,現在nacos里就可以動態修改了。
??????廢話也不多說了,還在支持現場演示呢!這也是坑,當時是代理兼職做997一周多點做的,沒有配測試崗,家里又沒有機器測試,開發自測還是不夠。
總結
- gateway是webflux響應式的,不是servlet,也就是大文件不支持
- @value讀取nacos的姿勢不太對,nacos的配置他只能讀取到第一次,新發布的它步讀取了,(也有可能一次都讀不到,反正就是啟動讀取配置時機不太對)
- nginx有大文件限制,需要配置max_client_body
微服務大文件上傳的通用做法是使用第三方服務,非要自己存儲就繞過gateway。
??????希望能幫到大家,uping!