В application.properties вы можете определить свойство server.port=8081
.
Форматы параметров , поддерживаемые spring-cloud-starter- aws -параметр-хранилище-config :
/config/application/server.port
/config/application_dev/server.port
/config/my-service/server.port
/config/my-service_dev/server.port
Определив следующие свойства в bootstrap .properties , вы можете каким-либо образом изменить формат:
spring.application.name=my-service
aws.paramstore.prefix=/config
aws.paramstore.defaultContext=application
aws.paramstore.profileSeparator=_
Но только в простых настройках поддерживаются, потому что основным параметром именования logi c является жесткий код в AwsParamStorePropertySourceLocator
.
. Чтобы кардинально изменить формат параметра, необходимо определить пользовательский PropertySourceLocator
и зарегистрировать его как bootstrap configuration.
Проблема в том, что dev.application.server.port
является недопустимым именем параметра.
AWS Хранилище параметров системного менеджера использует /
в качестве разделителя пути, а Spring использует операцию get-parameters-by-path . Обходной путь должен использовать имя dev.application/server.port
.
Но это имя также недействительно. Имя параметра должно быть полностью определенным именем, поэтому действительное имя /dev.application/server.port
.
Для поддержки такого формата параметра определите пользовательский PropertySourceLocator
@Configuration
public class CustomAwsParamStorePropertySourceLocator implements PropertySourceLocator {
private static final Logger LOGGER =
LoggerFactory.getLogger(CustomAwsParamStorePropertySourceLocator.class);
private AWSSimpleSystemsManagement ssmClient;
private List<String> contexts = new ArrayList<>();
public CustomAwsParamStorePropertySourceLocator(AWSSimpleSystemsManagement ssmClient) {
this.ssmClient = ssmClient;
}
public List<String> getContexts() {
return contexts;
}
@Override
public PropertySource<?> locate(Environment environment) {
if (!(environment instanceof ConfigurableEnvironment)) {
return null;
}
ConfigurableEnvironment env = (ConfigurableEnvironment) environment;
List<String> profiles = Arrays.asList(env.getActiveProfiles());
String defaultAppName = "application";
this.contexts.add("/" + defaultAppName + "/");
addProfiles(this.contexts, defaultAppName, profiles);
String appName = env.getProperty("spring.application.name");
this.contexts.add("/" + appName + "/");
addProfiles(this.contexts, appName, profiles);
Collections.reverse(this.contexts);
CompositePropertySource composite = new CompositePropertySource("custom-aws-param-store");
for (String propertySourceContext : this.contexts) {
try {
composite.addPropertySource(create(propertySourceContext));
} catch (Exception e) {
LOGGER.warn("Unable to load AWS config from " + propertySourceContext, e);
}
}
return composite;
}
private void addProfiles(List<String> contexts, String appName, List<String> profiles) {
for (String profile : profiles) {
contexts.add("/" + profile + "." + appName + "/");
}
}
private AwsParamStorePropertySource create(String context) {
AwsParamStorePropertySource propertySource =
new AwsParamStorePropertySource(context, this.ssmClient);
propertySource.init();
return propertySource;
}
}
и зарегистрируйте его в контексте bootstrap, добавив файл META-INF/spring.factories
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.example.CustomAwsParamStorePropertySourceLocator