述
随着分布式项目越来越大,就需要将项目的配置文件抽出来单独管理,就需要用到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
16spring:
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的文件夹,然后创建四个配置文件:
四个配置文件的内容分别如下:
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,结果如下:
返回值: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
22019-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
10spring:
application:
name: application
cloud:
config:
profile: dev
label: master
uri: http://localhost:2007/
server:
port: 2008
这里的name对应了配置文件中的application部分,profile对应了profile部分,label对应了label部分,uri则表示配置中心的地址.
测试
配置完成之后创建一个测试的Controller1
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,结果如下:
这里还有一个要注意的,就是@RefreshScope
这个注解, 我们的配置文件放在git中,如果修改掉以后,客户端是感知不到的,加上这个注解,另外引入actuator
的依赖,就可以获取到配置文件中最新的值,不加的话获取到的可能还是原来的值.