如何在定位器启用时禁用 Spring Cloud Gateway 的特定服务发现

问题描述 投票:0回答:2

我使用 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,我还需要禁用此行为


最后,我禁用了自动发现并为每个服务添加路由规则,但我认为这不是一个好方法

java spring-cloud spring-cloud-gateway
2个回答
1
投票

如果您使用 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>

0
投票

就用它:

spring.cloud.gateway.discovery.locator.include-expression = serviceId != '用户服务'

使用您的名字而不是“USER-SERVICE”(即使您使用 spring.cloud.gateway.discovery.locator.lower-case-service-id=true,也只能使用大写)

© www.soinside.com 2019 - 2024. All rights reserved.