簡體   English   中英

在 spring boot 中將屬性放在 application.yml 或 bootstrap.yml 上有什么區別?

[英]What is the difference between putting a property on application.yml or bootstrap.yml in spring boot?

在 spring boot 中將屬性放在 application.yml 或 bootstrap.yml 上有什么區別? 在 logging.config 情況下,應用程序的工作方式不同。

我剛剛問了Spring Cloud人,並認為我應該在這里分享我所擁有的信息。

bootstrap.ymlapplication.yml之前加載。

它通常用於以下情況:

  • 使用 Spring Cloud Config Server 時,應在bootstrap.yml指定spring.application.namespring.cloud.config.server.git.uri
  • 一些encryption/decryption信息

從技術上講, bootstrap.yml由父 Spring ApplicationContext加載。 該父ApplicationContext在使用application.yml那個之前加載。

bootstrap.ymlbootstrap.properties

僅當您使用Spring Cloud並且應用程序的配置存儲在遠程配置服務器(例如 Spring Cloud Config Server)上時才使用/需要它。

從文檔:

Spring Cloud 應用程序通過創建“引導程序”上下文來運行,該上下文是主應用程序的父上下文。 開箱即用,它負責從外部源加載配置屬性,並解密本地外部配置文件中的屬性。

請注意, bootstrap.ymlbootstrap.properties可以包含其他配置(例如默認值),但通常您只需要在此處放置 bootstrap 配置。

通常它包含兩個屬性:

  • 配置服務器的位置( spring.cloud.config.uri
  • 應用程序的名稱( spring.application.name

啟動時,Spring Cloud 使用應用程序的名稱對配置服務器進行 HTTP 調用,並檢索該應用程序的配置。

application.ymlapplication.properties

包含標准應用程序配置 - 通常是默認配置,因為在引導過程中檢索到的任何配置都將覆蓋此處定義的配置。

這個答案在Munish Chandel 的“微服務面試問題,Java 開發人員(Spring Boot、Spring Cloud、雲原生應用程序) ”一書中得到了非常精美的解釋,版本1.30,2018 年 3 月 25日。

以下內容摘自本書,此答案的全部功勞歸於本書的作者,即Munish Chandel

應用程序.yml

application.yml/application.properties文件特定於 Spring Boot 應用程序。 除非您更改應用程序的外部屬性的位置,否則 Spring Boot 將始終從以下位置加載application.yml

/src/main/resources/application.yml

您可以在此文件中存儲應用程序的所有外部屬性。 任何 Spring Boot 項目中可用的通用屬性可以在以下位置找到: https : //docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html您可以將這些屬性自定義為根據您的應用需求。 示例文件如下所示:

spring:
    application:
        name: foobar
    datasource:
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost/test
server:
    port: 9000

引導程序.yml

bootstrap.yml另一方面特定於spring-cloud-config並且在application.yml之前加載

bootstrap.yml僅在您使用 Spring Cloud 並且您的微服務配置存儲在遠程 Spring Cloud 配置服務器上時才需要。

關於 bootstrap.yml 的要點

  1. 與 Spring Cloud Config 服務器一起使用時,您應使用以下屬性指定應用程序名稱和配置 git 位置。
spring.application.name: "application-name"
spring.cloud.config.server.git.uri: "git-uri-config"
  1. 當與微服務(雲配置服務器除外)一起使用時,我們需要使用以下屬性指定配置服務器的應用程序名稱和位置
spring.application.name: 
spring.cloud.config.uri:
  1. 該屬性文件可以包含與 Spring Cloud 環境相關的其他配置,例如 eureka 服務器位置、加密/解密相關屬性。

啟動時,Spring Cloud 使用應用程序的名稱對 Spring Cloud 配置服務器進行 HTTP(S) 調用,並檢索該應用程序的配置。

application.yml 包含微服務的默認配置,並且在引導過程中檢索到的任何配置(從雲配置服務器)將覆蓋 application.yml 中定義的配置

好吧,我完全同意在這一點上已經存在的答案:

  • bootstrap.yml用於保存指出遠程配置在哪里的參數,並使用這些遠程配置創建Bootstrap 應用程序上下文

實際上,它也可以像application.yml一樣存儲普通屬性。 但是要注意這個棘手的事情:

  • 如果您確實將屬性放在bootstrap.yml ,它們的優先級將低於幾乎任何其他屬性源,包括 application.yml。 如上所述這里

讓我們說清楚,有兩種與bootstrap.yml相關的屬性:

  • 在引導階段加載的屬性。 我們使用bootstrap.yml來查找屬性持有者(文件系統、git 存儲庫或其他東西),並且我們通過這種方式獲得的屬性具有高優先級,因此它們不能被本地配置覆蓋。 如上所述這里
  • bootstrap.yml中的屬性。 如前所述,它們將獲得較低的優先級。 使用它們來設置默認值可能是個好主意。

所以在 spring boot 中將屬性放在application.ymlbootstrap.yml上的區別是:

  • 在引導階段加載配置文件的屬性只能放在bootstrap.yml
  • 對於所有其他類型的屬性,將它們放在application.yml中將獲得更高的優先級。

這里只有我的 2 美分..

Bootstrap.yml 或 Bootstrap.properties 用於從 Spring Cloud Server 獲取配置。

例如,在我的 Bootstrap.properties 文件中,我有以下配置

spring.application.name=Calculation-service
spring.cloud.config.uri=http://localhost:8888

在啟動應用程序時,它嘗試通過連接到http://localhost:8888來獲取服務的配置,並查看 Spring Cloud Config 服務器中存在的 Calculation-service.properties

您可以在啟動時從 Calcuation-Service 的日志中驗證相同的內容

INFO 10988 --- [ restartedMain] cccConfigServicePropertySourceLocator : Fetching config from server at : http://localhost:8888

Bootstrap.yml 用於從服務器獲取配置。 它可以用於 Spring 雲應用程序或其他應用程序。 通常它看起來像:

spring:
  application:
    name: "app-name"
  cloud:
    config:
      uri: ${config.server:http://some-server-where-config-resides}

當我們啟動應用程序時,它會嘗試連接到給定的服務器並根據運行/調試配置中提到的 spring 配置文件讀取配置。 bootstrap.yml 加載第一個

如果服務器無法訪問,應用程序甚至可能無法繼續進行。 但是,如果本地存在與配置文件匹配的配置,則服務器配置將被覆蓋。

好辦法:

為本地維護一個單獨的配置文件,並使用不同的配置文件運行應用程序。

bootstrap.yml 的另一個用途是從 kubernetes configmap秘密資源加載配置。 應用程序必須導入spring-cloud-starter-kubernetes依賴項。

與 Spring Cloud Config 一樣,這必須在引導短語期間進行。

從文檔:

spring:
  application:
    name: cloud-k8s-app
  cloud:
    kubernetes:
      config:
        name: default-name
        namespace: default-namespace
        sources:
         # Spring Cloud Kubernetes looks up a ConfigMap named c1 in namespace default-namespace
         - name: c1

因此,可以像application.yml 中的屬性一樣引用存儲在 configmap 資源中的帶有 meta.name default-name 的屬性

同樣的過程適用於 secrets :

spring:
  application:
    name: cloud-k8s-app
  cloud:
    kubernetes:
      secrets:
        name: default-name
        namespace: default-namespace
        sources:
         # Spring Cloud Kubernetes looks up a Secret named s1 in namespace default-namespace
         - name: s1

Bootstrap.yml 是啟動 spring boot 應用程序時加載的第一個文件,應用程序啟動時加載 application.property。 因此,您保留的可能是您的配置服務器的憑據等,在加載應用程序期間需要的 bootstrap.yml 中,然后在 application.properties 中您保留的可能是數據庫 URL 等。

bootstrap.yml 在您使用 Spring Cloud 並且您的應用程序的配置存儲在遠程配置服務器(例如 Spring Cloud Config Server)上時使用。 bootstrap.yml 在 application.yml 之前加載

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM