Spring Cloud Gateway 和 DiscoveryClient 路由

Posted

技术标签:

【中文标题】Spring Cloud Gateway 和 DiscoveryClient 路由【英文标题】:Spring Cloud Gateway and DiscoveryClient Routes 【发布时间】:2019-08-03 10:27:00 【问题描述】:

我正在尝试将使用 spring-cloud-starter-netflix-zuul 的网关迁移到 Spring Cloud Gateway,但我遇到了请求路由问题。

我遇到了以下有关为 DiscoveryClient 路由配置谓词和过滤器的文档:

Configuring Predicates and Filters For DiscoveryClient Routes

这是我的 Netflix Zuul 配置中的一个 sn-p:

zuul:
  routes:
    account-service: /accounts/**

这是来自 Spring Cloud Gateway 配置的 sn-p,我正在尝试配置等效路由:

spring:
  cloud:
    gateway:
      routes:
        - id: account-service-route
          uri: lb://account-service
          predicates:
          - Path=/accounts/**

我使用 Spring Cloud Eureka 作为我的发现服务器(在一个单独的微服务中),我目前没有Configuring Predicates and Filters For DiscoveryClient Routes 中所述的任何配置

如果我向/accounts/*** 发出请求,我会收到 404 响应。如果我将 Spring Cloud Gateway 配置更改为以下内容并向/account-service/*** 发出相同的请求,我会收到 403 Forbidden 响应:

spring:
  cloud:
    gateway:
      routes:
        - id: account-service-route
          uri: lb://account-service
          predicates:
          - Path=/account-service/**

我怀疑这与 Spring Cloud Gateway 在如何配置 DiscoveryClient 路由方面的默认行为有关,但我在日志中看不到足够的信息来为我指明正确的方向。

所以,我的问题是:当使用 Spring Cloud Gateway 和 Spring Cloud Eureka 时,是否需要按照Configuring Predicates and Filters For DiscoveryClient Routes 中所述进行配置条目?

如果是这样,有人可以参考我的路线示例就需要配置的内容提供更多解释/说明吗?抱歉,如果我遗漏了一些东西,但从我读到的这个配置到底需要什么对我来说并不明显。例如,spring.cloud.gateway.discovery.locator.predicatesspring.cloud.gateway.discovery.locator.filters 是否配置为补充或代替 spring.cloud.gateway.routes 谓词和过滤器?

如果没有,我可能缺少哪些其他配置?

我在 Spring Cloud Finchley.SR3/Spring Boot 2.0.8.RELEASE 上。

【问题讨论】:

【参考方案1】:

设置

  cloud:
    gateway:
      discovery:
        locator:
          enabled: true  # default false

会自动为Eureka上注册的EVERY服务创建路由,所以你可以通过http://<gateway>/<service-name>/path访问EVERY服务,它会重定向到lb://<service-name>/path使用负载均衡器。 当服务在 Eureka 注销时,它也会从网关中删除路由。

此设置非常简单,适用于许多情况。请记住,默认情况下,路由将在大约 30 秒内出现/消失,您可能希望将该间隔减少到 5 秒,例如使用

eureka:
  client:
    registry-fetch-interval-seconds: 5

【讨论】:

【参考方案2】:

Spring Cloud Gateway 默认只启用请求路由,您必须显式启用发现支持。试试这个:

spring:
  application:
    name: gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true  # default false
      routes:
        - id: account-service-route
          uri: lb://account-service #
          predicates:
            - Path=/account/**

现在你应该可以通过http://<gateway>/account-service/account/**访问你的服务了

【讨论】:

以上是关于Spring Cloud Gateway 和 DiscoveryClient 路由的主要内容,如果未能解决你的问题,请参考以下文章

浅谈Spring Cloud Gateway技术

聊聊spring cloud gateway的NettyConfiguration

Spring Cloud Gateway初体验

Spring Cloud —— Gateway 服务网关

Spring Cloud Gateway 和 CORS 标头

Spring Cloud Gateway 和 DiscoveryClient 路由