图片上传是文件的传输,如果也经过 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/brandhttp://api.handou.com/api/upload/image 存在跨域问题,

需要在 handou-upload 项目中新增 HandouCorsConfiguration 跨域访问配置类。