генерация программных метаданных Spring Cloud

В любом случае, я могу сгенерировать некоторые метаданные для добавления в службу при ее регистрации.

Мы переходим с Eureka на Consul, и мне нужно добавить значение UUID в зарегистрированные метаданные при запуске службы. Чтобы позже я мог получить это значение метаданных при извлечении экземпляров службы по имени.

Немного предыстории: мы использовали этот превосходный пользовательский интерфейс из https://github.com/VanRoy/spring-cloud-dashboard. Он настроен на использование модели Eureka для служб, в которых у вас есть приложение с именем. Каждое приложение будет иметь несколько экземпляров, каждый с идентификатором экземпляра.

Таким образом, в модели eureka существует двухуровневое описание службы, тогда как модель весеннего облака является плоской, где n экземпляров, каждый из которых имеет идентификатор службы.

Плоская модель не будет работать с пользовательским интерфейсом, на который я ссылался выше, поскольку нет различий между именем приложения и идентификатором экземпляра, который является моделью Spring, это одно и то же.

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


person EvilJinious1    schedule 25.08.2016    source источник


Ответы (2)


См. документация по метаданным и тегам в Spring Cloud Consul. Consul еще не поддерживает метаданные при обнаружении сервисов, но в весеннем облаке есть абстракция метаданных (просто карта строк). В консуле теги, созданные в стиле key=value, анализируются в этой карте метаданных.

Например, в application.yml:

spring:
  cloud:
    consul:
      discovery:
        tags: foo=bar, baz

Приведенная выше конфигурация приведет к карте с foo→bar и baz→baz.

person spencergibb    schedule 25.08.2016
comment
да, видел это. Я действительно хочу вводить значения через код, а не статически, как у вас есть. Так что, если нет возможности ввести их как часть регистрации службы в консуле, то я думаю, что это почти конец моих усилий :) Да? - person EvilJinious1; 25.08.2016
comment
Нет, есть несколько способов: вы создаете EnvironmentPostProcessor, который внедряет свойство, вы также можете расширить ConsulLifecycle. - person spencergibb; 25.08.2016
comment
интересно. Я просто смотрел на код ConsulLifeccyle. Так что, если я расширяю его, я добавляю метатдат (теги) в консул, чтобы другие службы могли их видеть при регистрации службы? Я все равно попробую, но только для уточнения. Спасибо - person EvilJinious1; 25.08.2016

Основываясь на ответе Спенсера, я добавил в свой код EnvironmentPostProcessor.

Это работает, и я могу добавить тег метаданных, который я хочу, программно, но он является дополнением к элементу «tags: foo=bar, baz», поэтому он переопределяет этот. Я, вероятно, найду способ обойти это на следующий день или около того, но я подумал, что добавлю то, что я сделал для других, которые смотрят на этот ответ и говорят: «Итак, что вы сделали?»

сначала добавьте класс следующим образом:

@Slf4j
public class MetaDataEnvProcessor implements EnvironmentPostProcessor, Ordered {

    // Before ConfigFileApplicationListener
    private int order = ConfigFileApplicationListener.DEFAULT_ORDER - 1;

    private UUID instanceId = UUID.randomUUID();

    @Override
    public int getOrder() {
        return this.order;
    }

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment,
                                       SpringApplication application) {

        LinkedHashMap<String, Object> map = new LinkedHashMap<>();
        map.put("spring.cloud.consul.discovery.tags", "instanceId="+instanceId.toString());
        MapPropertySource propertySource = new MapPropertySource("springCloudConsulTags", map);
        environment.getPropertySources().addLast(propertySource);
    }

}

затем добавьте spring.factories в resources/META-INF со следующей строкой eht, чтобы добавить этот процессор

org.springframework.boot.env.EnvironmentPostProcessor=com.example.consul.MetaDataEnvProcessor

Это отлично работает, за исключением переопределения того, что находится в вашем файле application.yml для тегов.

person EvilJinious1    schedule 26.08.2016
comment
Вы можете сначала прочитать значение из Environment, а затем добавить новое, чтобы оно не перезаписывалось. - person spencergibb; 26.08.2016