изменение пользовательских аннотаций на лету из Spring Cloud Config Server. Является ли это возможным? - PullRequest
0 голосов
/ 13 июля 2020

Контекст: мне нужно предоставить способ изменения значений параметров во время производства с минимальными затратами на производительность.

Цель: я хочу изменять значения аннотаций на лету и применять их сразу ко всем экземплярам микросервисов.

Персональный опыт и ограничения: я знаю, что могу использовать Spring Cloud Config для изменения параметров на лету, как описано в этой статье , и я знаю, что при изменении аннотаций на странице есть некоторые проблемы и подводные камни. fly также, как описано в stackoveflow question .

Я знаю, что Spring Cloud Config можно использовать для настройки централизованной конфигурации, применяемой ко всем экземплярам микросервисов во время загрузки / запуска. Я немного его использовал. Мне интересно, могу ли я использовать его для централизации параметров, которые могут влиять на настраиваемые аннотации на лету.

Предполагаемое решение:

... всякий раз, когда мне нужно somepRopertyValue

@Value("${config.somePropertyValue}")
private String somePropertyValue;

@Bean
public String somePropertyValue(){
    return somePropertyValue;
}

Клиент конфигурации во всех конечных точках микросервисов, который должен вызываться не только при запуске приложения, но и всякий раз, когда somePropertyValue управляется в Spring Cloud Config Server bootstrap .properties обновляется:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class SpringConfigClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringConfigClientApplication.class, args);
    }
}

@RefreshScope
@RestController
class MessageRestController {

    @Value("${server.somePropertyValue:Unable to connect to config server}")
    private String somePropertyValue;

    @RequestMapping("/server/somePropertyValue")
    String getSomePropertyValue() {
        return this.somePropertyValue;
    }
}
 

И каким-то образом поддерживается somePropertyValue в Spring Cloud Config, и если изменение во время производства, оно влияет на запрос везде, где somePropertyValue помечается во всех экземплярах микросервиса. c и когда он получает новое сообщение, он на лету меняет значение параметра. Это кажется таким странным, что я создал зависимость Kafka во всех микросервисах компании. Поскольку я использовал Spring Config для немного похожего сценария, мне интересно, есть ли лучшая альтернатива, использующая какой-либо нестандартный подход Spring. Также в моем случае очень важна производительность, и небольшая задержка при синхронизации всех параметров не является проблемой. Под задержкой я подразумеваю, что две или три секунды для обновления параметров во всех микросервисах не проблема.

1 Ответ

2 голосов
/ 16 июля 2020

Это можно сделать двумя способами:

i- Имеется конечная точка refre sh, и вы действительно можете вызвать ее для службы, и он фактически обновит sh свои конфигурации без перезапуска, что довольно удобно. например, MS-A отображается на 8080, затем выполните запрос POST на этой конечной точке: localhost:8080/refresh.

ПРИМЕЧАНИЕ: Пружинный привод фактически добавляет RefreshEndpoint в приложение автоматически, когда мы аннотируем контроллер в MS-A с помощью @RefreshScope.

ii- Вы также можете использовать Spring Облачная шина и транслирует событие, а затем каждая служба прослушивает и обновляет себя. Это удобно, если у вас есть десятки служб, использующих Config Server , и вы не хотите, чтобы go один за другим достигали конечной точки /refresh, как мы это делали в первом подходе. Вы просто хотите передать сообщение в автобус, чтобы все эти устройства автоматически принимали его.

Ссылка: Обе концепции я изучил во время прохождения курса Pluralsight

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...