"阅读本文大约需要 5 分钟"
近几年微服务的架构成为主流,而这种架构模式的变迁也给架构师和开发人员带来了更大的挑战,对于中小型公司,选择一个合适的微服务框架就变的十分重要。Spring 在 Netflix 开源的微服务框架的基础上提供 Spring Cloud,为微服务应用提供各方面的基础支持。我会对 Spring Cloud 中的各个组件做一个入门的介绍,帮助大家在最短的时间了解该组件的作用,并能快速的搭建,部署 Spring Cloud。
今天这篇文章的主角是 Spring Cloud Config 组件,让我们开始吧。
Spring Cloud Config 是什么?
顾名思义 Spring Cloud Config 是解决配置管理问题的。大家在日常工作中一定遇到过程序中需要一些参数化的配置,直白的做法是将这些参数放在外部的配置文件中,在系统启动或是运行时再读取其中的参数内容。但是在微服务的架构下,我们的需求可能更为复杂。最小范围我们希望配置满足以下的需求:
- 应用可能部署多个副本,我们希望能够共享一份配置文件,避免修改一个参数需要改动多个文件的情况出现
- 配置参数能够有版本管理功能,当出现问题时可以随时回退,并能从变更历史上来排查异常
- 支持多维度的管理层级,针对不同环境和应用可以区分不同的配置参数
Spring Cloud Config 不仅满足以上的需求,还额外提供了加密等特性的配置管理中心。Spring Cloud Config 本身也是一个 Spring Boot 应用,因此和 Spring Boot 的应用集成更为简单,且提供了更多特有的特性。下面就让我们快速搭建一个 Spring Cloud Config 应用,并演示如何使用。
搭建 Spring Cloud Config Server
如之前提到的,Spring Cloud Config 本身就是一个 Spring Boot 的应用,因此使用 Spring Initializr 可以快速搭建一个 Spring Cloud Config Server。Spring Initializr 的使用可以参考我之前的 <<Spring Boot 5 分钟快速指南>>,与之前开发 Spring Boot 唯一不同的是在依赖项这里只需要添加 Config Server
一项即可,参考下图:
下载并解压缩项目之后,打开 Spring Boot 的启动类,在类上增加一个 annotation,@EnableConfigServer
变可将当前的 Spring Boot 应用设定为 Spring Cloud Config Server。接着在项目目录下运行 ./mvnw spring-boot:run
便会运行当前项目。现在的配置情况下运行会抛出异常,观察出错信息,信息会提示我们没有设置 Spring Cloud Config 的 git uri 参数。
Spring Cloud Config 支持从 git 仓库中的文件读取配置信息,因此需要默认配置 git 仓库的路径。打开项目中的 application.properties
文件,增加一行配置 spring.cloud.config.server.git.uri=file://${user.home}/config-repo
,如果你是使用的 Windows,则需要在路径处多加一个斜杠,即 spring.cloud.config.server.git.uri=file:///${user.home}/config-repo
。接着我们可以在配置的目录下创建一个 git 仓库,并添加相关的配置文件,具体代码如下:
$ cd $HOME
$ mkdir config-repo
$ cd config-repo
$ git init .
$ echo info.foo: bar > application.properties
$ git add -A .
$ git commit -m "Add application.properties"
再次运行 ./mvnw spring-boot:run
就能成功运行 Spring Cloud Config Server 了。我们先可以使用 curl
命令来测试一下 Spring Cloud Config Server 是否工作正常。
$ curl localhost:8888/application-default.properties
$ info.foo: bar
运行上述的命令可以看到我们对应的 git 仓库目录下定义的属性文件内容,在这里要介绍一下 Spring Cloud Config 内建的目录格式。
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
- application: 为应用名称,在 Spring Boot 中可以通过
spring.application.name
来设置,默认为application
- profile: 为应用启动的所使用的
profile
名称,可以在启动时通过命令行参数进行设定 - labe: 则为 git 仓库的
label
属性,这里默认为master
运行客户端
在 Server 端定义了属性文件后,可以在应用中通过 http 形式来获取其中的参数,如果使用 Spring Boot 开发应用程序,可以更加方便的和 Spring Cloud Config Server 集成,现在就让我们看看对应的示例。
首先还是使用 Spring Initializr 来初始化项目配置,不过这次需要添加的依赖项为 Config Client
,如下图:
解压项目后,首先修改项目中 application.properties
,增加如下的配置:
server.port=9000
spring.application.name=client-app
spring.cloud.config.uri=http://localhost:8888
因为我们会把 client 和 server 运行在同一台服务器上,因此我们修改 client 的运行端口为 9000
, 同时我们设定我们的应用名为 client-app
,而 spring.cloud.config.uri
参数配置了我们应用需要连接的配置服务器地址。
按照之前介绍的 Spring Cloud Config 的 url 匹配规则,我们将 git 仓库中的 application.properties
重命名为 client-app.properites
,并且在文件中新增一行配置 friend.name: Joshua
。
在 client 应用中,新增一个 Controller,具体代码如下:
@RestController
public class GreetingController {
@Value("${friend.name}")
private String friendName;
@GetMapping("/greeting")
public String greeting() {
return String.format("Hello, %s", friendName);
}
}
以上代码,我们从配置中读取 friendName
的值,在当前环境中会从 Spring Cloud Config Server 中读取,并注入给 Controller。
我们启动 client 应用,然后使用 curl
访问应用,可以看到如下的效果:
$ curl http://localhost:9000/gretting
$ Hello, Joshua
就这样,我们很方便的搭建了一套集中化的配置管理中心和使用它的客户端程序。
结语
Spring Cloud Config 提供了简单易用的集中化配置管理功能,简单易用,而且能很方便的和 Spring Boot 应用进行集成。如果你想深入了解 Spring Cloud 的其他组件,或想掌握更多 Spring Cloud Config 的其他高级用法,可以关注我们的公众号,还能获得实例项目的源代码,赶快关注吧!
15年从业经验,不仅在国内著名的大型金融集团做过甲方,担任高级系统架构专家角色,也在第一梯队的互联网公司金融部门做过数据智能相关工作。
也曾任职于大型系统集成商,负责保险,银行核心系统的落地和实施,也在创业团队从0到1研发产品,在业界获得很高的占有量。
如果感兴趣可以加我公众号,搜索“且把金针度与人”或个人微信