PropertySource 重新載入

此功能在 2020.0 版本中已被棄用。請參閱 null 控制器,以取得達成相同功能的替代方法。

某些應用程式可能需要偵測外部屬性來源的變更,並更新其內部狀態以反映新的組態。Spring Cloud Kubernetes 的重新載入功能能夠在相關的 ConfigMapSecret 變更時觸發應用程式重新載入。

預設情況下,此功能已停用。您可以使用 spring.cloud.kubernetes.reload.enabled=true 組態屬性 (例如,在 application.properties 檔案中) 啟用它。請注意,這將僅啟用 configmap 的監控 (即:spring.cloud.kubernetes.reload.monitoring-config-maps 將設定為 true)。如果您想要啟用 secrets 的監控,則必須透過以下方式明確完成:spring.cloud.kubernetes.reload.monitoring-secrets=true

支援以下重新載入層級 (透過設定 spring.cloud.kubernetes.reload.strategy 屬性)

  • refresh (預設):僅重新載入使用 @ConfigurationProperties@RefreshScope 註解的組態 bean。此重新載入層級利用 Spring Cloud Context 的 refresh 功能。

  • restart_context:整個 Spring ApplicationContext 會優雅地重新啟動。Bean 會使用新的組態重新建立。為了使重新啟動 context 功能正常運作,您必須啟用並公開 restart actuator 端點

management:
  endpoint:
    restart:
      enabled: true
  endpoints:
    web:
      exposure:
        include: restart
  • shutdown:Spring ApplicationContext 會關閉以啟動容器的重新啟動。當您使用此層級時,請確保所有非守護執行緒的生命週期都繫結到 ApplicationContext,並且已組態複寫控制器或複本集以重新啟動 pod。

假設重新載入功能已啟用預設設定 (refresh 模式),則當 config map 變更時,以下 bean 會重新整理

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

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

    // getter and setters

}

為了查看變更是否有效發生,您可以建立另一個定期列印訊息的 bean,如下所示

@Component
public class MyBean {

    @Autowired
    private MyConfig config;

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

您可以使用 ConfigMap 變更應用程式列印的訊息,如下所示

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

對與 pod 關聯的 ConfigMap 中名為 bean.message 的屬性所做的任何變更都會反映在輸出中。更廣泛地說,與以 @ConfigurationProperties 註解的 prefix 欄位定義的值作為前綴的屬性相關聯的變更將被偵測到並反映在應用程式中。ConfigMap 與 pod 關聯已在本章稍早說明。

重新載入功能支援兩種操作模式

  • 事件 (預設):使用 Kubernetes API (web socket) 監看 config map 或 secret 的變更。任何事件都會產生對組態的重新檢查,並且在發生變更時進行重新載入。服務帳戶上需要 view 角色才能監聽 config map 變更。Secrets 需要更高等級的角色 (例如 edit) (預設情況下,不會監控 secrets)。

  • 輪詢:定期從 config map 和 secret 重新建立組態,以查看它是否已變更。您可以使用 spring.cloud.kubernetes.reload.period 屬性組態輪詢週期,預設為 15 秒。它需要與受監控屬性來源相同的角色。這表示,例如,在檔案掛載的 secret 來源上使用輪詢不需要特殊權限。