我使用 Spring Cloud Gateway 和
spring.cloud.discovery.locator.enabled=true
,但我有短信服务,我不希望通过网关访问此服务。
我的配置是这样的,但是不行,我也可以通过网关访问sms-svr
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
lower-case-service-id: true
routes:
- id: sms-svr
uri: no://op
predicates:
- Path=/sms-svr/**
filters:
- setStatus=404
我的路由器规则是这样的:
[
......
{
"predicate": "Paths: [/sms-svr/**], match trailing slash: true",
"metadata": {
"management.port": "22020"
},
"route_id": "ReactiveCompositeDiscoveryClient_SMS-SVR",
"filters": [
"[[RewritePath /sms-svr/?(?<remaining>.*) = '/${remaining}'], order = 1]"
],
"uri": "lb://SMS-SVR",
"order": 0
},
{
"predicate": "Paths: [/sms-svr/**], match trailing slash: true",
"route_id": "sms-svr",
"filters": [],
"uri": "no://op",
"order": 0
}
]
它与eureka有同样的问题,我可以通过Spring Cloud Gateway访问eureka,我还需要禁用此行为
最后,我禁用了自动发现并为每个服务添加路由规则,但我认为这不是一个好方法
如果您使用 eureka 作为服务发现,则可以使用此属性在网关配置中使用 Spring 表达式语言
spring.cloud.gateway.discovery.locator.include-expression
检查这里。
其默认值为
true
,因此 您的 SpEL
必须计算为布尔表达式。
您可以在此 URL 下查看尤里卡服务器中的元数据
http://localhost:8761/eureka/apps
,并且您可以使用 metadata
key 在网关配置中使用此处的内容。类似的东西
spring.cloud.gateway.discovery.locator.include-expression=<your SPEL using metadata object>
就用它:
spring.cloud.gateway.discovery.locator.include-expression = serviceId != '用户服务'
使用您的名字而不是“USER-SERVICE”(即使您使用 spring.cloud.gateway.discovery.locator.lower-case-service-id=true,也只能使用大写)