上传文件请求绕过网关
一、问题描述1.本例中,我需要请求上传文件微服务的接口,并且绕过Zuul网关。因为请求会携带图片。如果再通过网关的话,会非常浪费资源。2.图片上传是文件的传输,如果也经过Zuul网关的代理,文件就会经过多次网路传输,造成不必要的网络负担。在高并发时,可能导致网络阻塞,Zuul网关不可用。这样整个系统就瘫痪了。所以文件上传需要绕过网关。二、解决方案1.Zuul的路由过滤Zuul中...
一、问题描述
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:重写路径结束后,不再重新匹配路径。 也就是说,不用再次过滤,直接代理到接口就行了。
更多推荐
所有评论(0)