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

时间:2018-07-16 21:31:31

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

我正在尝试使用Spring配置文件在Spring Cloud Gateway中定义不同的路由。我已经阅读了有关Spring如何使用yaml sems来管理配置文件以表明它应该正常工作的所有内容,但是对我而言,似乎……似乎并没有。 (我的其他Spring应用程序都使用属性,因此我没有使用yaml配置-可能我遗漏了一些东西。)

有效地,我要做的是创建一个“生产”配置文件,其中包含生产服务器的URI,以及一个“开发”配置文件,其中包含与本地主机等效的文件。

我有两个个人资料,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,如果未指定配置文件,则使用产品配置文件
  • Spring将---视为“文件分隔符”,并重新评估每组属性,并在spring.profiles参数评估为true时覆盖先前的值

基于这种理解,我希望Spring首先了解到默认激活的配置文件,然后解析“默认”属性。然后它将解析prod属性。由于“ prod”是活动配置文件(唯一的活动配置文件,是默认配置文件),因此它应该解析并应用prod路由。然后它将解析开发路线,但会认识到开发不是活动配置文件,并且不会覆盖这些值。通过阅读documentation on how to change config based on the environment,这是我的理解。

但是,当我加载它时,我撞到了执行器端点-/actuator/gateway/routes-回到[],我希望在那里看到生产路径。我在日志中确实看到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。我公司的首席架构师患有严重的“此处未发明综合症”案例。)

1 个答案:

答案 0 :(得分:0)

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