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