API网关服务组件Spring Cloud Zuul使用详解3(路由详解3:路径匹配、忽略表达式)
作者:hangge | 2020-10-13 08:10
三、路径匹配
1,路径表达式
无论是传统路由的配置方式还是服务路由的配置方式,我们都需要为每个路由规则定义匹配表达式(即 path 参数)。在 Zuul 中,路由匹配的路径表达式采用了 Ant 风格定义。
(1)Ant 风格的路径表达式使用很简单,一共有如下三种通配符:
- ?:匹配任意单个字符
- *:匹配任意数量字符
- **:匹配任意数量字符,支持多级目录
- /user-service/?:它可以匹配 /user-service/ 之后拼接一个任意字符的路径,比如:/user-service/a、/user-service/b
- /user-service/*:它可以匹配 /user-service/ 之后拼接任意字符的路径,比如:/user-service/a、/user-service/abb。但它无法匹配 /user-service/a/b
- /user-service/**:它可以匹配 /user-service/* 包含的内容之外,还可以匹配形如 /user-service/a/b 的多级目录路径。
2,路径匹配优先顺序
(1)一个 URL 路径可能会被多个不同路由的表达式匹配上。比如下面规则,调用 user-service-ext 服务的 URL 路径实际上会同时被 /user-service/** 和 /user-service/ext/** 两个表达式匹配。虽然 Zuul 内部的匹配算法是通过线性遍历的方式,只要获取到第一个匹配的路由规则之后就返回并结束匹配。但由于 properties 的配置内容无法保证有序,所有如果我们想让调用 user-service-ext 服务的 URL 路径优先选择 /user-service/ext/** 路径是无法实现的(无论内容顺序怎么调)。zuul.routes.user-service.path=/user-service/** zuul.routes.user-service.service-id=user-service zuul.routes.user-service-ext.path=/user-service/ext/** zuul.routes.user-service-ext.service-id=user-service-ext
(2)为了保证路由的优先顺序,我们需要使用 YAML 文件来配置,以实现有序的路由规则:
zuul:
routes:
user-service-ext:
path: /user-servcie/ext/**
service-id: user-service-ext
user-service:
path: /user-servcie/**
service-id: user-service
四、忽略表达式
(1)Zuul 提供了一个忽略表达式参数 zuul.ignored-patterns,可以用来设置不希望被 API 网关进行路由的 URL 表达式。
注意:zuul.ignored-patterns 参数作用范围并不是只针对某个路由,而是对所有路由。所以在设置的时候需要全面考虑 URL 规则,防止忽略了不该被忽略的 URL 路径。
(2)如果不希望 /hello 接口被路由,那么可以像如下这种方式进行设置:
zuul.ignored-patterns=/**/hello/** zuul.routes.user-service.path=/user-service/** zuul.routes.user-service.service-id=user-service
(3)设置后如果访问 http://localhost:5555/user-service/hello 将不会被正确路由,因为该路径符合 zuul.ignored-patterns 参数定义的规则。而其他路径则不会有问题,比如 http://localhost:5555/user-service/abc
全部评论(0)