Статьи

Обновить конфигурацию свойства во время выполнения в Spring Cloud Config

В этой серии руководств по конфигурированию весенних облаков мы будем обсуждать обновление конфигурации свойств во время выполнения. Мы будем делать это с использованием конечной точки исполнительного механизма /refresh весенней загрузки. Также мы рассмотрим обновление свойств @RefreshScope с @RefreshScope аннотации @RefreshScope .

В моем последнем уроке по настройке Spring Cloud мы настроили службу облачной конфигурации с сервером обнаружения и клиентом обнаружения и успешно создали пример для чтения свойств конфигурации приложения в распределенной среде с хранилищем с поддержкой GIT. Здесь мы перейдем к демонстрации функциональность обновления конфигурации свойств в весеннем облачном конфиге во время выполнения.

В этой статье мы сосредоточимся только на обновлении свойств конфигурации. Таким образом, мы не будем использовать конфигурацию, связанную с сервером обнаружения. У нас будет сервер конфигурации для загрузки свойств из хранилища GIT и клиент конфигурации с проектом actator.

Различные способы обновить свойства

Простой способ обновить свойство конфигурации — это использовать /refresh конечную точку, предоставляемую приводом с пружинной загрузкой. Но это ручной процесс, который нужно запускать для всех экземпляров. Другой способ — с /bus/refresh с spring-cloud-bus и в этом случае все экземпляры подписываются на событие, и всякий раз, когда это событие запускается, все свойства конфигурации будут автоматически обновляться посредством широковещательной передачи по шине Spring Cloud. И третий способ обновить эти свойства — это подключиться к VCS. В этой статье мы будем иметь дело с конечной точкой обновления привода с пружинной загрузкой.

Внедрение сервера Spring Cloud Config

У нас уже есть готовая настройка для этой реализации в моей предыдущей статье. Здесь давайте кратко обсудим это. У нас есть следующие application.properties, определенные в конфигурационном сервере и основном приложении весенней загрузки. Он предоставляет конечную точку REST как http: // localhost: 8888 для клиента, чтобы получить свойства конфигурации.

application.properties

1
2
server.port=8888
spring.cloud.config.server.git.uri=https://github.com/only2dhir/config-repo.git

SpringCloudConfigExampleApplication.java

01
02
03
04
05
06
07
08
09
10
11
12
13
14
package com.devglan.springcloudconfigexample;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
 
@SpringBootApplication
@EnableConfigServer
public class SpringCloudConfigExampleApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudConfigExampleApplication.class, args);
    }
}

У нас есть свойства внешней конфигурации, определенные на https://github.com/only2dhir/config-repo.git. Здесь у нас есть свойства, определенные для локальных и глобальных свойств активного профиля.

Внедрение клиента Spring Cloud Config

Для клиента у нас определены следующие bootstrap.properties Это тот же файл, который мы определили в нашем предыдущем приложении здесь

bootstrap.properties

1
2
3
spring.application.name=spring-cloud-config-client
spring.profiles.active=local
#spring.cloud.config.uri=http://localhost:8888

Обновление свойств конфигурации с помощью / refresh Endpoint

Конечная точка /refresh обновляет только те свойства, которые @ConfigurationProperties означает, что она не обновляет те свойства, которые инициализируются во время инициализации приложения. Например, у нас определен следующий класс конфигурации, который читает свойство с префиксом random

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
package com.devglan.springcloudconfigclient;
 
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
 
@Component
@ConfigurationProperties(prefix="random")
public class PropertyConfiguration {
 
    private String property;
 
    public String getProperty() {
        return property;
    }
 
    public void setProperty(String property) {
        this.property = property;
    }
}

У нас есть следующий класс контроллера, который использует свойство с префиксом random и также читает свойство с аннотацией @Value

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
@RestController
public class DemoController {
 
    @Value("${test.property}")
    private String testProperty;
 
    @Value("${test.local.property}")
    private String localTestProperty;
 
    @Autowired
    private PropertyConfiguration propertyConfiguration;
 
    @RequestMapping("/")
    public String test() {
        StringBuilder builder = new StringBuilder();
        builder.append("global property - ").append(testProperty).append(" || ")
                .append("local property - ").append(localTestProperty).append(" || ")
                .append("property configuration value - ").append(propertyConfiguration.getProperty());
        return builder.toString();
    }
}

Для конечной точки выводом будет http: // localhost: 8080 / spring-cloud-config-client / follow.

Теперь давайте изменим свойства конфигурации, определенные в spring-cloud-config-client-local.properties как spring-cloud-config-client-local.properties ниже.

1
2
test.local.property=test local property changed
random.property=random property changed

Теперь мы будем вызывать POST-метод http: // localhost: 8080 / spring-cloud-config-client / refresh, чтобы обновить свойство. Ниже будет ответ с обновленными свойствами.

Теперь, если мы нажмем http: // localhost: 8080 / spring-cloud-config-client /, мы увидим, что свойство, поступающее из класса, аннотированного @ConfigurationProperties, было обновлено, но свойство, аннотированное @Value, не было обновлено, поскольку оно инициализируется во время запуска приложения

Чтобы обновить свойство, аннотированное @Value, нам нужно аннотировать класс с помощью @RefreshScope. Следовательно, здесь мы будем аннотировать класс контроллера с помощью @RefreshScope и перезапускать клиентское приложение. После перезапуска мы внесем изменения в файл свойств и отправим изменения в git. На этот раз мы добавили значение свойства в строку дважды, и снова мы снова вызываем конечную точку обновления. Теперь, если мы нажмем на ссылку http: // localhost: 8080 / spring-cloud-config-client /, то обнаружим, что оба свойства конфигурации, аннотированные @Value и @ConfigurationProperties, были обновлены.

См. Оригинальную статью здесь: Обновить конфигурацию свойства во время выполнения в Spring Cloud Config.

Мнения, высказанные участниками Java Code Geeks, являются их собственными.