快速入门

构建配置中心

简单4步构建一个分布式配置中心。

1. 创建工程

使用 Spring Initializr 生成一个 Spring Cloud Config Server 的 Maven 项目

image.png

pom.xml 文件中已经引入下面的依赖:

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-actuator</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-web</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.cloud</groupId>
  12. <artifactId>spring-cloud-config-server</artifactId>
  13. </dependency>
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-test</artifactId>
  17. <scope>test</scope>
  18. </dependency>
  19. </dependencies>

spring-boot-starter-actuator:健康检查
spring-boot-starter-web:Spring Web
spring-cloud-config-server:配置中心服务端

2. 添加 @EnableConfigServer 注解

主类 Application.java 添加 @EnableConfigServer 注解

  1. @EnableConfigServer
  2. @SpringBootApplication
  3. public class Application {
  4. public static void main(String[] args) {
  5. SpringApplication.run(Application.class, args);
  6. }
  7. }

3. 配置

在 application.properties 中添加配置服务的基本信息以及 Git 仓库的信息

  1. spring.application.name=config-server
  2. server.port=9090
  3. logging.level.root=debug
  4. #配置Git仓库位置
  5. spring.cloud.config.server.git.uri=https://gitee.com/yin_jw/demo
  6. #配置本地仓库位置
  7. #spring.cloud.config.server.git.uri=file:///E:/project/demo
  8. #配置仓库路径下的相对搜索位置,可以配置多个
  9. spring.cloud.config.server.git.search-paths=config-repo
  10. #访问Git仓库的用户名
  11. #spring.cloud.config.server.git.username=
  12. #访问Git仓库的用户密码
  13. #spring.cloud.config.server.git.password=

其中 Git 的配置信息分别表示如下内容。

  • spring.cloud.config.server.git.uri:配置 Git 仓库位置,uri 地址不要以 “/“ 结尾,否则会报警告
  • spring.cloud.config.server.git.search-paths:配置仓库路径下的相对搜索位置,可以配置多个
  • spring.cloud.config.server.git.username:访问 Git 仓库的用户名
  • spring.cloud.config.server.git.password:访问 Git 仓库的用户密码

spring.cloud.config.server.git.uri 可以配置本地仓库位置,通过 file:// 前缀来设置一个文件地址(在 Windows 系统中,需要使用 file:/// 来定位文件内容),这样我们就可以脱离 Git 服务端来快速进行调试和开发。

注意:在配置的 file:// 文件地址中必须要存在 .git 目录,否则会报错。

4. 创建配置仓库

根据 Git 配置信息中指定的仓库位置,在 https://gitee.com/yin_jw/demo 下创建一个 config-repo 目录作为配置仓库,并根据不同的环境新建3个配置文件:

  • application-dev.properties
  • application-prod.properties
  • application-test.properties

在这3个配置文件中均设置了一个 from 属性,并为每个配置文件分别设置了不同的值,如下所示:

  • from=application-dev
  • from=application-prod
  • from=application-test

启动 Spring Cloud Config Server 应用,我们就可以通过浏览器、Potman 等工具直接访问我们的配置内容了。

image.png

到这里,分布式配置中心就完成了,接下来了解一下配置规则。

配置规则详解

访问配置信息的 URL 与配置文件的映射关系如下所示:

  • /{application}/{profile}[/{label}]
  • /{application}-{profile}.yml
  • /{application}-{profile}.properties
  • /{label}/{application}-{profile}.yml
  • /{label}/{application}-{profile}.properties

application 表示应用名,profile 表示环境名,label 表示 Git 上的分支名称,默认是 master。我们可以构造不同的 url 来访问不同的配置内容,比如,要访问 master 分支,application 应用的 dev 环境,就可以访问这个 url: http://localhost:9090/application/dev,获得如下返回信息:

  1. {
  2. "name": "application",
  3. "profiles": [
  4. "dev"
  5. ],
  6. "label": null,
  7. "version": "a4e28a0cd4bdc0a5a7de05a049edc6412a65d0a2",
  8. "state": null,
  9. "propertySources": [
  10. {
  11. "name": "https://gitee.com/yin_jw/demo/config-repo/application-dev.properties",
  12. "source": {
  13. "from": "application-dev"
  14. }
  15. }
  16. ]
  17. }

注意:

通过 debug 日志内容,配置服务在从 Git 中获取配置信息后,会存储一份在 config-server 的文件系统中,实质上 config-server 是通过 git clone 命令将配置内容复制一份在本地存储,然后读取这些内容并返回给微服务应用进行加载。

当 Git 仓库出现故障时,在此发起 http://localhost:9090/application/dev 请求,config-server 提示无法从远程获取改分支内容的报错信息:Could not pull remote for master,但是它依然会为该请求返回配置内容,这些内容源于之前访问时存于 config-server 本地文件系统中的配置内容。

客户端配置映射

配置中心已经正常运行,下面我们尝试如何在微服务应用中获取上述配置信息。

1. 创建工程

使用 Spring Initializr 生成一个 Spring Cloud Config Client 的 Maven 项目

image.png

pom.xml 文件中已经引入下面的依赖:

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-actuator</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-web</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.cloud</groupId>
  12. <artifactId>spring-cloud-starter-config</artifactId>
  13. </dependency>
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-test</artifactId>
  17. <scope>test</scope>
  18. </dependency>
  19. </dependencies>

spring-cloud-starter-config:配置客户端

2. 配置

  1. spring.application.name=config-client
  2. server.port=8080
  3. spring.cloud.config.profile=dev
  4. spring.cloud.config.label=master
  5. spring.cloud.config.uri=http://localhost:9090/

上述配置参数与 Git 中存储的配置文件中各个部分的对应关系如下所示。

  • spring.application.name:对应配置文件规则中的 {application} 部分。
  • spring.cloud.config.profile:对应配置文件规则中的 {profile} 部分。
  • spring.cloud.config.label:对应配置文件规则中的 {label} 部分。
  • spring.cloud.config.uri:配置中心 config-server 的地址。

Git 存储的配置文件如下所示,根据上述的配置内容,客户端默认会加载两个配置文件:application-dev.properties(默认)、config-client-dev.properties,from 数据从 config-client-dev.properties 中获取。如果不存在 config-client-dev.properties 配置文件,from 数据会从 application-dev.properties 中获取。

image.png

3. 创建一个 RESTful 接口

创建一个 RESTful 接口来返回配置中心的 from 属性。

  1. @RestController
  2. public class TestController {
  3. @Value("${from}")
  4. private String from;
  5. @GetMapping("from")
  6. public String from() {
  7. return from;
  8. }
  9. }

启动 config-client 应用,访问 http://localhost:8080/from,就可以根据配置内容输出对应环境的 from 内容了。

image.png

一个完整的配置中心例子完成了,接下来就是服务端和客户端的优化了。

优化

1. 实现一个应用一个目录

{application}、{profile}、{label} 这些占位符除了用于标识配置文件的规则之外,还可以用于 Config Server 中对 Git 仓库地址的 URI 配置、子目录配置。其中,{application} 会根据客户端的 spring.application.name 信息来填充 {application} 占位符以定位配置资源的存储位置,从而实现根据微服务应用的属性动态获取不同位置的配置。

通过占位符配置实现一个应用一个目录的效果,假设存在两个客户端应用。

1)修改 Git 配置文件目录结构如下所示

  1. config-repo
  2. ├─config-client1
  3. application-dev.properties
  4. application-prod.properties
  5. application-test.properties
  6. └─config-client2
  7. application-dev.properties
  8. application-prod.properties
  9. application-test.properties

2)修改服务端配置文件内容

image.png

3)增加一个客户端应用,同时修改客户端配置文件

config-client1:

image.png

config-client2:

image.png

4)重启客户端、服务端服务后,通过 Postman 访问配置内容

image.png

image.png

2. 安全保护

1)服务端 pom.xml 文件增加 security 依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-security</artifactId>
  4. </dependency>

2)修改服务端配置文件内容

image.png

3)修改客户端配置文件内容

image.png

参考

《Spring Cloud 微服务实战》