Spring 云网关:执行器刷新不重新加载属性

Spring Cloud Gateway : actuator refresh does not reload properties

我实际上正在使用 Spring Cloud Gateway 进行一个项目。

我有一个配置 class,它从自定义 PropretySourceFactory 获取其属性。我想对属性进行热重载,所以我调用 actuator/refresh (curl localhost:8080/actuator/refresh -d {}H "Content-Type: application/json") 但它不会重新加载我的配置属性。没有错误或异常。

配置如下class:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;


@Configuration
@ConfigurationProperties
@PropertySource(value="", factory=NatsPropertySourceFactory.class)
public class NatsConfiguration {
    private String apiKey;
    private String apiKeyConsumer;
    private String apiKeyValidity;
    private String apiKeyCreation;
    private int ratelimitMaxTokens;
    private int ratelimitReplenishFrequency;
    private int ratelimitReplenishRate;

    // Getters and setter
    //...
}

PropertySource 上的值是空的,因为我不会从文件中而是从消息队列中获取我的配置。

和 NatsPropertySourceFactory:

public class NatsPropertySourceFactory implements PropertySourceFactory{

    final private NatsConfigurationService natsConfigurationService = new NatsConfigurationServiceImpl();

    @Override
    public PropertySource<?> createPropertySource(String arg0, EncodedResource arg1) throws IOException {
        MapPropertySource result = null;
        Logger log = LoggerFactory.getLogger(this.getClass());
        try {
            result = new MapPropertySource("nats", natsConfigurationService.getConfiguration());

        } catch (ConfigurationException e) {
            log.error("RECUPERATION DE CONFIGURATION DEPUIS NATS EN ERREUR", e);
            System.exit(1);
        }
        return result;
    }
    
}

我的属性没有与@Value 一起使用,所以我不需要@RefreshScope。 当我调用 /actuator/refresh 时,不会重新创建 NatsConfiguration class。

有关信息,我将 webflux 与 Spring 安全性一起使用(执行器 url 是 permitAll: pathMatchers("/actuator/**").permitAll())

@EnableWebFluxSecurity
@EnableWebFlux
public class SecurityConfiguration implements WebFluxConfigurer {

我哪里错了?

顺便说一句,我发现了 /actuator/refresh 的确切行为:它重新实例化了 @Configuration class 但对 PropertySourceFactory 没有任何作用。

我找到了一个解决方法:我创建了一个 REST 控制器,它调用 PropertySourceFactory 的 createPropertySource 方法,然后调用 /actuator/refresh url。它完全符合我的要求:@Configuration class 与 PropertySourceFactory 提供的新属性保持同步。