路径匹配
在使用服务路由的配置方式时,我们需要为每个路由规则定义路由表达式,也就是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