首页 > 解决方案 > 基于属性(来自配置服务器)是否覆盖/替换了基于 java 的路由配置?

问题描述

我使用服务器在 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

标签: springspring-bootspring-cloudspring-cloud-gateway

解决方案


在问题线程中回答 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))); 
 } 

推荐阅读