我想在spring config服务器的运行时添加一些属性,它应该可用于@Value
注释的所有客户端应用程序。
我不会预定义此属性,因为我将在spring config server中计算该值并添加到环境中。
能否帮助我了解实现这一目标的最佳途径。
答案 0 :(得分:3)
Spring云配置包含一个名为“RefreshScope”的功能,可以刷新正在运行的应用程序的属性和bean。
如果您阅读有关spring cloud配置的内容,看起来它只能从git存储库加载属性,但事实并非如此。
您可以使用RefreshScope从本地文件重新加载属性,而无需连接到外部git存储库或HTTP请求。
使用以下内容创建文件bootstrap.properties
:
# false: spring cloud config will not try to connect to a git repository
spring.cloud.config.enabled=false
# let the location point to the file with the reloadable properties
reloadable-properties.location=file:/config/defaults/reloadable.properties
在上面定义的位置创建文件reloadable.properties
。
您可以将其留空,或添加一些属性。在此文件中,您可以稍后在运行时更改或添加属性。
添加依赖项
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
所有使用属性的bean,可以在运行时更改,应该使用@RefreshScope
进行注释,如下所示:
@Bean
@RefreshScope
Controller controller() {
return new Controller();
}
创建一个类
public class ReloadablePropertySourceLocator implements PropertySourceLocator
{
private final String location;
public ReloadablePropertySourceLocator(
@Value("${reloadable-properties.location}") String location) {
this.location = location;
}
/**
* must create a new instance of the property source on every call
*/
@Override
public PropertySource<?> locate(Environment environment) {
try {
return new ResourcePropertySource(location);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
使用该类将Spring配置为bootstrap the configuration。
创建(或扩展)资源文件夹中的META-INF/spring.factories
文件:
org.springframework.cloud.bootstrap.BootstrapConfiguration=your.package.ReloadablePropertySourceLocator
此bean将从reloadable.properties
读取属性。刷新应用程序时,Spring Cloud Config将从磁盘重新加载。
添加运行时,根据需要编辑reloadable.properties
,然后刷新弹簧上下文。
您可以通过向/refresh
端点发送POST请求,或使用ContextRefresher
发送Java来执行此操作:
@Autowired
ContextRefresher contextRefresher;
...
contextRefresher.refresh();
如果您选择将其与远程git存储库中的属性并行使用,这也应该有用。