Spring Cloud Config配置中心是什么
在分布式系统中,尤其是当我们的分布式项目越来越多,每个项目都有自己的配置文件,对配置文件的统一管理就成了一种需要,而 Spring Cloud Config 就提供了对各个分布式项目配置文件的统一管理支持。Spring Cloud Config 也叫分布式配置中心,市面上开源的分布式配置中心有很多,比如国内的, 360 的QConf、淘宝的 diamond、百度的 disconf 都是解决分布式系统配置管理问题,国外也有很多开源的配置中心 Apache 的 Apache Commons Configuration、owner、cfg4j 等等;
Spring Cloud Config 是一个解决分布式系统的配置管理方案。它包含 Client和 Server 两个部分,Server 提供配置文件的存储、以接口的形式将配置文件的内容提供出去,Client 通过接口获取数据、并依据此数据初始化自己的应用。
Spring cloud 使用 git 或 svn 存放配置文件,默认情况下使用 git。
构建一个 spring cloud config 配置中心按照如下方式进行:
1、创建一个普通的 Spring Boot 项目
2、在 pom.xml 文件中添加如下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
3、在入口类,也就是 main 方法的类上添加注解 @EnableConfigServer
4、在 application.properties 中配置一下 git 仓库信息,此处我们使用 GitHub( 也可以使用码云 gitee ) , 首先在我的 Github 上创建一个名为spring-cloud-config 的项目,创建之后,再做如下配置:
server.port=3721
spring.application.name=07-springcloud-config-server
spring.cloud.config.server.git.uri=http://github.com/myspring/sprin
g-cloud-config.git
spring.cloud.config.server.git.search-paths=config-center
[email protected]
spring.cloud.config.server.git.password=xxxx123456
其中:
● uri 表示配置中心所在仓库的位置
● search-paths 表示仓库下的子目录
● username 表示你的 GitHub 用户名
● password 表示你的 GitHub 密码
至此我们的配置中心服务端就创建好了。
接下来我们需要在 github 上设置好配置中心,首先在本地创建一个文件夹叫wkcto,然后在里面创建一个文件夹叫 config-center,然后在 config-center中创建四个配置文件,如下:
application.properties
application-dev.properties
application-test.properties
application-online.properties
在四个文件里面分别写上要测试的内容:
url=http://www.wkcto.com
url=http://dev.wkcto.com
url=http://test.wkcto.com
url=http://online.wkcto.com
然后回到 wkcto 目录下,依次执行如下命令将本地文件同步到 Github 仓库中:
说明:在使用命令之前先从 http://git-scm.com/ 网站下载安装 git 的 window 客户端
1、添加提交人的账号信息,git 需要知道提交人的信息作为标识;
git config --global user.name 'junge'
git config --global user.email '[email protected]'
2、将该目录变为 git 可以管理的目录;
git init
3、将文件添加到暂存区
git add config-center/
4、把文件提交到本地仓库;
git commit -m 'add config-center'
5、添加远程主机;
git remote add origin http://github.com/hnylj/spring-cloud-config.git
6、将本地的 master 分支推送到 origin 主机;
git push -u origin master
至此,我们的配置文件就上传到 GitHub 上了。
此时启动我们的配置中心,通过/{application}/{profile}/{label}就能访问到我们的配置文件了;
其中:
{application}表示配置文件的名字,对应的配置文件即application,
{profile}表示环境,有dev、test、online及默认,
{label}
通过浏览器上访问 http://localhost:3721/application/dev/master
返回的 JSON 格式的数据:
name 表示配置文件名 application 部分,profiles 表示环境部分,label 表示分支,version 表示 GitHub 上提交时产生的版本号,同时当我们访问成功后,在控制台会打印了相关的日志信息;当访问成功后配置中心会通过 git clone 命令将远程配置文件在本地也保存一份,以确保在 git 仓库故障时我们的应用还可以继续正常使用。
前面已经搭建好了配置中心的服务端,接下来我们来看看如何在客户端应用中使用。
1、创建一个普通的 Spring Boot 工程 08-springcloud-config-client,并添加如下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
2、创建 bootstrap.properties 文件,用于获取配置信息,文件内容如下:
(注意这些信息一定要放在 bootstrap.properties 文件中才有效)
server.port=3722
spring.application.name=application
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:3721/
其中:
name 对应配置文件中的 application 部分,profile 对应了 profile 部分,label 对应了 label 部分,uri 表示配置中心的地址。
3、创建一个 Controller 进行测试:
@RestController
@RefreshScope
public class ConfigController {
@Value("${url}")
http://www.wkcto.com
private String url;
@Autowired
private Environment env;
@RequestMapping("/cloud/url")
public String url () {
return this.url;
}
@RequestMapping("/cloud/url2")
public String url2 () {
return env.getProperty("url");
}
}
我们可以直接使用@Value 注解注入配置的属性值,也可以通过 Environment对象来获取配置的属性值。
通过客户端应用测试是否能够获取到配置中心配置的数据;
Spring cloud Config Server 的工作过程如下图所示:
1、首先需要一个远程 Git 仓库,平时测试可以使用 GitHub,在实际生产环境中,需要自己搭建一个 Git 服务器,远程 Git 仓库的主要作用是用来保存我们的配置文件;
2、除了远程 Git 仓库之外,我们还需要一个本地 Git 仓库,每当 Config Server访问远程 Git 仓库时,都会克隆一份到本地,这样当远程仓库无法连接时,就直接使用本地存储的配置信息;
3、微服务 A、微服务 B 则是我们的具体应用,这些应用在启动的时会从 ConfigServer 中获取相应的配置信息;
4.当微服务 A、微服务 B 尝试从 Config Server 中加载配置信息的时候,ConfigServer 会先通过 git clone 命令克隆一份配置文件保存到本地;
5、由于配置文件是存储在 Git 仓库中,所以配置文件天然具有版本管理功能;
生产环境中我们的配置中心肯定是不能随随便便被人访问的,我们可以加上适当的保护机制,由于微服务是构建在 Spring Boot 之上,所以整合 Spring Security是最方便的方式。
1、在 springcloud config server 项目添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2、在 springcloud config server 项目的 application.properties 中配置用户名密码:
spring.security.user.name=wkcto
spring.security.user.password=123456
3、在 springcloud config client 上 bootstrap.properties 配置用户名和密码:
spring.cloud.config.username=wkcto
spring.cloud.config.password=123456
4、最后测试验证;