一、问题描述

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:重写路径结束后,不再重新匹配路径。 也就是说,不用再次过滤,直接代理到接口就行了。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐