怎么用好Spring Config

转载自本人博客
原文地址: https://www.deanwangpro.com/2...

配置其实分为结构和内容两个方面,结构对应的是代码,好比1.0.0新开发的代码上有一个功能开关${feature.switchA},但master上尚未,这就是结构的变化。另外一方面是内容,1.0.0的开发分支有两个测试环境,连着不一样的数据库,那么对应的${mysql.url}的内容确定不一样。mysql

内容的类别上也能够分为三种:业务配置,功能开关,服务配置。git

Spring Cloud的配置中心是Spring Config,通过两年的使用,发现了其中很多的问题,有些是使用问题,有些是Spring Config自己的管理能力致使的问题。spring

Spring Config首推基于git的管理方式,提供了两个管理维度,一个是label(即branch),一个是profile。当服务foo在一套代码下要安装多套环境,好比预发布环境有2套,一套在shanghai机房,一套在beijing机房。那么比较天然的管理维度就是利用profile,foo-shanghai.yaml以及foo-beijing.yaml。当生产环境也依然须要2台时,怎么处理呢?这时候就会有两种作法,一种利用增长label维度作区分,一种依然只用profile。sql

方法一:用label + profile区分

Name Branch Profile
foo-shanghai.yaml stg shanghai
foo-beijing.yaml stg beijing
foo-shanghai.yaml prd shanghai
foo-beijing.yaml Prd beijing

branch其实表示的是结构,即对应不一样的代码,而profile对应的是内容。数据库

这种方式有什么问题?通常应用都是只有profile来区分环境,好比logback要分环境区分配置也是经过<springProfile>来指定。一旦采用两个维度来肯定惟一的配置,那么全部项目都须要有label这个变量。工具

试想若是foo这个应用在线上有个bug须要fix,势必会增长一个hotfix的branch在配置中心,同时还须要增长相应的profile,对应foo的label变量设置为hotfix,profile设置为beijing或者shanghai。测试

再考虑另外一种状况,foo在prd的代码须要放到stg进行验证如何处理?foo的代码版本确定是prd的(由于stg的配置结构也许已经变了),但profile须要用stg的环境。这时实际上只能在配置中心的prd分支上新建一个新的profile来临时知足这种需求。url

方法二:只使用profile区分

Name Branch Profile
foo-stg-shanghai.yaml master stg-shanghai
foo-stg-beijing.yaml master stg-beijing
foo-prd-shanghai.yaml master prd-shanghai
foo-prd-beijing.yaml master prd-beijing

这种方式能够下降管理维度,即放弃label的维度,只有profile的维度。一样的问题,若是foo这个应用在线上有个bug须要fix,那么须要新增两个profile,hotfix-beijing和hotfix-shanghai。虽然维度下降了,可是管理上却有些麻烦。由于master的这个分支没法保护起来,若是有开发人员直接修改了prd-XXX的环境就会致使线上问题。code

一样的,foo在prd的代码须要放到stg进行验证如何处理?foo的代码版本确定是prd的(由于stg的配置结构也许已经变了),但profile须要用stg的环境。这时实际上只能再配置中心新建一个profile,好比stg-oldshanghai,来知足这种需求。开发

然而咱们知道,增长新的profile其实仍是挺麻烦的事情,若是代码中有直接比较profile的逻辑,那么每每容易出现问题。

有没有不临时增长profile的办法呢?其实仔细思考一下,在stg环境验证prd的服务,真正的逻辑是什么?是但愿用stg环境的配置内容,以及stg某个历史版本(与prd匹配的)的配置结构。因此纵向维度咱们须要的实际上是version,profile都是stg-shanghai,而version一个是1.0.0,一个是latest。

方法三:综合一下

好了,如今咱们来综合一下两种方式,可使用git的分支做为version,profile依然仍是按照方法二来区分。毕竟频繁增长环境的可能性不高。可是若是要同时维护一个profile两个分支,其实仍是要来回切换的,比较麻烦,这也是Spring Config为人诟病的管理功能弱。好在Spring Cloud也支持mysql,用mysql同时管理多个label的内容仍是方便很多,只是git自带的“后悔药”(history)功能没有了。因此说仍是有利有弊。

小结

若是想要更完善的配置管理工具,建议仍是使用Apollo。要想用好Spring Cloud,必须能够忍受它比较弱的管理能力,而且作好前期规划,结合项目特色来使用label和profile的能力。

相关文章
相关标签/搜索