上传文件请求绕过网关
一、问题描述
1.本例中,我需要请求上传文件微服务的接口,并且绕过Zuul网关。因为请求会携带图片。如果再通过网关的话,会非常浪费资源。
2.图片上传是文件的传输,如果也经过Zuul网关的代理,文件就会经过多次网路传输,造成不必要的网络负担。在高并发时,可能导致网络阻塞,Zuul网关不可用。这样整个系统就瘫痪了。所以文件上传需要绕过网关。
二、解决方案
1.Zuul的路由过滤
Zuul中提供了一个ignored-patterns属性,用来忽略不希望路由的URL路径,示例:
zuul.ignored-patterns: /upload/**
路径过滤会对一切微服务进行判定。
Zuul还提供了ignored-services属性,进行服务过滤:
zuul: ignored-services: - upload-service # 忽略upload-service服务,这种前面加 - 的是集合语法,可以配置多个
但是用这种方式,还是经过网关了。
2.使用Nginx绕过网关
#api.leyou.com server { listen 80; #监听80端口 server_name api.leyou.com; #监听域名,后台管理系统 #图片上传,拦截/api/upload 的路径 ,重写成 /upload ,代理到http://127.0.0.1:8082/upload/* location /api/upload { proxy_pass http://127.0.0.1:8082; #反向代理 proxy_connect_timeout 600; proxy_read_timeout 600; rewrite "^/api/(.*)$" /$1 break; # $1就是匹配前面的一组(小括号) } #网关 location / { proxy_pass http://127.0.0.1:10010; proxy_connect_timeout 600; proxy_read_timeout 600; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
注意 location / 一定要在最下面,因为,nginx是按顺序过滤的。如果location在最上面,那所有进来的的请求,都走location / 了
前台请求路径是,http://api.leyou.com/api/upload/image
后台接口路径是,http://127.0.0.1:8082/upload/image
我们需要把api过滤掉,这就需要rewrite关键字了
rewrite关键字的使用
rewrite "用来匹配路径的正则" 重写后的路径 [指令];
图中$1匹配的是前面正则表达式里的小括号里的内容,正则表达式里可以有多个小括号,后面可以用 $2 $3来按顺序匹配。
指令可以是 break 或 last
last:重写路径结束后,将得到的路径重新进行一次路径匹配。也就是说,重写完路径,再一次在nginx过滤器里过滤一遍。
break:重写路径结束后,不再重新匹配路径。 也就是说,不用再次过滤,直接代理到接口就行了。