Spring Cloud Server, обслуживающий несколько файлов свойств для одного приложения

Допустим, у меня есть приложение A, которое имеет 3 файла свойств:

-> applicationA
          - datasource.properties
          - security.properties
          - jms.properties

Как переместить все свойства на облачный сервер Spring и сохранить их в отдельности?

На сегодняшний день я настроил сервер конфигурации, который будет читать только ОДИН файл свойств, так как это кажется стандартным способом. Этот файл, который получает сервер конфигурации, похоже, решен с помощью spring.application.name. В моем случае он будет читать только один файл с таким именем:

-> applicationA.properties

Как я могу добавить другие файлы, которые будут разрешены сервером конфигурации?

2 ответа

Это можно сделать. Вам нужно создать свой собственный EnvironmentRepository, который загружает ваши файлы свойств.

org.springframework.cloud.config.server.support.AbstractScmAccessor # getSearchLocations выполняет поиск файлов свойств для загрузки:

for (String prof : profiles) {
            for (String app : apps) {
                String value = location;
                if (app != null) {
                    value = value.replace("{application}", app);
                }
                if (prof != null) {
                    value = value.replace("{profile}", prof);
                }
                if (label != null) {
                    value = value.replace("{label}", label);
                }
                if (!value.endsWith("/")) {
                    value = value + "/";
                }
                output.addAll(matchingDirectories(dir, value));
            }
        }

Там вы можете добавить пользовательский код, который читает необходимые файлы свойств. Приведенный выше код точно соответствует поведению, описанному в весенних документах. NativeEnvironmentRepository НЕ имеет никакого доступа к GIT/SCM, поэтому вы должны использовать JGitEnvironmentRepository в качестве основы для собственной реализации.

Невозможно так, как вы просили. Сервер Spring Cloud Config использует NativeEnvironmentRepository, который:

Простая реализация {@link EnvironmentRepository}, которая использует SpringApplication и файлы конфигурации, расположенные по обычным протоколам. Результирующая среда состоит из источников свойств, расположенных с использованием имени приложения в качестве основы файла конфигурации (spring.config.name) и имени среды в качестве профиля Spring.

См.: https://github.com/spring-cloud/spring-cloud-config/blob/master/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/NativeEnvironmentRepository.java

Таким образом, в основном каждый раз, когда клиент запрашивает свойства у Config Server, он создает ConfigurableApplicationContext с использованием SpringApplicationBuilder. И он запускается со следующим свойством конфигурации:

String config = application;
if (!config.startsWith("application")) {
    config = "application," + config;
}
list.add("--spring.config.name=" + config);

Таким образом, возможные имена для файлов свойств будут только application.properties(or .yml) и настройте имя клиентского приложения, которое запрашивает настройку - в вашем случае applicationA.properties,

Но вы можете "обмануть". В конфигурации сервера конфигурации вы можете добавить такое свойство

spring:
  cloud:
    config:
      server:
        git:
          search-paths: '{application}, {application}/your-subdirectory'

В этом случае Config Server будет искать те же имена файлов свойств, но в нескольких каталогах, и вы можете использовать подкаталоги для разделения ваших свойств. Таким образом, с конфигурацией выше вы сможете загрузить конфигурацию из:

applicationA/application.properies
applicationA/your-subdirectory/application.properies

Как указал @nmyk, ​​NativeEnvironmentRepository загружает мини-приложение для сбора свойств, предоставляя им - вроде разговоров - "жестко закодированные" {appname}. * И application. * Поддерживаемые имена файлов свойств. (@Stefan Isele - prefabware.com JGitEnvironmentRepository в конечном итоге также использует NativeEnvironmentRepository).

Я отправил запрос на извлечение для spring-cloud-config-server 1.4.x, который поддерживает определение дополнительных имен файлов через свойство среды spring.cloud.config.server.searchNames, в том же смысле, что и для отдельного springboot. app, как определено в разделе " Файлы свойств Externalized Configuration.Application " документации, с использованием свойства окружения spring.config.name. Я надеюсь, что они скоро рассмотрят его, так как кажется, что многие спрашивали об этой функции в переполнении стека, и, конечно, еще многие ищут ее и читают рекомендованные в настоящее время решения.

Стоит упомянуть, что многие люди советуют "злоупотреблять" функцией профиля для достижения этой цели, что, по моему скромному мнению, является плохой практикой, как я описываю в этом ответе.

Другие вопросы по тегам