Spring Cloud Config是一个配置中心。简单地讲, 当你用Spring Boot开发后端应用时,可以从Spring Cloud中获取配置文件,达到统一管理配置文件的目的。
Spring Cloud Config可以选取本地或者其他存储系统存放配置文件。在开发中,我们采用的是AWS S3的云存储服务。这是官方支持的存储后端。但实际上。它的行为跟使用本地方式的配置方法有不一样的地方。
S3后端存在的问题
S3后端的不支持多配置文件。
当以本地后端启动
http://localhost:8888/config-server/common,test/prod
当访问上面链接时,能获取
- common.yml
- test.yml
- common-prod.yml
- test-prod.yml
当以aws s3为后端时,无法获取上述文件。它将common,test
识别一个应用的名字。而不是以逗号分割的应用列表。
另外,
http://localhost:8888/config-server/common/prod
当访问上面的链接时,以本地后端启动能获取到
- common.yml
- common-prod.yml
而以AWS S3为后端时,只能获取到
- common-prod.yml
解决方案
查看源码可以找到解析参数并生成具体配置文件名字的代码在AwsS3EnvironmentRepository::findOne
我们当然可以fork源码修改后生成自己版本的Spring cloud config。在GitHub上可以找到PR是这么干的。
https://github.com/spring-cloud/spring-cloud-config/pull/1726
不过这样一来还要单独管理我们版本的Spring cloud config, 修改使用起来也不太方便。
既然我们使用Spring Boot, 能不能使用依赖注入的方式生成一个bean取代旧的原来的AWS S3后端?
解决S3后端问题的关键代码很简单,我们新建一个类并且override findone函数
1 | override fun findOne( |
specifiedApplication
参数对应例子中的common,test
,specifiedProfiles
对应prod
代码的意思是把specifiedApplication按逗号分割提取并调用父类的findone方法。
这个解决了问题1。
注意"$specifiedProfiles,"
, specifiedProfiles后面跟了个逗号。父类的findone后将specifiedProfiles按逗号分割成多个profile。加个逗号相当于增加了一个名字为空的profile.
这个解决了问题2。
剩下的问题就是如何注入到Spring cloud config. 我原本想直接复用原有的配置项,但不幸地生成的两个bean, 并且两个bean都起作用了。
用于配置aws s3的配置项:
1 | spring.cloud.config.server.awss3.region |
所以只能用新的配置项。新配置项这样:
1 | spring.cloud.config.server.myawss3.region |
要让新配置项起作用,添加:
1 |
|
最后添加bean:
1 |
|
注意@Profile(“myawss3”),这是Spring Boot的注解,当配置文件里:
1 | spring.profiles.active=hpm-awss3 |
就会自动生成bean。