图片上传是文件的传输,如果也经过 Zuul 网关的代理,文件就会经过多次网络传输,造成不必要的网络负担。
在高并发时,可能导致网络阻塞,Zuul 网关不可用。这样我们的整个系统就瘫痪了。所以,我们上传文件的请求就不经过网关来处理了。
1、Zuul 的路由过滤:
Zuul 中提供了一个 ignored-patterns 属性,用来忽略不希望路由的 URL 路径,示例:
zuul.ignored-patterns: /upload/**
路径过滤会对一切微服务进行判定。
Zuul 还提供了 ignored-services 属性,进行服务过滤:
zuul.ignored-services: upload-servie
我们这里采用忽略服务:
zuul:
ignored-services:
- upload-service # 忽略upload-service服务
上面的配置采用了集合语法,代表可以配置多个。
2、上面的配置还是经过了网关,不是理想效果,我们希望是绕过网关:
修改 nginx 反向代理的配置文件:
server {
listen 80;
server_name api.handou.com;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location /api/upload {
proxy_pass http://127.0.0.1:8082;
proxy_connect_timeout 600;
proxy_read_timeout 600;
rewrite "^/api/(.*)$" /$1 break;
}
location / {
proxy_pass http://127.0.0.1:10010;
proxy_connect_timeout 600;
proxy_read_timeout 600;
}
}
图片上传的 api 请求路径为:http://api.handou.com/api/upload/image
我们修改 nginx 配置文件,希望后缀是 / api/upload/* 的所有请求直接转发到图片服务器的 8082 端口,而不转到网关的 10010 端口。
但这样转发后的路径变为了:http://localhost:8082/api/upload/image 而我们服务器配置的路径为 http://localhost:8082/upload/image
多了一个 /api 这需要 nginx 的 rewrite 指令来对地址进行重写:
语法格式:
rewrite “用来匹配路径的正则” 重写后的路径 [指令];
我们这里是:
rewrite "^/api/(.*)$" /$1 break;
路径重写:
”^/api/(.*)$“:匹配路径的正则表达式,用了分组语法,把 / api / 以后的所有部分当做 1 组
/1 引用前面正则表达式匹配到的分组(组编号从 1 开始),即 / api / 后面的所有。这样新的路径就是除去 / api / 以外的所有,就达到了去除 / api 前缀的目的
break:指令,常用的有 2 个,分别是:last、break
last:重写路径结束后,将得到的路径重新进行一次路径匹配
break:重写路径结束后,不再重新匹配路径。
我们这里不能选择 last,否则以新的路径 / upload/image 来匹配,就不会被正确的匹配到 8082 端口了
重启 nginx 后,还是不能正常访问,因为从 http://manage.handou.com/#/item/brand 到 http://api.handou.com/api/upload/image 存在跨域问题,
需要在 handou-upload 项目中新增 HandouCorsConfiguration 跨域访问配置类。