在应用程序上放置属性的区别是什么?Yml或bootstrap。穿弹簧靴的Yml ?

把一个属性放在应用程序上有什么区别?Yml或bootstrap。穿弹簧靴的Yml ? 在日志记录。配置情况下,应用程序的工作方式不同
150921 次浏览

我刚刚问了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

只有当你使用< em > < / em >春云并且你的应用程序的配置存储在远程配置服务器上(例如Spring Cloud Config server)时,它才会被使用/需要。

从文档中可以看到:

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

注意,bootstrap.ymlbootstrap.properties 可以包含额外的配置(例如默认值),但通常你只需要在这里放置引导配置。

通常它包含两个属性:

  • 配置服务器的位置(spring.cloud.config.uri)
  • 应用程序的名称(spring.application.name)

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

application.ymlapplication.properties

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

引导。Yml用于从服务器获取配置。它可以用于Spring云应用程序,也可以用于其他应用程序。通常是这样的:

spring:
application:
name: "app-name"
cloud:
config:
uri: ${config.server:http://some-server-where-config-resides}
当我们启动应用程序时,它会尝试连接到给定的服务器,并根据运行/调试配置中提到的spring概要文件读取配置。 bootstrap. < / p >

如果服务器不可达,应用程序甚至可能无法进一步进行。但是,如果本地存在与概要文件匹配的配置,则服务器配置将被覆盖。

好的方法:

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

这只是我的两毛钱。

引导。yml或Bootstrap。properties用于从Spring Cloud Server获取配置。

例如,在My Bootstrap中。我有以下配置文件

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

在启动应用程序时,它试图通过连接到http://localhost:8888来获取服务的配置,并查看Calculation-service。Spring Cloud Config服务器中显示的属性

您可以在启动compute - service时从它的日志中验证相同的内容

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

这个答案在《微服务面试问题,面向Java开发人员(Spring Boot, Spring Cloud, Cloud . com)》一书中有很好的解释 by Munish昌德尔, Version 1.30, 25.03.2018。< / p >

以下内容摘自这本书,总学分 因为这个答案要交给这本书的作者,即Munish 昌德尔< / em > < /强> < / p >

application.yml

application.yml / application.properties文件是特定于Spring Boot应用程序的。除非你改变了应用程序的外部属性的位置,否则spring引导将始终从以下位置加载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

bootstrap.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 Config Server进行HTTP(S)调用,并检索该应用程序的配置。

应用程序。Yml包含微服务的默认配置,在引导过程中检索的任何配置(从云配置服务器)将覆盖application.yml中定义的配置

嗯,我完全同意关于这一点已经存在的答案:

  • bootstrap.yml用于保存指出远程配置位置的参数,并且使用这些远程配置创建Bootstrap应用背景

实际上,它也能够像application.yml一样存储普通属性。但请注意这个棘手的问题:

  • 如果你在bootstrap.yml中放置属性,它们的优先级将低于几乎任何其他属性源,包括application.yml。如上所述在这里

让我们明确一点,有两种与bootstrap.yml相关的属性:

  • 在引导阶段加载的属性。我们使用bootstrap.yml来找到属性持有者(一个文件系统,git存储库或其他东西),并且我们以这种方式获得的属性具有高优先级,因此它们不能被本地配置覆盖。如上所述在这里
  • bootstrap.yml. Properties中的属性。如前所述,它们的优先级将较低。使用它们来设置默认值也许是个好主意。

因此,在spring引导中将属性放在application.ymlbootstrap.yml上的区别是:

  • 在引导阶段加载配置文件的属性只能放置在bootstrap.yml中。
  • 至于所有其他类型的属性,将它们放在application.yml中将获得更高的优先级。

bootstrap.yml的另一个用途是从kubernetes的configmap秘密资源中加载配置。应用程序必须导入spring-cloud-starter-kubernetes依赖项。

与Spring Cloud配置一样,这必须在引导阶段进行。

从文档中可以看出:

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
< p >引导。Yml是启动spring引导应用程序和应用程序时加载的第一个文件。属性在应用程序启动时加载。 在引导中,你可以保留配置服务器的凭证等。Yml,在加载应用程序时需要,然后在应用程序中。你保留的属性可能是数据库URL等

引导。当你使用Spring Cloud并且你的应用程序的配置存储在远程配置服务器(例如Spring Cloud Config server)时,yml被使用。引导。Yml在application.yml之前加载