Весенняя загрузка параметров чтения из AWS хранилища параметров - PullRequest
4 голосов
/ 08 января 2020

Я создал приложение весенней загрузки (gradle) и включил зависимость: org.springframework.cloud:spring-cloud-starter-aws-parameter-store-config.

Я хочу использовать AWSSimpleSystemsManagement для чтения конфигурации из AWS хранилища параметров, но я вынужден написать его как это (в aws):

 config/application_dev/server.port: 8080

Есть ли способ прочитать что-то подобное из весенней загрузки: dev.application.server.port:8080

В настоящее время все это управляется из автоконфигурации, я думаю есть ли способ переопределить это

Ответы [ 3 ]

2 голосов
/ 11 января 2020

В 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
0 голосов
/ 13 января 2020
0 голосов
/ 08 января 2020

Вам необходимо создать файл bootstrap .propeties, чтобы настроить путь root, добавить «aws .paramstore.prefix = dev» в файл, чтобы заменить «config»

. см .: https://cloud.spring.io/spring-cloud-static/spring-cloud-aws/2.0.0.RELEASE/multi/multi__cloud_environment.html раздел 3.2

...