2016-12-21 2 views
2

Моя цель - добавить пользовательский PropertySource к spring-cloud-серверу. Я хочу получить некоторые пользовательские свойства из этого настраиваемого источника в приложении spring-cloud-config-client.Spring cloud config server - как добавить пользовательский PropertySource, видимый в методе findOne() EnvironmentEncryptorEnvironmentRepository

Основываясь на предложениях от Adding environment repository in spring-config-server Я создал spring-cloud-config-server приложение и отдельный проект spring-cloud-config-custom. Второй - на основе кода spring-cloud-consul-config. Итак, я создал все необходимые классы, такие как CustomPropertySource, CustomPropertySourceLocator, CustomConfigBootstrapConfiguration и т. Д. И настроил их в spring.factories.

В конце я добавил зависимость от maven к spring-cloud-config-custom внутри моего spring-cloud-config-server.

Пока все хорошо. Все работает хорошо. Когда я запускаю сервер, я вижу, что мой CustomPropertySource находится в списке propertySources внутри EnviromentRepository bean injected to EnvironmentController.

Проблема: Когда я посылаю запрос GET на @RequestMapping("/{name}/{profiles}/{label:.*}")EnvironmentController), впрыскивается EnviromentRepository боб используется, чтобы найти требуемый источник свойств (repository.findOne(name, profiles, label) метод). К сожалению, моего источника собственности здесь не найдено. Зачем?

Я потратил много времени на отладку этого. Я обнаружил, что делегат репозитория вызывает вызов метода findOne() в другие репозитории: MultipleJGitEnvironmentRepository, который делегирует его NativeEnvironmentRepository. Внутри этого делегата метод findOne() не использует propertySources от EnviromentRepository первичного ввода в контроллер. Он создает новый репозиторий среды с новым списком PropertySources и новой отдельной SpringApplication. В конце этот список не содержит мой CustomPropertySource, и именно поэтому findOne() возвращает пустую собственность. Источники в результате Environment объекта.

  1. Я делаю что-то неправильно?
  2. ли CustomPropertySourceLocator (и/или ConsulPropertySourceLocator) предполагается использовать (autowired/бутстрапируемым) в spring-cloud-config-server или spring-cloud-config-client
  3. Может весну-облако-конфигурация-сервер доставить много различных видов PropertySources в то же время, через интерфейс REST (говоря «разные», я имею в виду всех Git, Consul и Zookeeper)?
+0

Какую версию Spring Cloud вы используете? До недавнего времени, если в этом контексте существовал другой компонент «EnvironmentRepository», ни один из компонентов по умолчанию «EnvironmentRepository» не был бы создан, поэтому я смущен тем, как «MultipleJGitEnvironmentRepository» или «NativeEnvironmentRepository» будут созданы в вашем случае.Можете ли вы предоставить пример приложения, демонстрирующий проблему, которую вы видите? –

+0

Я использую 1.1.0.RELEASE. – mombip

+0

Я использую 1.1.0.RELEASE. «EnvironmentRepository», введенный в «EnvironmentController», изначально «EnvironmentEncryptorEnvironmentRepository». Он делегирует вызов 'MultipleJGitEnvironmentRepository', который наследует реализацию от' AbstractScmEnvironmentRepository'. FindOne() из последнего делает новый 'NativeEnvironmentRepository' проходящий' ConfigurableEnvironment', который содержит мой 'CustomPropertySource' внутри источника свойств bootstrapProperties. Это означает, что «NativeEnvironmentRepository» фильтрует его из-за жестко закодированного «-spring.cloud.bootstrap.enabled = false» в методе getArgs(). – mombip

ответ

1

Что вы делаете, это добавить источник свойств к самому серверу конфигурации, а не к конфигурации, которую он обслуживает. Добавление spring-boot-starter-actuator к конфигурационного сервера и просмотр /env показывает:

{ 
    "profiles": [ 

    ], 
    "server.ports": { 
    "local.server.port": 8888 
    }, 
    "bootstrapProperties:custom": { 
    "test.prop3": "CUSTOM-VALUE-3", 
    "test.prop2": "CUSTOM-VALUE-2", 
    "test.prop1": "CUSTOM-VALUE-1" 
    }, 
} 

Чтобы добавить что-то, что будет обслуживаться конфигурации сервера, вы должны реализовать EnvironmentRepository.

Опора для композита EnvironmentRepository была recently added.

+0

Да, это то, что я наконец сделал. Я реализовал EnvironmentRepository и работает хорошо. В самом начале я был убежден, что 'bootstrapProperties', определенные на стороне сервера, должны быть автоматически доступны для клиентов конфигурации. Теперь я вижу, что я ошибся. Таким образом, вывод таков: Autoregistering 'PropertySources' предназначен только для ** внутреннего использования ** приложения, которое его регистрирует. В моем случае 'config-server' может использовать мой' CustomPropertySource', но не публиковать его. Итак, насколько я понимаю, нет официального способа заставить config-сервер обслуживать его bootstrap 'PropertySources'. – mombip