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.
Таким образом, в основном каждый раз, когда клиент запрашивает свойства у 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. Я надеюсь, что они скоро рассмотрят его, так как кажется, что многие спрашивали об этой функции в переполнении стека, и, конечно, еще многие ищут ее и читают рекомендованные в настоящее время решения.
Стоит упомянуть, что многие люди советуют "злоупотреблять" функцией профиля для достижения этой цели, что, по моему скромному мнению, является плохой практикой, как я описываю в этом ответе.