【问题标题】:Did properties-based (from configuration server) override/replace java-based routes config?基于属性(来自配置服务器)是否覆盖/替换基于 java 的路由配置?
【发布时间】:2021-01-04 03:51:21
【问题描述】:

我使用服务器在 yml 配置中定义了一些路由,这些路由存储在 Consul Key/Value 中。当我尝试使用 Fluent API(基于 Java 的配置)定义路由时,网关无法正常工作并且不会处理此路由。

基于服务器的配置示例:

cloud:
    gateway:
      discovery:
        locator:
          enabled: false
      routes:
        - id: foo
          predicates:
            - Path=/foo/**
          uri: lb:https://bar

并以 Fluent 风格定义路线:

    @Bean
    public RouteLocator routes(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(p -> p
                        .path("/testing_route")
                        .filters(f -> f.addRequestHeader("Hello", "World"))
                        .uri("http://httpbin.org:80"))
                .build();
    }

结果网关对 /testing_route 路径的所有请求返回 404 状态码,这意味着该路由不起作用。

如果遇到问题,我想使用基于 DSL 配置的 ModifyRequestBodyFilter 修改请求正文,这意味着 - 我需要使用两种方式来配置上下文。 实际上,这段代码什么也没做。

我们可以将 RouteLocatorBuilder 与 yml 中基于属性的配置结合起来吗?

Spring Boot 2.2.5 发布 Spring Cloud Hoxton.SR3

【问题讨论】:

    标签: spring spring-boot spring-cloud spring-cloud-gateway


    【解决方案1】:

    已在问题线程中回答 https://github.com/spring-cloud/spring-cloud-gateway/issues/1953#issuecomment-705081934

    TL;DR 需要开启 CachingRouteLocator

     @Bean 
     @Primary 
     @ConditionalOnMissingBean(name = "cachedCompositeRouteLocator") 
     // TODO: property to disable composite? 
     public RouteLocator cachedCompositeRouteLocator(List<RouteLocator> routeLocators) { 
        return new CachingRouteLocator(new CompositeRouteLocator(Flux.fromIterable(routeLocators))); 
     } 
    

    【讨论】:

      猜你喜欢
      • 2013-03-13
      • 2022-11-03
      • 1970-01-01
      • 2019-05-23
      • 2014-09-25
      • 2012-02-01
      • 1970-01-01
      • 2016-09-04
      • 1970-01-01
      相关资源
      最近更新 更多