Spring Cloud PropertySource重新加載

2024-01-08 17:19 更新

某些應(yīng)用程序可能需要檢測外部屬性源上的更改并更新其內(nèi)部狀態(tài)以反映新配置。當(dāng)相關(guān)的ConfigMapSecret發(fā)生更改時,Spring Cloud Kubernetes的重載功能能夠觸發(fā)應(yīng)用程序重載。

默認情況下,此功能處于禁用狀態(tài)。您可以使用spring.cloud.kubernetes.reload.enabled=true配置屬性(例如,在application.properties文件中)啟用它。

支持以下級別的重載(通過設(shè)置spring.cloud.kubernetes.reload.strategy屬性):* refresh(默認):僅重載用@ConfigurationProperties@RefreshScope注釋的配置beans。 此重新加載級別利用了Spring Cloud上下文的刷新功能。* restart_context:整個Spring ApplicationContext已正常重啟。用新配置重新創(chuàng)建Beans。* shutdown:Spring ApplicationContext已關(guān)閉,以激活容器的重啟。 使用此級別時,請確保所有非守護程序線程的生命周期都綁定到ApplicationContext,并且已將復(fù)制控制器或副本集配置為重新啟動Pod。

假設(shè)使用默認設(shè)置(refresh模式)啟用了重新加載功能,則當(dāng)配置映射更改時,將刷新以下bean:

@Configuration
@ConfigurationProperties(prefix = "bean")
public class MyConfig {

    private String message = "a message that can be changed live";

    // getter and setters

}

要查看更改是否有效發(fā)生,您可以創(chuàng)建另一個bean來定期打印消息,如下所示

@Component
public class MyBean {

    @Autowired
    private MyConfig config;

    @Scheduled(fixedDelay = 5000)
    public void hello() {
        System.out.println("The message is: " + config.getMessage());
    }
}

您可以使用ConfigMap來更改應(yīng)用程序打印的消息,如下所示:

apiVersion: v1
kind: ConfigMap
metadata:
  name: reload-example
data:
  application.properties: |-
    bean.message=Hello World!

與容器關(guān)聯(lián)的ConfigMap中名為bean.message的屬性的任何更改都會反映在輸出中。更一般而言,將檢測與屬性相關(guān)聯(lián)的更改,這些更改的前綴為@ConfigurationProperties注釋的prefix字段定義的值。 本章前面已經(jīng)說明了將ConfigMap與pod關(guān)聯(lián)。

完整的示例可在中找到spring-cloud-kubernetes-reload-example

重新加載功能支持兩種操作模式:*事件(默認):使用Kubernetes API(web套接字)監(jiān)視配置映射或機密的更改。任何事件都會對配置進行重新檢查,并在發(fā)生更改的情況下重新加載。服務(wù)帳戶上的view角色是必需的,以便偵聽配置映射更改。秘密需要更高級別的角色(例如edit)(默認情況下,不監(jiān)視秘密)。 *輪詢:從配置上通過配置映射和機密重新創(chuàng)建配置,以查看配置是否已更改。您可以使用spring.cloud.kubernetes.reload.period屬性來配置輪詢時間,默認為15秒。它需要與受監(jiān)視屬性源相同的角色。例如,這意味著對文件掛載的秘密源使用輪詢不需要特定的特權(quán)。

表140.3。Properties:

名稱 類型 默認 描述

spring.cloud.kubernetes.reload.period

Duration

15s

使用polling策略時驗證更改的期限

spring.cloud.kubernetes.reload.enabled

Boolean

false

啟用監(jiān)視屬性源和配置重載

spring.cloud.kubernetes.reload.monitoring-config-maps

Boolean

true

允許監(jiān)視配置映射中的更改

spring.cloud.kubernetes.reload.monitoring-secrets

Boolean

false

允許監(jiān)視機密更改

spring.cloud.kubernetes.reload.strategy`

Enum

refresh

觸發(fā)重新加載時使用的策略(refresh,restart_contextshutdown

spring.cloud.kubernetes.reload.mode

Enum

event

指定如何偵聽屬性源(eventpolling)中的更改


注意:*請勿在配置映射或機密中使用spring.cloud.kubernetes.reload下的屬性。在運行時更改此類屬性可能會導(dǎo)致意外結(jié)果。*使用refresh級別時,刪除屬性或整個配置圖不會恢復(fù)beans的原始狀態(tài)。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號