一,为什么配置的路由不生效?
我配置了两个路由,admin_route是模糊匹配,product_route是精确匹配,按理来说当我访问/product/pmscategory/list/tree
的时候,按照断言,应该执行的是product_route这个路由,可是事与愿违,执行的会是admin_route这个路由。为什么呢?原因是路由规则的顺序问题。在路由规则中,精确的路由规则应该放在模糊的路由规则前面,否则精确的路由规则将不会被匹配到。
在这个例子中,后台管理路由的规则是模糊的,而产品路由的规则是精确的。
spring:
application:
name: gulimall-gateway
cloud:
nacos:
config:
server-addr: localhost:8848
gateway:
routes:
# 后台管理路由(模糊匹配)
- id: admin_route
uri: lb://renren-fast
predicates:
- Path=/api/**
filters:
- RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}
# product产品路由(精确匹配)
- id: product_route
uri: lb://gulimall-product
predicates:
- Path=/api/product/**
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment}
所以,需要将上面配置文件中的admin_route和product_route调换一下位置,将精确匹配路由放在前面
spring:
application:
name: gulimall-gateway
cloud:
nacos:
config:
server-addr: localhost:8848
gateway:
routes:
# product产品路由(精确匹配-在模糊匹配之前,否则不生效)
- id: product_route
uri: lb://gulimall-product
predicates:
- Path=/api/product/**
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment}
# 后台管理路由(模糊匹配)
- id: admin_route
uri: lb://renren-fast
predicates:
- Path=/api/**
filters:
- RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}