为什么要绕过网关去上传文件?
因为我们所有的请求都要经过网关,假如有一天网关微服务出了问题,那么我们所有的文件都上传不了,所以我们上传文件可以绕过网关去上传。
我们该如何实现绕过网关去上传?
首先你要知道,我们从浏览器发送过来的地址,都是从nginx进行代理,然后转发给网关进行匹配微服务,如果我们绕过网关的话,只需要直接从nginx配置不经过网关的地址就可以了。
像这个地址,之前我们只配置了一个地址,就是访问网关的地址,让浏览器只能发送到网关里面,现在我们在上面增多一个地址,这个是可以访问到上传文件路径的地址,为了更精准一点,我们加上后面的后缀/api/load,因为只要你点击上传文件的话,他就会访问这个地址,你只需要加上这个后缀,他能去自动访问这个地址,然后由上传文件的微服务去截取,端口我们可以直接改成上传文件的微服务的端口,我们这一定义上传文件的微服务的端口是8082,所以转发到8082也就是转发到上传文件的微服务,然后再由上传文件的微服务的controller去截取/upload,就可以实现后面的操作。但是有一点需要注意的是,一定要注意把上传文件的配置写在网关配置的前面,也就是上图用红框圈起来的地方,这个顺序一定要注意,不然的话,路径会经过网关先,然后才会到上传文件路径,这样就会经过网关。
但是因为前端的原因,请求路径会自动加上api,然后这个是网关的api,虽然不是网关的端口,但是多了这个api,我们上传文件的微服务也没有办法访问到,所以我们要用到一个方法,nginx里面可以去重写路径。
怎么去重写路径呢?
我们可以看看这个方法,这个是我们重写的方法,这里用了正则表达式,以^开头,$结尾,第一个也就是api,表示的是需要修改的对象,然后第二个也就是(.)表示的是api后面的参数也就是/upload/image,然后用双引号括起来,这就是一个对象,我们需要获取的是1,这个1表达的是什么意思呢?就是你要求改的对象后面的一个参数比如(.)这个是代表什么上面已经说到了,也就是获取这些全部参数,这些也就是1,如果你加多几个(.*),那就可以选择二或者三。
写完之后我们还要做一个选择:
需要加这两个参数之中的一个,两者的区别就是进行一次路径匹配跟不匹配,如果进行一次路径匹配的话,我们上面的地址是没有api的,在nginx所有地址当中,都是带有api的,就连我们当前的这个地址,都是带api的,只是我们重写了而已,所以我们不能再重新进行一次路径匹配,只能不再重新匹配地址,选择第二个break。
最终结果把这后面的也去掉,所以我们最终访问8082这个上传文件的微服务,访问的时候顺便重写地址把api去掉,就可以正常访问微服务的controller。
最终结果。