在 Spring Boot 中将属性放在 application.yml 或 bootstrap.yml 上有什么区别?在 logging.config 情况下,应用程序的工作方式不同。
bootstrap.yml
是特定于 [spring-cloud-config
]( cloud.spring.io/spring-cloud-config/…)) 的,它是用于查找正确配置的配置。所以配置可能在 application.properties/yaml 之前加载
我刚刚问了 Spring Cloud
人,并认为我应该在这里分享我的信息。
bootstrap.yml
在 application.yml
之前加载。
它通常用于以下情况:
使用 Spring Cloud Config Server 时,应在 bootstrap.yml 中指定 spring.application.name 和 spring.cloud.config.server.git.uri
一些加密/解密信息
从技术上讲,bootstrap.yml
由父 Spring ApplicationContext
加载。该父 ApplicationContext
在使用 application.yml
的父之前加载。
bootstrap.yml 或 bootstrap.properties
仅当您使用 Spring Cloud 并且您的应用程序的配置存储在远程配置服务器(例如 Spring Cloud Config Server)上时才使用/需要它。
从文档中:
Spring Cloud 应用程序通过创建“引导”上下文进行操作,该上下文是主应用程序的父上下文。开箱即用,它负责从外部源加载配置属性,并解密本地外部配置文件中的属性。
请注意,bootstrap.yml
或 bootstrap.properties
可以 包含其他配置(例如默认值),但通常您只需将引导配置放在这里。
通常它包含两个属性:
配置服务器的位置(spring.cloud.config.uri)
应用程序的名称(spring.application.name)
启动时,Spring Cloud 使用应用程序的名称对配置服务器进行 HTTP 调用,并取回该应用程序的配置。
application.yml 或 application.properties
包含标准应用程序配置 - 通常是默认配置,因为在引导过程中检索到的任何配置都将覆盖此处定义的配置。
这个答案在 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 中定义的配置
好吧,我完全同意在这一点上已经存在的答案:
bootstrap.yml 用于保存指示远程配置所在位置的参数,并使用这些远程配置创建 Bootstrap 应用程序上下文。
实际上,它也能够像 application.yml
一样存储普通属性。但是要注意这个棘手的事情:
如果您确实将属性放在 bootstrap.yml 中,它们的优先级将低于几乎任何其他属性源,包括 application.yml。如此处所述。
让我们明确一点,与 bootstrap.yml
相关的属性有两种:
在引导阶段加载的属性。我们使用 bootstrap.yml 来查找属性持有者(文件系统、git 存储库或其他),通过这种方式获得的属性具有高优先级,因此它们不能被本地配置覆盖。如此处所述。
bootstrap.yml 中的属性。如前所述,它们将获得较低的优先级。使用它们来设置默认值可能是个好主意。
因此,在 Spring Boot 中将属性放在 application.yml
或 bootstrap.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] c.c.c.ConfigServicePropertySourceLocator : 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}
https://i.stack.imgur.com/0D275.png
如果服务器无法访问,应用程序甚至可能无法继续进行。但是,如果本地存在与配置文件匹配的配置,则服务器配置将被覆盖。
好方法:
为本地维护单独的配置文件并使用不同的配置文件运行应用程序。
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
bootstrap.yml 是启动 spring boot 应用程序时加载的第一个文件,application.property 是在应用程序启动时加载的。因此,您保留的可能是您的配置服务器的凭据等,在加载应用程序期间需要的 bootstrap.yml 中,然后在您保留的 application.properties 中可能是数据库 URL 等。
当您使用 Spring Cloud 并且您的应用程序的配置存储在远程配置服务器(例如 Spring Cloud Config Server)上时,将使用 bootstrap.yml。 bootstrap.yml 在 application.yml 之前加载
不定期副业成功案例分享
bootstrap.yml
中?