学习目标
今天我们要学习的是 Spring Cloud Config Server(配置服务器),首先我们先创建项目:打开 https://start.spring.io/,填写相关信息,项目名为 spring-cloud-chapter-3-config-server
,添加 Web、Actuator 以及 Config Server 依赖,点击 “Generate Project” 按钮生成项目,并导入到 idea 中。(注:此处使用的 Spring Boot 版本为 1.X 系列)
一、认识 Spring Cloud 配置服务器
1)Spring Cloud Config Server:
Spring Cloud 配置服务器提供分布式、动态化集中管理应用配置信息的能力。
- 分布式:通过负载均衡将流量分发到不同的配置服务器上
- 动态化:数据源(Git,数据库)发生变化时,客户端能够感知的到
- 集中管理:一个配置服务器可能管理多个配置客户端
2)构建 Spring Cloud 配置服务器
使用 @EnableConfigServer
注解标注
二、服务端 Environment 仓储
1)EnvironmentRepository
Spring Cloud 配置服务器管理多个客户端应用的配置信息,然而这些配置信息需要通过一定的规则获取。Spring Cloud Config Server 提供 EnvironmentRepository 接口供客户端应用获取,其中获取维度有三:
- {application}:配置客户端应用名称,即配置项:spring.application.name
- {profile}:配置客户端应用当前激活的 Profile,即配置项:spring.profiles.active
- {label}:配置服务端标记的版本信息,如 Git 中的分支名
2)两种方式搭建 Spring Cloud Config Server
- 基于文件系统实现
- spirng.cloud.config.server.git.uri = ${user.dir}/configs
- 基于 Git 版本控制
- spirng.cloud.config.server.git.uri = https://github.com/AlanShelby/blogs-temporary.git
3)服务端配置映射
- /{application}/{profile}[/{label}]
- /{application}-{profile}.yml
- /{label}/{application}-{profile}.yml
- /{application}-{profile}.properties
- /{label}/{application}-{profile}.properties
三、搭建 Spring Cloud Config Server 之基于文件系统创建本地仓库
上面我们说到了有两种方式可以搭建 Spring Cloud Config Server,我们先来看第一种--基于文件系统创建本地仓库。
1)在启动类中添加 @EnableConfigServer
注解,激活应用配置服务器。
package top.alanshelby.springcloudchapter3configserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@SpringBootApplication
@EnableConfigServer
public class SpringCloudChapter3ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudChapter3ConfigServerApplication.class, args);
}
}
2)创建本地目录
理解 Java 中的 ${user.dir},在 IDE 中是指的当前项目物理路径
可以使用下面代码进行输出:
System.out.println(System.getProperty("user.dir"));
输出的结果为当前项目的路径:
E:\Project\CourseProject\SpringCloud\spring-cloud-chapter\spring-cloud-chapter-3-config-server
在 idea 中 \src\main\resources
目录下创建名为 configs
的目录,它的绝对路径:${user.dir}\\src\\main\\resources\\configs
3)配置 git 本地仓库 uri
在 application.properties 文件中添加如下配置信息:
# 配置服务器文件系统 git 仓库
spring.cloud.config.server.git.uri = ${user.dir}\\src\\main\\resources\\configs
4)给应用 blogs
创建三个环境的配置文件,并添加 name
属性,这三个配置文件均位于 configs
目录下:
- blogs.properties
- name = blogs
- blogs-prod.properties
- name = blogs-prod
- blogs-test.properties
- name = blogs-test
三个文件的环境 profile 分别是:default
、prod
、test
5)初始化本地 git 仓库
在 ${user.dir}\src\main\resources\configs 路径下执行以下 git 命令:
- git init
- git add .
- git commit -m "xxx"
出现以下结果表示成功:
3 files changed, 7 insertions(+)
create mode 100644 blogs-prod.properties
create mode 100644 blogs-test.properties
create mode 100644 blogs.properties
6)测试配置服务器
启动项目,通过浏览器测试应用为 blogs
(与创建的三个配置文件名称相对应,具体映射关系可看本文第二部分中的服务端配置映射),Profile 为 test
的配置内容,访问 http://localhost:9090/blogs/test,这时就会看到 blogs.properties
和 blogs-test.properties
两个配置文件的信息,请注意:当指定了 Profile 时,默认的 Profile(不指定)配置信息也会输出 blogs.properties
。
四、搭建 Spring Cloud Config Server 之基于远程 git 仓库
上面我们学习了如何利用文件系统创建本地仓库,接下来我们来看看如何基于远程 git 仓库来 Spring Cloud Config Server。
1)在启动类中添加 @EnableConfigServer 注解,激活应用配置服务器。
2)配置远程 Git 仓库地址
# 配置服务器远程 Git 仓库(GitHub)
spring.cloud.config.server.git.uri = https://github.com/AlanShelby/blogs-temporary.git
3)本地 clone 远程 Git 仓库
https://github.com/AlanShelby/blogs-temporary.git
4)给应用 blogstemp
创建三个环境的配置文件
- blogstemp.properties
- name = blogstemp
- blogstemp-prod.properties
- name = blogstemp-prod
- blogstemp-test.properties
- name = blogstemp-test
三个文件的环境 profile 分别是:default
、prod
、test
5)提交到远程 Git 仓库(默认分支为 master,即后面所用到的 label)
git add blogstemp*.properties
git commit -m "add blogstemp config files"
git push
6)配置强制拉取内容
# 强制拉去 Git 内容
spring.cloud.config.server.git.force-pull = true
7)测试配置服务器
启动项目,通过浏览器测试应用为 blogstemp,Profile 为 test 的配置内容,访问 http://localhost:9090/blogstemp/test,这时就会看到 blogstemp.properties 和 blogstemp-test.properties 两个配置文件的信息。
注意:这里的 version 与你 git 提交的 version 是一致的,可在本地使用 git log 命令查看。
五、Spring Cloud 配置客户端
1)创建 Spring Cloud Config Client 应用
创建一个名为 spring-cloud-chapter-3-config-client
的应用
2)在 classPath 下面创建 bootstrap.properties
3)配置 bootstrap.properties
配置以 spring.cloud.config.
开头的配置信息
# 配置客户端应用关联的应用,该配置时可选的,如果不配置,采用 spring.application.name
spring.cloud.config.name = blogstemp
# 关联 profile
spring.cloud.config.profile = prod
# 关联 label
spring.cloud.config.label = master
# 关联 uri
spring.cloud.config.uri = http://localhost:9090/
在 application.properties
中添加如下配置:
spring.application.name = spring-cloud-config-client
server.port = 8080
management.security.enabled = false
4)先启动 spring-cloud-chapter-3-config-server
然后再启动 spring-cloud-chapter-3-config-client 项目,在 spring-cloud-chapter-3-config-client 启动日志中可以看到如下信息,表示 clien 已经连接到了 server,并取到了 GitHub 上的 blogstemp-prod.properties 配置文件。
Fetching config from server at: http://localhost:9090/
Located environment: name=blogstemp, profiles=[prod], label=master, version=11399ab7d42f35c3282bb2c775f97e2d77b2c0e5, state=null
Located property source: CompositePropertySource [name='configService', propertySources=[MapPropertySource {name='configClient'}, MapPropertySource {name='https://github.com/AlanShelby/blogs-temporary.git/blogstemp-prod.properties'}, MapPropertySource {name='https://github.com/AlanShelby/blogs-temporary.git/blogstemp.properties'}]]
5)测试 Spring Cloud 配置客户端
通过浏览器访问 http://localhost:8080/env
至此,关于Spring Cloud Config Server(配置服务器)就讲解完了,这是我的理解,各位看官如果有不同见解或文章中有错误,请不吝指正。
所用代码码云地址:https://gitee.com/AlanShelby/spring-cloud-chapter
知乎专栏地址:https://zhuanlan.zhihu.com/c_200981602
个人微信公众号:AlanShelby(多多关注,感谢~)