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

Posted

技术标签:

【中文标题】无法根据活动的 Spring 配置文件生成不同的 spring-cloud-gateway 路由【英文标题】:Unable to generate different spring-cloud-gateway routes based on active Spring profile 【发布时间】:2018-12-24 12:07:39 【问题描述】:

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

实际上,我要做的是拥有一个“prod”配置文件,其中包含我的生产服务器的 URI,以及一个包含 localhost 等效项的“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——我回到了[],我希望看到 prod 路线。我确实在我的日志中看到 prod 配置文件已激活,但似乎顶部的“默认”部分中没有属性会导致当解析器从配置文件部分读取它们时它们不会被应用。

我尝试的另一件事是将“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。我公司的首席架构师患有严重的 Not Invented Here Syndrome。)

【问题讨论】:

【参考方案1】:

您不能在属性文件中使用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);
  

您可以通过阅读所有 cmets 在此处找到一些相关信息: https://github.com/spring-projects/spring-boot/issues/1219

【讨论】:

以上是关于无法根据活动的 Spring 配置文件生成不同的 spring-cloud-gateway 路由的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring 中以编程方式获取当前的活动/默认环境配置文件?

如何根据 Spring Boot 中的活动配置文件设置注释属性值?

Spring Boot配置Mysql后无法根据java实体类生成table

Mybatis根据Spring配置文件实现写不同的Sql语句

如何使用 Maven 配置文件设置弹簧活动配置文件

spring.profiles.include 来自 spring 云配置的属性