快速入门
构建配置中心
简单4步构建一个分布式配置中心。
1. 创建工程
使用 Spring Initializr 生成一个 Spring Cloud Config Server 的 Maven 项目
pom.xml 文件中已经引入下面的依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
spring-boot-starter-actuator:健康检查
spring-boot-starter-web:Spring Web
spring-cloud-config-server:配置中心服务端
2. 添加 @EnableConfigServer 注解
主类 Application.java 添加 @EnableConfigServer 注解
@EnableConfigServer
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
3. 配置
在 application.properties 中添加配置服务的基本信息以及 Git 仓库的信息
spring.application.name=config-server
server.port=9090
logging.level.root=debug
#配置Git仓库位置
spring.cloud.config.server.git.uri=https://gitee.com/yin_jw/demo
#配置本地仓库位置
#spring.cloud.config.server.git.uri=file:///E:/project/demo
#配置仓库路径下的相对搜索位置,可以配置多个
spring.cloud.config.server.git.search-paths=config-repo
#访问Git仓库的用户名
#spring.cloud.config.server.git.username=
#访问Git仓库的用户密码
#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 等工具直接访问我们的配置内容了。
到这里,分布式配置中心就完成了,接下来了解一下配置规则。
配置规则详解
访问配置信息的 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,获得如下返回信息:
{
"name": "application",
"profiles": [
"dev"
],
"label": null,
"version": "a4e28a0cd4bdc0a5a7de05a049edc6412a65d0a2",
"state": null,
"propertySources": [
{
"name": "https://gitee.com/yin_jw/demo/config-repo/application-dev.properties",
"source": {
"from": "application-dev"
}
}
]
}
注意:
通过 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 项目
pom.xml 文件中已经引入下面的依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
spring-cloud-starter-config:配置客户端
2. 配置
spring.application.name=config-client
server.port=8080
spring.cloud.config.profile=dev
spring.cloud.config.label=master
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 中获取。
3. 创建一个 RESTful 接口
创建一个 RESTful 接口来返回配置中心的 from 属性。
@RestController
public class TestController {
@Value("${from}")
private String from;
@GetMapping("from")
public String from() {
return from;
}
}
启动 config-client 应用,访问 http://localhost:8080/from,就可以根据配置内容输出对应环境的 from 内容了。
一个完整的配置中心例子完成了,接下来就是服务端和客户端的优化了。
优化
1. 实现一个应用一个目录
{application}、{profile}、{label} 这些占位符除了用于标识配置文件的规则之外,还可以用于 Config Server 中对 Git 仓库地址的 URI 配置、子目录配置。其中,{application} 会根据客户端的 spring.application.name 信息来填充 {application} 占位符以定位配置资源的存储位置,从而实现根据微服务应用的属性动态获取不同位置的配置。
通过占位符配置实现一个应用一个目录的效果,假设存在两个客户端应用。
1)修改 Git 配置文件目录结构如下所示
config-repo
├─config-client1
│ application-dev.properties
│ application-prod.properties
│ application-test.properties
│
└─config-client2
application-dev.properties
application-prod.properties
application-test.properties
2)修改服务端配置文件内容
3)增加一个客户端应用,同时修改客户端配置文件
config-client1:
config-client2:
4)重启客户端、服务端服务后,通过 Postman 访问配置内容
2. 安全保护
1)服务端 pom.xml 文件增加 security 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2)修改服务端配置文件内容
3)修改客户端配置文件内容
参考
《Spring Cloud 微服务实战》