Spring Config服务器在运行时添加属性

时间:2017-05-12 10:14:38

标签: java spring spring-boot spring-cloud-config

我想在spring config服务器的运行时添加一些属性,它应该可用于@Value注释的所有客户端应用程序。

我不会预定义此属性,因为我将在spring config server中计算该值并添加到环境中。

能否帮助我了解实现这一目标的最佳途径。

1 个答案:

答案 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存储库中的属性并行使用,这也应该有用。