2015-06-10 1 views
3

Я хочу, чтобы достичь следующего:Отключить конфигурацию сервера Spring Cloud с помощью профиля?

  • в режиме 'Dev', embbed Spring Cloud Config в текущем веб-приложение
  • когда не в режиме 'Dev', подключиться к серверу Spring Cloud Config экземпляр, который уже работает

Таким образом, мой путь к классам для текущего веб-приложение содержит зависимости в конфигурации сервера и клиента:

<dependency> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-starter-config</artifactId> 
</dependency> 
<dependency> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-config-server</artifactId> 
</dependency> 

В режиме разработчика, и со следующими свойствами в bootstrap.yml, это нормально (встроенный сервер конфигурации сконфигурирован и запущен)

spring: 
    application: 
    name: app1 
    profiles: 
    active: dev 
    cloud: 
    config: 
     uri: ${SPRING_CONFIG_URI:http://localhost:8888} 

--- 

spring: 
    profiles: dev 
    cloud: 
    config: 
     server: 
     bootstrap: true 
     git: 
      uri: https://github.com/nocquidant/my-config-repo.git 
      basedir: target/config 

Когда не в режиме «Dev» (spring.profiles.active = prod, например), текущий webapp не запускается: он не может autowire мои свойства (я думаю, что встроенный сервер запущен с плохой конфигурацией)

Если я прокомментирую зависимость spring-cloud-config-server в POM, то это работает.

Я thougth я мог бы достичь того, чего я хочу, используя следующее, но нет (на самом деле с помощью EnableConfigServer или нет, кажется, не изменить ничего):

@Configuration 
@Profile("dev") 
@EnableConfigServer 
public static class EmbeddedConfigServer { } 

Как я мог сделать (без использования профиля Maven) ? Есть ли простой способ отключить конфигурационный сервер весеннего облака? Есть ли лучший способ достичь моей цели?

Любая помощь приветствуется.

P.S. Используемая версия:

<parent> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-starter-parent</artifactId> 
    <version>1.0.3.BUILD-SNAPSHOT</version> 
</parent> 

// Ник

// --- Edit # 1

Пожалуйста, см простой проект на GitHub: https://github.com/nocquidant/exchange/tree/master/poc-spring-cloud/

Он содержит 2 простых модулей: конфи сервер и клиент-приложение.

Во-первых, если вы запускаете класс клиента из модуля клиент-приложение, все в порядке (встроенный режим включен => см профиль Дев в bootstrap.yml)

Затем запуск конфиг-сервера (ConfigServer класс). Затем измените «spring.profiles.active» на «prod» (или что-то еще) в клиентском приложении и перезапустите его: инъекция свойств больше не работает (и Webapp отказывается запускаться).

Caused by: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors 
Field error in object 'server' on field 'port': rejected value [${taap.bak.config.port}]; 

Таким образом, он не может подключиться к модулю конфигурационного сервера. И если вы прокомментируете зависимости maven: spring-cloud-config-server от модуля клиент-приложение, он снова работает.

Надеюсь, теперь это яснее. Спасибо,

+0

Я бы подумал, что '@Profile (« dev »)' работал бы. Какую ошибку вы видите? – spencergibb

+0

Я только что редактировал свой пост, чтобы сделать его более понятным. Благодарю. –

ответ

5

Согласно this class яровой облачного сервера конфигурации: сервер Config отключает конфигурации клиента явно, если не установлен spring.cloud.config.enabled=true от системы собственности (-D) или через SpringApplicationBuilder. Это единственный способ заставить это работать в настоящее время. Вы можете подать запрос об улучшении, объясняющий ваш вариант использования.

+0

Я видел и пытался установить это свойство в моем bootstrap.yml (для профиля! Dev), но безуспешно. Я просто попытался установить его из свойства System ('-D'), и он работает так, как ожидалось. Благодаря! Постскриптум Кажется, что это не работает с помощью 'SpringApplicationBuilder' ... –

Смежные вопросы