前言
Spring Cloud Config为微服务架构提供了配置管理的功能。通过Spring Cloud Config服务端提供配置中心,在各个微服务应用的客户端读取来自服务端配置中心的配置项。配置中心的数据源可以来自git、svn、数据库、操作系统的本地文件、jar包中的文件、vault、组合
EnvironmentRepository接口
可以看到上图有对应的类负责存储配置中心的配置数据。而对于接口EnvironmentRepository只提供了一个方法findOne,通过传入application、profile和label来获得配置项。
EnvironmentRepositoryProperties
Spring Cloud Config有许多的配置方式,如果想查看有哪些配置参数,可以直接查询相应的接口EnvironmentRepositoryProperties的实现类。
Native
这里可以使用系统的文件路径,也可以使用jar中的配置文件,bootstrap.yml配置如下:
spring:
profiles: native
cloud:
config:
server:
native:
search-locations: classpath:/config/
# search-locations: file:/config/
如果使用的是classpath,就会使用jar里的配置。如果使用的是file,就会使用操作系统的文件路径。
jar时可以添加下面的application.yml指定所有的配置。client-dev.yml是我的一个微服务应用client的配置文件,dev指的是profile
这里需要注意的是,native方式只能单独使用,不能组合使用。原因是类NativeRepositoryConfiguration加了限制条件。一旦提供了别的EnvironmentRepository,这个就不生效了
接着可以访问Spring cloud config的站点,查看配置项
git
git是比较常见用来存储配置项的方式,数据源可以来自github,也可以使用自己抢建私有的git服务器。在resources目录下,添加bootstrap.yml文件,具体配置如下:
spring:
profiles: git
cloud:
config:
server:
git:
uri: https://github.com/repository/springcloud_demo_config.git
username: username
password: password
然后在你的git项目中添加文件application.yml配置文件,填入你的配置项目
数据库
这里作为存储配置项的数据库,只能使用支持Jdbc的关系型数据库。使用数据之前需要先引入jdbc和数据驱动的包。如果你使用的maven,可以添加下面配置。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.connector.version}</version>
</dependency>
添加spring-boot-start-jdbc包的原因是,在JdbcRepositoryConfiguration类中会判断是否存在JdbcTemplate类。如果不引入Jdbcqn,那么配置就不会生效
同样添加配置文件bootstrap.yml,具体配置如下:
spring:
profiles: jdbc
cloud:
config:
server:
jdbc:
sql: SELECT KEY, VALUE from PROPERTIES where APPLICATION=? and PROFILE=? and LABEL=?
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://localhost:3306/new_platform?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
这里需要你的数据库配置,并在数据库中添加一张数据库表。至于数据表的结构,大家可以从配置文件中是sql语句中看出。当配置中心读取配置项时,会传入相应的where条件参数,进行sql查询,返回给客户端。有兴趣的要以看看JdbcEnvironmentRepository类的findOne方法。
读取你的bootstrap.yml文件的配置,可以参考源码JdbcEnvironmentProperties
组合
如果你理解了上面的配置方式,下面的组就很简单了。只是多了一个order的配置,用于读取数据源的顺序。
spring:
active: composite
cloud:
config:
server:
composite:
-
type: jdbc
sql: SELECT KEY, VALUE from PROPERTIES where APPLICATION=? and PROFILE=? and LABEL=?
order: 0
-
type: native
search-locations: classpath:/config/
order: 1
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://localhost:3306/new_platform?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
其它
配置方式除了以上几种,还有vault、redis、CredHub,技术上不难,我也没试过,有兴趣的可以查看官方文档。另外,你也可以自己实现Spring Cloud Config自己实现个性化的配置方式。