Облачный сервер конфигурации Spring — как добавить пользовательский PropertySource, видимый в методе findOne () EnvironmentEncryptorEnvironmentRepository

Моя цель – добавить собственный источник свойств на сервер spring-cloud. Чего я хочу добиться, так это получить некоторые пользовательские свойства из этого пользовательского источника в приложении spring-cloud-config-client.

Основываясь на предложениях Добавление репозитория среды в 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 находится в списке источников свойств внутри bean-компонента EnviromentRepository, введенного в EnvironmentController.

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

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

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

person Marek Podyma    schedule 21.12.2016    source источник
comment
Какую версию Spring Cloud вы используете? До недавнего времени, если бы в контексте был другой компонент EnvironmentRepository, ни один из компонентов EnvironmentRepository по умолчанию не был бы создан, поэтому я не понимаю, как в вашем случае будут созданы MultipleJGitEnvironmentRepository или NativeEnvironmentRepository. Можете ли вы предоставить пример приложения, демонстрирующего проблему, с которой вы столкнулись?   -  person Ryan Baxter    schedule 22.12.2016
comment
Я использую 1.1.0.RELEASE.   -  person Marek Podyma    schedule 22.12.2016
comment
Я использую 1.1.0.RELEASE. EnvironmentRepository, введенный в EnvironmentController, изначально является EnvironmentEncryptorEnvironmentRepository. Он делегирует вызов MultipleJGitEnvironmentRepository, который наследует реализацию от AbstractScmEnvironmentRepository. FindOne() из последнего создает новый NativeEnvironmentRepository, передавая ConfigurableEnvironment, который содержит мой источник свойства CustomPropertySource внутри bootstrapProperties. Похоже, что NativeEnvironmentRepository фильтрует его из-за жестко запрограммированного --spring.cloud.bootstrap.enabled=false в методе getArgs().   -  person Marek Podyma    schedule 22.12.2016
comment
Опять же, некоторый код, который воспроизводит проблему, может помочь.   -  person Ryan Baxter    schedule 22.12.2016
comment
Я подготовил примеры приложений и сделал их доступными здесь. Пожалуйста, сравните результаты вызова контекста /myenv на стороне сервера и клиента (http:/localhost:8888/myenv и localhost:8080/ myenv). Источник моего пользовательского свойства (пользовательский) недоступен на стороне клиента. Обратите внимание, что клиент не использует мой CustomPropertySourceLocator напрямую. Я пытаюсь заставить сервер обслуживать CustomPropertySource   -  person Marek Podyma    schedule 29.12.2016


Ответы (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 была недавно добавлена.

person spencergibb    schedule 09.01.2017
comment
Да, это то, что я наконец сделал. Я внедрил EnvironmentRepository, и он работает хорошо. В самом начале я был убежден, что bootstrapProperties, определенный на стороне сервера, должен быть автоматически доступен для клиентов конфигурации. Теперь я вижу, я ошибался. Таким образом, вывод такой: Авторегистрация PropertySources предназначена для только внутреннего использования приложения, которое ее регистрирует. В моем случае config-server может использовать мой CustomPropertySource, но не публиковать его. Итак, насколько я понимаю, нет официального способа заставить config-server обслуживать его загрузочный PropertySources. - person Marek Podyma; 11.01.2017