分布式配置中心:Spring Cloud Config
Spring Cloud Config是Spring Cloud团队创建的一个全新的项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端和客户端两个部分。其中服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息、加密/解密信息等访问接口;而客户端则是微服务架构中的各个微服务应用或基础设施,他们通过指定的配置中心来管理应用资源与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。Spring Cloud Config实现了对服务端和客户端中环境变量和属性配置的抽象映射,所以它除了适用于Spring构建的应用程序之外,也可以在任何其他语言运行的应用程序中使用。由于Spring Cloud Config实现的配置中心默认采用Git来储存配置信息,所以使用Spring Cloud Config构建的配置服务器,天然就支持对微服务应用配置信息的版本管理,并且可以通过Git客户端工具来方便地管理和访问配置内容。当然它也提供了对其他存储方式的支持,比如SVN仓库、本地化文件系统等。
服务端搭建
1. 创建maven工程,骨架选择quickstart,名称为:demo-config-server
2. 加入相关依赖:
3. 创建启动类:
4. 在src\main\resources目录下创建application.yml文件:
- spring.cloud.config.server.git.uri:配置Git仓库位置。
- spring.cloud.config.server.git.search-paths:配置仓库路径下的相对搜索位置,可以配置多个。
- spring.cloud.config.server.git.username:访问Git仓库的用户名。
- spring.cloud.config.server.git.password:访问Git仓库的用户密码。
注:由于git项目是公开的,所以不用提供用户名和密码也可以。
5. 登录Git,在demo-springcloud/目录下创建config-repo文件夹,并新建4个配置文件:
6. 配置文件的内容分别如下,为了测试版本控制,在该Git仓库的master分支中,为form属性加入1.0的后缀,同时创建一个config-label-test分支,并将个配置文件中的值用2.0作为后缀:
7. 启动项目,可以通过如下几种方式访问配置内容,其中application为配置文件的前缀,这里就是application;profile为配置文件的后缀,这里是dev、pro和test;label代表Git分支名称:
- /{application}/{profile}[label]
- /{application}-{profile}.yml
- /{label}/{application}-{profile}.yml
- /{application}-{profile}.properties
- /{label}/{application}-{profile}.properties
例如访问http://localhost:8001/application/dev/config-label-test得到如下内容:
8. 同时,观察demo-config-server项目的控制台,发现输出了如下内容:
9. 配置服务器在从Git中获取配置信息后,会存储一份在demo-config-server的文件系统中,实质上demo-config-server是通过git clone命令将配置内容复制了一份在本地存储,然后读取这些内容并返回给微服务应用进行加载。通过Git在本地仓库暂存,可以有效的防止当Git仓库出现故障而引起无法加载配置信息的情况。可以断开网络,再次在浏览器发起上述请求,可以看到控制台的报错信息:Could not fetch remote for config-label-test remote,但是它依然会为该请求返回配置内容,这些内容源于之前访问时存于demo-config-server本地文件系统中的配置内容:
10. 根据控制台打印的路径,去到指定目录,发现下载下来的配置文件:
客户端搭建
1. 创建maven工程,骨架选择quickstart,名称为:demo-config-client
2. 加入相关依赖:
3. 创建启动类:
4. 在src/main/resources目录下创建bootstrap.properties文件(注:这些属性必须配置在bootstrap.properties中,这样demo-config-server中的配置信息才能被正确加载。Spring Boot对配置文件的加载顺序为,对于本应用jar包之外的配置文件加载会优先于应用jar包内的配置内容,而通过bootstrap.properties对demo-config-client的配置,使得该应用会从demo-config-server中获取一些外部配置信息,这些信息的优先级比本地的内容要高,从而实现了外部化配置):
- spring.application.name:对应配置文件规则中的{application}部分。
- spring.cloud.config.profile:对应配置文件规则中的{profile}部分。
- spring.cloud.config.label:对应配置文件规则中的{label}部分。
- spring.cloud.config.uri:配置中心demo-config-server的地址。
5. 创建一个RESTful接口来返回配置中心的from属性,启动项目并测试效果: