SpringBoot默认支持properties和YAML两种格式的配置文件。前者格式简单,但是只支持键值对。如果需要表达列表,最好使用YAML格式。SpringBoot支持自动加载约定名称的配置文件,例如application.yml
。如果是自定义名称的配置文件,就要另找方法了。可惜的是,不像前者有@PropertySource
这样方便的加载方式,后者的加载必须借助编码逻辑来实现。
一、bootstrap.yml(bootstrap.properties)与application.yml(application.properties)执行顺序
bootstrap.yml(bootstrap.properties)用来程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置application.yml中使用到参数等
application.yml(application.properties) 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。
bootstrap.yml 先于 application.yml 加载
二、典型的应用场景如下:
当使用 Spring Cloud Config Server 的时候,你应该在 bootstrap.yml 里面指定 spring.application.name 和 spring.cloud.config.server.git.uri
和一些加密/解密的信息
技术上,bootstrap.yml 是被一个父级的 Spring ApplicationContext 加载的。这个父级的 Spring ApplicationContext是先加载的,在加载application.yml 的 ApplicationContext之前。
为何需要把 config server 的信息放在 bootstrap.yml 里?
当使用 Spring Cloud 的时候,配置信息一般是从 config server 加载的,为了取得配置信息(比如密码等),你需要一些提早的或引导配置。
因此,把 config server 信息放在 bootstrap.yml,用来加载真正需要的配置信息。
git仓库中配置文件的读取顺序:
有几种http访问的方式:
(1)首先根据application的名称来寻找,即application的名字(比如,即项目的名称abc).*来查找文件。
(2)如果没有对应的名字,则读取application.properties里面的内容,如果这个也没有,则返回错误。
比如git仓库中的master分支上面有两个配置文件:foobar-dev.yml和application.yml。
这两个文件中都有一个配置,名称相同,但是内容不同,假设foobar-dev.yml中的是profile=abc-foobar,application.yml中的是profile=abc-application
我们访问的时候比如:localhost:8080/master/foobar-dev.yml,则命中到foobar-dev.yml,读取的是abc-foobar
如果访问localhost:8080/master/foobar-default.yml,这个文件在git中是不存在的,则命中到application.yml中,读取的是profile=abc-application
总结:这里有个 优先级,先找对应名称的,如果没有则找默认的application.yml的内容,如果再没有,那就没办法了。
不同的模块微服务模块使用自己的配置,各自团队自己管理自己的配置,不同的环境配置不用的配置文件如何实现:
一种环境一个仓库
(1)通配符的方式(个人感觉这种方式比较好)
一个微服务对应一个git仓库:微服务的名称与git仓库的名称建立一个对应关系,这样子可以采用通配符的方式
隔离性比较好,不影响团队之间的工作。
一个环境一个文件,容易管理。
(2)模式匹配的方式(个人感觉比较麻烦)