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 提供的新属性保持同步。
我实际上正在使用 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 提供的新属性保持同步。