Источником конфигурации приложения обычно является сервер удаленного конфигурации. По умолчанию приоритет локальной конфигурации ниже, чем репозиторий удаленной конфигурации. Если вы хотите внедрить локальные переменные системы приложений и файлы конфигурации, чтобы перезаписать значения свойств в удаленном хранилище, вы можете установить их следующим образом:
Spring: Cloud: Config: AllowOverride: TrueOverridenone: TrueOverridesystemProperties: False
Благодаря вышеуказанной конфигурации клиент может достичь более высокого приоритета в локальной конфигурации и не может быть перезаписан. Поскольку текущая версия Spring Cloud , на которой мы основаны, является Edgware.RELEASE , вышеуказанные настройки не работают, но используйте значения по умолчанию в PropertySourceBootstrapProperties . Для конкретных ситуаций см. Вопрос: https://github.com/spring-cloud/spring-cloud-commons/pull/250. Мы поговорим о конкретном источнике ошибки в следующем анализе.
Анализ исходного кода
Configservicepropertysourcelocator
Перезапись свойств удаленной конфигурации в конечном итоге связан с получением конфигурации в начале клиента. Как справиться с этим после получения конфигурации? Давайте посмотрим на схему класса класса сбора ресурсов ConfigServicePropertySourcelocator в конфигурации Spring Cloud.
ConfigServicePropertySourcelocator - это по сути локатор ресурсов свойств, и его основным методом является местоположение (среда окружающей среды). Во -первых, замените заполнителя в ConfigClientProperties приложением, профилем и меткой среды, в которой приложение в настоящее время работает, и инициализируйте RestTemplate, затем переигрывает через массив метки до тех пор, пока не будет получена допустимая информация о конфигурации, и, наконец, повторно повторно на основе того, быстро ли она не пройдет. Основной процесс заключается в следующем:
Найдите (среда окружающей среды). Вызовите метод GetRemoteNvironment (RestTemplate, свойства, метка, состояние), чтобы получить данные конфигурации на удаленном сервере через HTTP. Реализация также очень проста. Отобразите заполнитель на пути запроса замены, а затем собирайте заголовки. После сборки запрос может быть отправлен, и результат будет возвращен.
В приведенной выше реализации мы видим, что полученная информация о конфигурации хранится в CompositePropertySource. Как мы его используем? Другим важным классом, который можно добавить здесь, является свойство, которое взимается на объекте, которая реализует интерфейс ApplicationContextInitializer. Этот интерфейс обновит (), чтобы быть вызванным до того, как контекст приложения будет обновлен, тем самым выполняя операцию инициализации. Стек вызовов после начала приложения выглядит следующим образом:
SpringApplicationBuilder.Run () -> SpringApplication.Run () -> SpringApplication.CreateAndRefreshContext () -> SpringApplication.ApplyInitializers () -> PropertySourceBootStrapConfiguration.Itialize () PropertySourceBootStrapGutraguration
Метод местоположения вышеуказанного ConfigServicePropertySourcelocator будет вызван в инициализации, чтобы гарантировать, что контекст может получить необходимую информацию о конфигурации до обновления. Давайте посмотрим на метод инициализации:
Public Class PropertySourceBootStrapConfigurationImplomements ApplicationContextInitialize <configurableApplicationContext>, заказан {private int order = ordered.highest_precedence + 10; @Autowired (required = false) частный список <propertysourcelocator> propertysourcelocators = new ArrayList <> (); @Override public void инициализация (configurableApplicationContext ApplicationContext) {compositePropertySource composite = new CompositepRopertySource (bootstrap_property_source_name); // Сортируйте массив PropertySourcelocators и следуйте по умолчанию AnnotationAwareRoderComparator AnnotationAwareorderComparator.sort (this.propertysourcelocators); логический пустой = true; // Получить контекстное контекст среды. Для (PropertySourcelocator Locator: this.propertysourcelocators) {// transraight this.propertysourcelocators Propertysource <?> Source = null; источник = locator.locate (среда); if (source == null) {продолжить; } logger.info ("Расположенный источник свойства:" + source); // Добавить источник в связанный список свойств. пусто = false; } // Только если источник не является пустым, он будет установлен в среде, если (! Пусто) {// Возвращает переменную форму среды, которая может быть выполнена, такая как AddFirst и Addlast mitablePropertySources propertysources = Environment.getPropertySources (); String logConfig = Environment.ResolvePlaceholders ("$ {logging.config:}"); Logfile logfile = logfile.get (Environment); if (propertysources.contains (bootstrap_property_source_name)) {// Удалить bootstrapproperties propertysources.remove (bootstrap_property_source_name); } // Установить свойства insertPropertySources (PropertySources, Composite); reinitializeloggingsystem (среда, logconfig, logfile); Setloglevels (среда); // Установка информации о конфигурации нескольких акций профилей лярнично -профиль (среда); }} // ...}Давайте посмотрим, какие операции выполняются в методе инициализации.
Возвращает переменную форму среды, которая может быть выполнена, например, AddFirst, Addlast
Удалить Bootstrapproperties в собственности
Согласно правилам переопределения сервера конфигурации, установите свойства.
Обработка информации о конфигурации для нескольких активных профилей
При инициализации метода инициализации сначала пройдите метод местоположения всех объектов типов PropertySourcelocator , затем поместите значения свойств, полученные различными способами в CompositepRopertySource , и, наконец, вызовите метод InsertPropertySources (PropertySources, Composite) , чтобы установить его в окружающую среду. Cloud Context Spring предоставляет свойства PropertySourceBootStrapproperties , которые перезаписывают удаленные свойства и используют этот класс конфигурации для определения приоритета источника свойства.
private void insertpropertysources (mitablepropertysources propertysources, compositepropertysource composite) {intablepropertysources outment = new MitablePropertySources (); outment.addfirst (композит); PropertySourceBootStrapperties remoteProperties = new PropertySourceBootStrapperties (); Новый RelectedDatabinder (RemoteProperties, "Spring.Cloud.Config") .Bind (новые свойства PropertySourcesPropertyValues (вход)); // Если локальная перезапись не разрешена (! RemoteProperties.islowOverride () || (! RemoteProperties.isoverridenone () && remoteproperties.isoverridesystemproperties ())) {PropertySources.addfirst (composite); возвращаться; } // overdenone верно, внешняя конфигурация имеет самый низкий приоритет if (remoteproperties.isoverridenone ()) {PropertySources.Addlast (composite); возвращаться; } if (propertysources .contains (standardenvironment.system_environment_property_source_name)) {// Установить приоритет внешних конфигураций в соответствии с переопределениями -эмппертами if (! remoteproperties.isoverridesystemproperties () {! Standarenvironment.system_environment_property_source_name, composite); } else {propertysources.addbefore (standarenVironment.system_environment_property_source_name, composite); }} else {propertySources.addlast (composite); }}Вышеупомянутая реализация в основном корректирует приоритет множества источников конфигурации на основе свойств в свойствах . Из его реализации мы видим, что объект PropertySourceBootStrapperties инициализируется напрямую, используя значение свойства по умолчанию и не вводится в то, что мы установили в файле конфигурации.
Ремонтная реализация:
@Autowired (требуется = false) частная недвижимость. @Override public int getOrder () {return this.order; private void insertpropertysources (mitablepropertysources propertysources, compositepropertysource composite) {intablepropertysources outment = new MitablePropertySources (); outment.addfirst (композит); PropertySourceBootStrapperties remoteProperties = remotePropertiesForoverRiding == NULL? New PropertySourceBootStrapperties (): RemotePropertiesForoverRiding;Суммировать
Выше приведено подробное объяснение примера удаленной конфигурации, представленное редактором, введено пример, представленное редактором. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!