前言
今天还要跟大家分享的一个点就是微服务网关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!