学科分类
目录
Spring Cloud

路径匹配

在使用服务路由的配置方式时,我们需要为每个路由规则定义路由表达式,也就是path参数。在Zuul中,路由表达式采用了Ant风格定义。

Ant风格的路由表达式共有三种通配符,如表1所示。

表1 Ant通配符

通配符 说明 举例
匹配任意单个字符 /eureka-consumer/?
* 匹配任意数量的字符 /eureka-consumer/*
** 匹配任意数量的字符,支持多级目录 /eureka-consumer/**

关于表1罗列的通配符的介绍具体如下:

● “?”是匹配任意单个字符,例如eureka-consumer/?,它可以匹配到/eureka-consumer/后拼接一个任意字符的路径,如/eureka-consumer/a、/eureka-consumer/b。

● “”是匹配任意数量的字符,例如/eureka-consumer/,它可以匹配到/eureka-consumer/后拼接任意字符的路径,如/eureka-consumer/a、/eureka-consumer/aaa。

● “**”可以匹配多级目录的路径,例如/eureka-consumer/**,它可以匹配到/eureka-consumer/a/b。

使用通配符的时候,可能会存在这样一种场景,某个URL路径能够匹配多个不同路由的表达式。例如,我们实现了eureka-consumer服务,并且配置了以下路由规则:

 Zuul:
   Routes:
     eureka-consumer:
     Path: /eureka-consumer/**
     serviceId: eureka-consumer

随着版本迭代,可能需要对eureka-consumer服务做一些功能拆分,将原属于eureka-consumer服务的某些功能拆分到了另外一个全新的服务eureka-consumer-ext,而这些拆分的外部调用URL路径希望能够符合规则/eureka-consumer/ext/**,此时,我们就需要在配置文件中增加一个路由规则,配置信息具体如下:

zuul:
  routes:
     eureka-consumer:
        path: /eureka-consumer/**
        serviceId: eureka-consumer
     eureka-consumer-ext:
        path: /eureka-consumer/ext/**
        serviceId: eureka-consumer-ext

上述配置中,调用eureka-consumer-ext服务的URL路径能同时被/ eureka-consumer/**和/eureka-consumer/ext/**两个表达式匹配。此时,匹配结果取决于路由规则的定义顺序。

为了更灵活的使用路由配置规则,Zuul还提供了一个忽略表达式参数zuul.ignored-patterns,该参数用来设置不被网关进行路由的URL表达式。例如,不希望/hi接口被路由,配置信息可以写成下列方式:

zuul : 
  ignored-patterns : /**/hi/**      
  routes :
    eureka-consumer :                    
      path : /eureka-consumer/**
      serviceId : eureka-consumer

当配置了忽略表达式参数时,通过网关访问eureka-consumer的/hi接口时,会提示该接口不存在,在控制台可以看到没有匹配路由的输出信息,如下所示。

o.s.c.n.z.f.pre.PreDecorationFilter : No route found for uri: /eureka-
consumer /hi
点击此处
隐藏目录