Невозможно создать разные маршруты Spring-Cloud-Gateway на основе активного профиля Spring

Я пытаюсь определить разные маршруты в Spring Cloud Gateway с помощью профилей Spring. Все, что я читал о том, как Spring управляет профилями, используя yaml sems, чтобы указать, что он должен работать, но, черт возьми, это просто ... не похоже. (Мои другие приложения Spring используют свойства, поэтому я не использую конфигурацию yaml - возможно, мне что-то не хватает.)

По сути, то, что я пытаюсь сделать, - это иметь профиль «prod», который содержит URI для моих рабочих серверов, и профиль «dev», который содержит эквиваленты localhost.

У меня два профиля: 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 не является активным профилем, и не перезаписывает эти значения. Это я понял из чтения документация по изменению конфигурации в зависимости от среды.

Однако, когда я загружаю это и нажимаю на конечную точку исполнительного механизма - /actuator/gateway/routes - я возвращаюсь [] туда, где я ожидал бы увидеть маршруты prod. Я действительно вижу в своих журналах, что профиль prod активирован, но похоже, что отсутствие свойств в разделе «по умолчанию» вверху приводит к тому, что они не применяются, когда синтаксический анализатор считывает их из раздела профиля.

Еще я попробовал установить свойства «dev» как значения по умолчанию, а затем попытался использовать свойства профиля «prod» для перезаписи URI. Там произошла аналогичная проблема - я попал в конечную точку исполнительного механизма и получил обратные маршруты, но они были всего лишь разработками по умолчанию.

Как я могу использовать профили Spring для настройки различных маршрутов Spring Cloud Config в моем application.yml?

Версии:

  • spring-cloud-gateway 2.0.1.BUILD-SNAPSHOT (to get a workaround for this bug, probably not relevant)
    • spring-cloud-starter-gateway
  • spring-boot 2.0.3.RELEASE
    • spring-boot-starter-webflux
    • пружина-пыльник-пускатель-привод

(Я не могу использовать Spring Cloud Config по политическим причинам. Главный архитектор моей компании серьезно пострадал от синдрома Not Invented Here.)


person Roddy of the Frozen Peas    schedule 16.07.2018    source источник


Ответы (1)


Вы не можете использовать spring.profiles.default в файле свойств. Устанавливать такое значение будет поздно. Таким образом, вы можете установить его, используя программный аргумент (или свойство System). Например.

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

person nmyk    schedule 03.08.2018