我想在運行時在spring配置服務器上添加一些屬性,它應該可用於所有客戶端應用程序和@Value
註釋。Spring配置服務器在運行時添加屬性
我不會有這個屬性預定義,因爲我要在春季配置服務器計算該值,並添加到環境。
你能幫我理解什麼是實現這一目標的最佳方法。
我想在運行時在spring配置服務器上添加一些屬性,它應該可用於所有客戶端應用程序和@Value
註釋。Spring配置服務器在運行時添加屬性
我不會有這個屬性預定義,因爲我要在春季配置服務器計算該值,並添加到環境。
你能幫我理解什麼是實現這一目標的最佳方法。
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倉庫使用它並行性。
感謝Stefan的迴應。我知道你建議我們可以將運行時屬性添加到外部文件中,並且spring config server會自動加載它。但是,我可以在沒有寫入文件的情況下實現。 有沒有一種方法可以像environment.addPorperty(key,Value)那樣做,並且它可以適用於所有配置客戶端。 –
它可以爲項目全局完成,而不是使用@RefreshScope定義bean –
看看這個答案http://stackoverflow.com/questions/37873433/spring-cloud-config-server-rabbitmq/37873783#37873783 –
[Spring Cloud Config Server + RabbitMQ]可能的重複(http:// stackoverflow .com/questions/37873433/spring-cloud-config-server-rabbitmq) – Raz0rwire
沒有其他問題 –