2017-05-12 96 views
1

我想在運行時在spring配置服務器上添加一些屬性,它應該可用於所有客戶端應用程序和@Value註釋。Spring配置服務器在運行時添加屬性

我不會有這個屬性預定義,因爲我要在春季配置服務器計算該值,並添加到環境。

你能幫我理解什麼是實現這一目標的最佳方法。

+0

看看這個答案http://stackoverflow.com/questions/37873433/spring-cloud-config-server-rabbitmq/37873783#37873783 –

+0

[Spring Cloud Config Server + RabbitMQ]可能的重複(http:// stackoverflow .com/questions/37873433/spring-cloud-config-server-rabbitmq) – Raz0rwire

+1

沒有其他問題 –

回答

2

Spring雲配置包含一個名爲'RefreshScope'的功能,該功能允許刷新正在運行的應用程序的屬性和bean。

如果您閱讀了關於spring cloud config的內容,它看起來只能從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> 

所有豆類,正在使用的特性,可在運行時更改,應與@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); 
     } 
    } 
} 

使用該類將彈簧配置爲bootstrap the configuration

在您的資源文件夾中創建(或擴展)的META-INF/spring.factories文件:

org.springframework.cloud.bootstrap.BootstrapConfiguration=your.package.ReloadablePropertySourceLocator 

這個bean將讀取從reloadable.properties屬性。當您刷新應用程序時,Spring Cloud Config將從磁盤重新加載它。

根據需要添加運行時,編輯reloadable.properties,然後刷新spring上下文。 你可以做到這一點通過發送POST請求/refresh端點,或在Java中使用ContextRefresher

@Autowired 
ContextRefresher contextRefresher; 
... 
contextRefresher.refresh(); 

這也應該工作,如果你選擇從一個遠程的Git倉庫使用它並行性。

+0

感謝Stefan的迴應。我知道你建議我們可以將運行時屬性添加到外部文件中,並且spring config server會自動加載它。但是,我可以在沒有寫入文件的情況下實現。 有沒有一種方法可以像environment.addPorperty(key,Value)那樣做,並且它可以適用於所有配置客戶端。 –

+0

它可以爲項目全局完成,而不是使用@RefreshScope定義bean –