talk is cheep, show your the code
废话不多说,直接开干
本文基于 2.1.1版本
github地址
例如我们目前将配置放在了github上的这个目录下
Server端
pom.xml
需要添加一个依赖,一般我们配置中心和注册中心可以放在一起,因此我就和eureka注册服务器一起了
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
server的application.yml
导入了jar包,按照spring的尿性,当然是要继续写配置信息了
server:
port: 8761
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: service-center
cloud:
config:
server:
git:
uri: # 你的git地址
# git账号
username: '你的账号'
# git密码
password: '你的密码'
# 默认从master分支读取配置文件
default-label: develop # for test
# 配置文件的路径,因为我项目的根目录是 my-demo,因此这里查询的路径就是 m.../conf-repo, 可以配置多个,按逗号分割
search-paths: microservice/conf-repo #
配置文件
关于配置文件,必须按照约定的命名, 就是 {application}-{profile}.properties
或 {application}-{profile}.yml
,不这么命名的话,是没法后面被加载到的
例如我创建的文件名为 demo-dev.properties,里面的内容为
version=1
name=demo
测试Server
spring cloud config会将文件生成对应的接口,
明显看出接口是按照 {application}/{profile} 这样的方式来自动生成的
官方文档表明有以下几种
- /{application}/{profile}[/{label}]
- /{application}-{profile}.yml
- /{label}/{application}-{profile}.yml
- /{application}-{profile}.properties
- /{label}/{application}-{profile}.properties
client端
pom.xml
需要导入一个jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
添加配置文件,不是application.yml
spring cloud config 通过bootstrap.yml 中的内容来对配置文件进行读取
spring:
cloud:
config:
discovery:
enabled: true
# 对应配置中心的 spring.application.name
service-id: service-center
# name 表示配置文件的 {application} 部分
name: demo
# profile 表示配置文件的 {profile}部分
profile: dev
# label 表示 git上的分支
label: develop
# uri 表示 访问配置中心的uri
uri: http://localhost:8761/
测试的controller
@RestController
public class ConfigClientController {
@Value("${version}")
private String v;
@GetMapping("/get")
public String get(){
return this.v;
}
}
测试client
启动,然后发送http请求 http://localhost:8989/get
读取多个配置文件
我们的配置文件可能需要读取的不止一个,那么要怎么配置呢,查看了官方文档以后,配置的方式如下
我们添加一个属性 demo-prod.properties
spring:
profiles:
active: dev,prod # 添加这个属性可以读取多个文件
cloud:
config:
discovery:
enabled: true
service-id: service-center
# name 表示配置文件的 {application} 部分
name: demo
# profile 表示配置文件的 {profile}部分
# profile: dev
# label 表示 git上的分支
label: develop
# uri 表示 访问配置中心的uri
uri: http://localhost:8761/
相应的,controller的代码也需要进行修改
@RestController
public class ConfigClientController {
@Value("${version}")
private String v;
@Value("${namespace}")
private String ns;
@GetMapping("/get")
public String get(){
return this.v;
}
@GetMapping("/namespace")
public String getNs(){
return this.ns; // 应该得到 demo
}
}
配置更新
spring cloud config 能够监听github上配置的变化,但它不会进行进行变化的通知,而是需要client自己主动的进行pull的操作,将配置更新
这里就需要引入 spring-cloud-starter-actuator
了。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
在 application.yml
中添加配置属性,将更新的接口暴露出来
management:
endpoints:
web:
exposure:
include: refresh
在我们希望能够进行配置更新的地方,添加注解 @RefreshScope
@RestController
@RefreshScope
public class ConfigClientController {
@Value("${version}")
private String v;
@Value("${namespace}")
private String ns;
@GetMapping("/get")
public String get(){
return this.v;
}
@GetMapping("/namespace")
public String getNs(){
return this.ns;
}
}
到此,我们的准备工作就好了,然后启动,访问/get
接口,然后修改配置文件,再访问的时候还是旧的值,这个时候使用工具进行post的调用
刷新结束后,再次访问
在github上可以通过配置webhook的方式,当有新的push操作时,让github去调用 client的refresh接口
这个方案在client数量较少是还可以,但数量一多,并且每次新增机器都需要修改webhook,显然不够智能,因此后面就需要考虑使用 spring-cloud-bus来进行解决了