【发布时间】:2019-10-29 03:05:24
【问题描述】:
我正在使用 Spring Cloud 来管理我的微服务。
出于安全原因,对于一个特定的微服务(命名为 ms_secure),我想使用自定义路由根据客户端 IP 选择特定的微服务版本。
我的网关配置如下所示:
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
routes:
- id: ms_secure_v1
uri: lb://ms_secure_v1
predicates:
- Path=/ms_secure/**
filters:
- RewritePath=/ms_secure/(?<segment>.*), /$\{segment}
- name: <my filter>
args:
xForwardedForHeaderName: X-Forwarded-For
hosts:
- <IP1>
- <IP2>
- id: ms_secure
uri: lb://ms_secure_v2
predicates:
- Path=/ms_secure/**
filters:
- RewritePath=/ms_secure/(?<segment>.*), /$\{segment}
- name: <my filter>
args:
xForwardedForHeaderName: X-Forwarded-For
hosts:
- <IP3>
- <IP4>
当请求 /ms_secure 时:
- IP1 和 IP2 将被重定向到 ms_secure_v1
- IP3 和 IP4 将被重定向到 ms_secure_v2
我的问题是我的所有客户端也可以使用默认路由直接访问 ms_secure_v1 或 ms_secure_v2:
http:///ms_secure_v1/...
http:///ms_secure_v2/...
我尝试使用 SetStatus GatewayFilter 禁用这些路由:
- id: setstatusstring_route
uri: lb://ms-gateway
predicates:
- Path=/ms_secure_v**
filters:
- SetStatus=403
但是这条路线不匹配。
有没有办法在spring gateway中禁用这些默认路由?
【问题讨论】:
-
为什么你的发现定位器是真的?
-
@spencergibb 我认为将此属性设置为 false 可以解决我的问题,但它似乎并没有改变任何东西。这个属性的目的是什么?
-
根据发现中注册的服务动态创建路由。否则没有默认路由。所以看看你的路线,谓词是相同的
Path=/ms_secure/**。所以它总是匹配第一个。 -
它不会总是匹配第一个,因为过滤器会根据源 IP 选择正确的路由。关于发现定位器,我不明白,因为我禁用了它,默认路由仍然匹配
-
谓词必须在过滤器运行之前匹配。
标签: spring routing spring-cloud spring-cloud-netflix spring-cloud-gateway