spring-boot - 无法根据事件的 Spring 配置文件生成不同的 spring-cloud-gateway 路由

标签 spring-boot spring-profiles spring-cloud-gateway

我正在尝试使用 Spring 配置文件在 Spring Cloud Gateway 中定义不同的路由。我读过的所有关于 Spring 如何使用 yaml sems 管理配置文件以指示它应该工作的所有内容,但对于我的生活来说,它只是......似乎没有。 (我的其他 Spring 应用程序使用属性,所以我不习惯 yaml 配置——我可能遗漏了一些东西。)

实际上,我正在尝试做的是拥有一个包含我的生产服务器 URI 的“prod”配置文件,以及一个包含本地主机等效项的“dev”配置文件。

我有两个配置文件,dev 和 prod。我的 application.yml 文件如下所示

spring:
  profiles:
    default: prod
management:
  endpoint:
    health:
      enabled: true
  endpoints:
    web:
      exposure:
        include: hystrix.stream, gateway
---
spring
  profiles: prod
  cloud:
    gateway:
      routes:
        - id: test_route
          uri: http://foo.mycompany.com
          predicates:
           - Path=/status
           - Method=GET
---
spring
  profiles: dev
  cloud:
    gateway:
      routes:
        - id: test_route
          uri: http://localhost:8080
          predicates:
           - Path=/status
           - Method=GET

我的理解是这样的:

  • spring.profiles.default 属性告诉 Spring,如果没有指定配置文件,则使用 prod 配置文件
  • Spring 会将 --- 视为“文件分隔符”,如果 spring.profiles 参数评估为真,则重新评估每组属性并覆盖以前的值

鉴于这种理解,我希望 Spring 首先解析“默认”属性,了解默认激活的配置文件应该是 prod。然后它将解析产品属性。由于“prod”是一个事件的配置文件(唯一的事件配置文件,是默认的),它应该解析并应用 prod 路由。然后它会解析 dev 路由,但会识别出 dev 不是事件配置文件,并且不会覆盖这些值。这是我阅读 documentation on how to change config based on the environment 的理解.

但是,当我加载它时,我点击了执行器端点 -- /actuator/gateway/routes -- 我回到了我期望的位置 []查看产品路线。我确实在我的日志中看到产品配置文件已激活,但似乎没有顶部“默认”部分中的属性导致当解析器从配置文件部分读取它们时它们不会被应用。

我尝试的另一件事是将“dev”属性设置为默认值,然后尝试使用“prod”配置文件属性覆盖 URI。那里发生了一个类似的问题——我点击了执行器端点并返回了路由,但它们只是默认的开发路由。

我如何利用 Spring 配置文件在我的 application.yml 中配置不同的 Spring Cloud Config 路由?

版本:

  • spring-cloud-gateway 2.0.1.BUILD-SNAPSHOT(获得 this bug 的解决方法,可能不相关)
    • spring-cloud-starter-gateway
  • spring-boot 2.0.3.RELEASE
    • spring-boot-starter-webflux
    • spring-boot-starter-actuator

(出于政治原因,我无法使用 Spring Cloud Config。我公司的首席架构师患有严重的非发明人综合症。)

最佳答案

您不能在属性文件中使用 spring.profiles.default。设置这样的值为时已晚。 所以你可以使用程序参数(或系统属性)来设置它。例如。

java -jar --spring.profiles.default=dev your-app.jar

或者您可以通过硬编码默认配置文件在代码中完成此操作:

@SpringBootApplication
public class DemoApplication {
  public static void main(String[] args) {
    SpringApplication application = new SpringApplication(DemoApplication.class);
    ConfigurableEnvironment environment = new StandardEnvironment();
    environment.setDefaultProfiles("dev");
    application.setEnvironment(environment);
    application.run(args);
  }
}

阅读所有评论可以在这里找到一些相关信息: https://github.com/spring-projects/spring-boot/issues/1219

关于spring-boot - 无法根据事件的 Spring 配置文件生成不同的 spring-cloud-gateway 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51370363/

相关文章:

java - Spring Cloud Gate 请求超时不适用于路径

java - 使用 Keycloak 保护 Spring Cloud 网关

spring-boot - Spring Boot 2.0.4 - H2 数据库 - @SpringBootTest - 因 : org. h2.jdbc.JdbcSQLException 导致失败:未找到架构 "classpath:db/schema.sql"

java - 刷新了 Spring Boot 上下文中的 Jooq CastException

java - 我可以将内部 Spring Boot 变量传递给 gradlew 吗?

spring 配置文件未在 STS tc 服务器上激活

java - Spring boot 从附加位置文件覆盖 prod 属性

java - 如何将 application.properties 加载到测试类中以获取 spring.profiles.active 值?

java - NetBeans:带有 Swing 应用程序的 Spring 启动

spring-cloud - Spring Cloud Gateway - 基于头的重定向