ChatGPT解决这个技术问题 Extra ChatGPT

在 Spring Boot 中将属性放在 application.yml 或 bootstrap.yml 上有什么区别?

在 Spring Boot 中将属性放在 application.yml 或 bootstrap.yml 上有什么区别?在 logging.config 情况下,应用程序的工作方式不同。

据我所知,bootstrap.yml 是特定于 [spring-cloud-config]( cloud.spring.io/spring-cloud-config/…)) 的,它是用于查找正确配置的配置。所以配置可能在 application.properties/yaml 之前加载

A
Andrew Tobilko

我刚刚问了 Spring Cloud 人,并认为我应该在这里分享我的信息。

bootstrap.ymlapplication.yml 之前加载。

它通常用于以下情况:

使用 Spring Cloud Config Server 时,应在 bootstrap.yml 中指定 spring.application.name 和 spring.cloud.config.server.git.uri

一些加密/解密信息

从技术上讲,bootstrap.yml 由父 Spring ApplicationContext 加载。该父 ApplicationContext 在使用 application.yml 的父之前加载。


您能否解释一下为什么 Config Server 需要将这些参数放入 bootstrap.yml 中?
使用 Spring Cloud 时,“真实”配置数据通常是从服务器加载的。为了获取 URL(和其他连接配置,如密码等),您需要更早的或“引导”配置。因此,您将配置服务器属性放在 bootstrap.yml 中,该文件用于加载真实的配置数据(通常会覆盖 application.yml [如果存在] 中的内容)。
有时我想知道什么时候春天带来了新的令人兴奋的特性,它抛弃了规范而不是约定,或者他们假设它已经约定并且不需要指定任何东西,如果不是在春天,那么一切都将自行解决,然后是春天启动,并且可能在未来的春天 -开机开机;)
当您说 bootstrap.yml 在 application.yml 之前加载时。但是当我删除 application.yml 时。我的应用程序不读取 bootstrap.yml。这是为什么?
我们需要强调引导文件永远不会被覆盖,因为它具有更高的优先级。根据文档Team's Spring
d
dustin.schultz

bootstrap.yml 或 bootstrap.properties

仅当您使用 Spring Cloud 并且您的应用程序的配置存储在远程配置服务器(例如 Spring Cloud Config Server)上时才使用/需要它。

从文档中:

Spring Cloud 应用程序通过创建“引导”上下文进行操作,该上下文是主应用程序的父上下文。开箱即用,它负责从外部源加载配置属性,并解密本地外部配置文件中的属性。

请注意,bootstrap.ymlbootstrap.properties 可以 包含其他配置(例如默认值),但通常您只需将引导配置放在这里。

通常它包含两个属性:

配置服务器的位置(spring.cloud.config.uri)

应用程序的名称(spring.application.name)

启动时,Spring Cloud 使用应用程序的名称对配置服务器进行 HTTP 调用,并取回该应用程序的配置。

application.yml 或 application.properties

包含标准应用程序配置 - 通常是默认配置,因为在引导过程中检索到的任何配置都将覆盖此处定义的配置。


V
Vaibhav Sharma

这个答案在 Munish Chandel 1.30 版,2018 年 3 月 25 日的《面向 Java 开发人员(Spring Boot、Spring Cloud、云原生应用程序)的微服务面试问题》一书中得到了很好的解释。

以下内容取自本书,此答案的全部功劳归于本书的作者,即 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 之前加载

仅当您使用 Spring Cloud 并且您的微服务配置存储在远程 Spring Cloud Config Server 上时,才需要 bootstrap.yml。

关于 bootstrap.yml 的要点

当与 Spring Cloud Config 服务器一起使用时,您应使用以下属性指定应用程序名称和配置 git 位置。

spring.application.name: "application-name"
spring.cloud.config.server.git.uri: "git-uri-config"

当与微服务(云配置服务器除外)一起使用时,我们需要使用以下属性指定配置服务器的应用程序名称和位置

spring.application.name: 
spring.cloud.config.uri:

该属性文件可以包含与 Spring Cloud 环境相关的其他配置,例如 eureka 服务器位置、加密/解密相关属性。

启动时,Spring Cloud 使用应用程序的名称对 Spring Cloud Config Server 进行 HTTP(S) 调用,并取回该应用程序的配置。

application.yml 包含微服务的默认配置,并且在引导过程中检索到的任何配置(从云配置服务器)都将覆盖 application.yml 中定义的配置


L
Lebecca

好吧,我完全同意在这一点上已经存在的答案:

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 将获得更高的优先级。


d
dixit gangaiah

只有我的 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] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at : http://localhost:8888


S
Sudip Bhandari

Bootstrap.yml 用于从服务器获取配置。它可以用于 Spring 云应用程序或其他应用程序。通常它看起来像:

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

https://i.stack.imgur.com/0D275.png

如果服务器无法访问,应用程序甚至可能无法继续进行。但是,如果本地存在与配置文件匹配的配置,则服务器配置将被覆盖。

好方法:

为本地维护单独的配置文件并使用不同的配置文件运行应用程序。


J
Jack Beaken

bootstrap.yml 的另一个用途是从 kubernetes configmap 和 secret 资源加载配置。应用程序必须导入 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

因此,使用 meta.name default-name 存储在 configmap 资源中的属性可以像 application.yml 中的属性一样被引用

同样的过程也适用于秘密:

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

v
viveknaskar

bootstrap.yml 是启动 spring boot 应用程序时加载的第一个文件,application.property 是在应用程序启动时加载的。因此,您保留的可能是您的配置服务器的凭据等,在加载应用程序期间需要的 bootstrap.yml 中,然后在您保留的 application.properties 中可能是数据库 URL 等。


H
Hammad Allauddin

当您使用 Spring Cloud 并且您的应用程序的配置存储在远程配置服务器(例如 Spring Cloud Config Server)上时,将使用 bootstrap.yml。 bootstrap.yml 在 application.yml 之前加载