Spring Cloud-18-分布式配置中心Spring Cloud Config

随着分布式项目越来越大,就需要将项目的配置文件抽出来单独管理,就需要用到Spring Cloud Config,Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持

我们可以使用Config Server在所有环境中管理应用程序的外部属性,Config Server本质上也是一个微服务应用,用来连接配置仓库,将获取到的配置信息提供给客户端使用(客户端就是我们的每个微服务应用),我们在客户端上指定配置中心的位置,客户端在启动的时候就会自动去从配置中心获取和加载配置信息

Spring Cloud Config可以与任意语言运行的应用程序一起使用,服务器存储后端的默认实现使用git,因此它轻松支持配置信息的版本管理,当然我们也可以使用Git客户端工具来管理配置信息.本文我们就先来看下Spring Cloud Config的一个基本使用.

构建配置中心

新建工程

创建一个新的工程作为配置中心,名称是config-server

添加依赖

项目添加到主项目管理下面,然后添加如下依赖:

1
2
3
4
5
<!-- 配置中心 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>

入口类修改

入口类添加注解@EnableConfigServer,表示开启配置中心服务端功能:

1
2
3
4
5
6
7
8
9
@SpringBootApplication
@EnableConfigServer
public class App {

public static void main(String[] args) {
SpringApplication.run(App.class, args);
}

}

新建git仓库

在Git服务端,或者github上面新建一个仓库,我这里名称是spring-cloud-demo-config

配置文件修改

修改项目的配置文件application.yml,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
spring:
application:
name: config-server
cloud:
config:
server:
git:
# uri表示配置中心所在仓库的位置
uri: https://github.com/zhouze-java/spring-cloud-demo-config.git
# search-paths表示仓库下的子目录
search-paths: config-repo
# github的用户名和密码
username: xxxxx
password: xxxxx
server:
port: 2007

各个配置的意思在注释中都有说明

构建配置仓库

接下来,需要在github上设置好配置中心,先在本地找一个空的文件夹,在这个文件夹中创建一个config-repo的文件夹,然后创建四个配置文件:
image

四个配置文件的内容分别如下:
application.yml:

1
sang: default config

application-dev.yml:

1
sang: dev config

application-prod.yml:

1
sang: prod config

application-test.yml:

1
sang: test config

创建完成之后,上传到git仓库.具体命令这里就不贴了.

访问

上传到git上面之后,启动配置中心就可以访问了, 路径是/{application}/{profile}/{label}

  • application: 配置文件名称,我们刚刚创建的文件名就是application
  • profile: 环境
  • label: 分支,我们默认的都是放在master上面的

然后启动项目,访问试一下,地址是http://localhost:2007/application/prod/master,结果如下:
image

返回值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"name":"application",
"profiles":[
"prod"
],
"label":"master",
"version":null,
"state":null,
"propertySources":[
{
"name":"https://github.com/zhouze-java/spring-cloud-demo-config.git/config-repo/application-prod.yml",
"source":{
"sang":"prod config"
}
},
{
"name":"https://github.com/zhouze-java/spring-cloud-demo-config.git/config-repo/application.yml",
"source":{
"sang":"default config"
}
}
]
}

当成功访问的时候,在我们项目的控制台会输出以下信息:

1
2
2019-04-01 15:27:46.075  INFO 16292 --- [nio-2007-exec-1] o.s.c.c.s.e.NativeEnvironmentRepository  : Adding property source: file:/C:/Users/ADMINI~1/AppData/Local/Temp/config-repo-2221561102471049379/config-repo/application-prod.yml
2019-04-01 15:27:46.075 INFO 16292 --- [nio-2007-exec-1] o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source: file:/C:/Users/ADMINI~1/AppData/Local/Temp/config-repo-2221561102471049379/config-repo/application.yml

他会在我们本地保存一份,这样可以确保说在Git仓库挂了的时候,不影响项目的正常运行,此时如果断网,再次访问http://localhost:2007/application/prod/master,还是可以拿到一样的数据,就是从本地获取的.

客户端配置

服务端搭建好之后,再来看一下客户端是如何使用的

新建工程

新建一个工程,名称是config-client.

引入依赖

项目加到主项目下面,然后引入如下依赖:

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

配置修改

新建配置文件bootstrap.yml,以下配置必须是放到bootstrap.yml中才能生效,内容如下:

1
2
3
4
5
6
7
8
9
10
spring:
application:
name: application
cloud:
config:
profile: dev
label: master
uri: http://localhost:2007/
server:
port: 2008

这里的name对应了配置文件中的application部分,profile对应了profile部分,label对应了label部分,uri则表示配置中心的地址.

测试

配置完成之后创建一个测试的Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@RestController
@RefreshScope
public class TestController {

@Value("${sang}")
private String sang;

@Autowired
private Environment env;

@Autowired
private Constants constants;

@RequestMapping("test1")
public String test1(){
return sang;
}

@RequestMapping("test2")
public String test2(){
return env.getProperty("sang", "未定义");
}

@RequestMapping("test3")
public String test3(){
return constants.getSang();
}
}

这里一共有三种方式去获取配置文件中的值,第一种直接注入,第二种就是用Environment,第三种是用@ConfigurationProperties来获取的, Constants类的内容如下:

1
2
3
4
5
6
7
8
@ConfigurationProperties
@Configuration
@Data
public class Constants {

private String sang;

}

然后再启动类再加上@EnableConfigurationProperties注解就好了.

最后,访问http://localhost:2008/test3,结果如下:
image

这里还有一个要注意的,就是@RefreshScope这个注解, 我们的配置文件放在git中,如果修改掉以后,客户端是感知不到的,加上这个注解,另外引入actuator的依赖,就可以获取到配置文件中最新的值,不加的话获取到的可能还是原来的值.