3

我正在尝试使用 Spring 配置文件在 Spring Cloud Gateway 中定义不同的路由。我读过的所有关于 Spring 如何使用 yaml sems 管理配置文件以表明它应该工作的内容,但对于我的生活来说,它只是......似乎没有。(我的其他 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参数评估为 true时覆盖以前的值

鉴于这种理解,我希望 Spring 首先解析“默认”属性,了解默认激活的配置文件应该是 prod。然后它将解析产品属性。由于“prod”是一个活动配置文件(唯一的活动配置文件,是默认配置),它应该解析和应用 prod 路由。然后它会解析 dev 路由,但会识别 dev 不是活动配置文件,并且不会覆盖这些值。这是我阅读有关如何根据环境更改配置的文档的理解。

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

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

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

版本:

  • spring-cloud-gateway 2.0.1.BUILD-SNAPSHOT (获得此错误的解决方法,可能不相关)
    • spring-cloud-starter-gateway
  • spring-boot 2.0.3.RELEASE
    • spring-boot-starter-webflux
    • 弹簧引导启动器执行器

(由于政治原因,我不能使用 Spring Cloud Config。我公司的首席架构师患有严重的 Not Invented Here Syndrome。)

4

1 回答 1

2

您不能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

于 2018-08-03T11:54:57.510 回答