Spring Cloud Конфигурация нескольких профилей - PullRequest
0 голосов
/ 29 ноября 2018

Я хочу настроить несколько профилей для своего spring_cloud_config_server.

Вот мой файл yml:

server:
  port: "2000"

spring:
  profiles:
    active: native
  application:
    name: config-server
  cloud:
    config:
      server:
        native:
          search-locations: file:///opt/app/configuration

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8260/eureka

logging:
  level:
    org:
      springframework: INFO
---
spring:
  profiles: docker
  application:
    name: config-server
  cloud:
    config:
      server:
        native:
          search-locations: file:/opt/app/configuration

server:
  port: "2000"

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8260/eureka

logging:
  level:
    org:
      springframework: INFO

Когда я запускаю приложение, используя "собственный" профиль, используя следующую команду

java -jar app.jar

или

java -jar -Dspring.profiles.active=native app.jar

Приложение работает хорошо.Когда я запускаю приложение, используя профиль «docker», используя следующую команду

java -jar -Dspring.profiles.active=docker app.jar

Приложение закрывается с исключением:

ERROR o.s.b.w.e.tomcat.TomcatStarter - Error starting Tomcat context. Exception: org.springframework.beans.factory.BeanCreationException. Message: Error creating bean with name 'servletEndpointRegistrar' defined in class path resource [org/springframework/boot/actuate/autoconfigure/endpoint/web/ServletEndpointManagementContextConfiguration$WebMvcServletEndpointManagementContextConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.actuate.endpoint.web.ServletEndpointRegistrar]: Factory method 'servletEndpointRegistrar' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'healthEndpoint' defined in class path resource [org/springframework/boot/actuate/autoconfigure/health/HealthEndpointConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.actuate.health.HealthEndpoint]: Factory method 'healthEndpoint' threw exception; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'configServerHealthIndicator' defined in class path resource [org/springframework/cloud/config/server/config/EnvironmentRepositoryConfiguration.class]: Unsatisfied dependency expressed through method 'configServerHealthIndicator' parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.cloud.config.server.config.CompositeConfiguration': Unsatisfied dependency expressed through method 'setEnvironmentRepos' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'defaultEnvironmentRepository' defined in class path resource [org/springframework/cloud/config/server/config/DefaultRepositoryConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: You need to configure a uri for the git repository.

Основная причина:

Exception: You need to configure a uri for the git repository.

Правильно ли мой файл yml для двух профилей?Я что-то пропустил, чтобы он работал для обоих профилей?

1 Ответ

0 голосов
/ 11 декабря 2018

Поведение Spring Cloud Config Server по умолчанию - логика для профиля git.Поэтому он пытается найти свойство spring.cloud.config.server.git.uri, которого у вас нет.

Чтобы устранить проблему, вам нужно включить профиль native в обоих случаях.Собственная конфигурация начинает работать только тогда, когда активен «родной» профиль:

public class EnvironmentRepositoryConfiguration { 
......
@Configuration
@ConditionalOnMissingBean(EnvironmentRepository.class)
@Profile("native")
class NativeRepositoryConfiguration {

  @Bean
  public NativeEnvironmentRepository 
     nativeEnvironmentRepository(NativeEnvironmentRepositoryFactory factory,
        NativeEnvironmentProperties environmentProperties) {
    return factory.build(environmentProperties);
  }
}
......

Подробнее см. Здесь: https://github.com/spring-cloud/spring-cloud-config/blob/master/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/EnvironmentRepositoryConfiguration.java#L215

Поскольку Spring Boot поддерживает несколько профилей в вашем конкретном случае, я бы рекомендовал использовать«включая» дополнительные возможности профилей Spring Boot.См .: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html#boot-features-adding-active-profiles

В основном ваша конфигурация application.yml будет выглядеть следующим образом:

spring.profiles: some-profile-1
spring.profiles.include:
  - native
# specific configuration for 'some-profile-1'

---

spring.profiles: some-profile-2
spring.profiles.include:
  - native
# specific configuration for 'some-profile-2'

И вы просто активируете активный профиль, передавая -Dspring.profiles.active=some-profile-1 (or 2)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...