Spring Cloud Config
- 概述
- Config服务端配置与测试
- Config客户端配置与测试
- Config客户端之动态刷新
文章目录
- Spring Cloud Config
- 概述
- 分布式系统面临的配置问题
- 是什么
- 能干嘛
- 与GitHub整合配置
- Config服务端配置与测试
- Config客户端配置与测试
- Config客户端之动态刷新
- 动态刷新
概述
分布式系统面临的配置问题
是什么
能干嘛
- 集中管理配置文件
- 不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release
- 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心同意拉取配置自己的信息
- 当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的领域
- 将配置信息以REST接口的形式暴露
与GitHub整合配置
由于Spring Config默认使用Git来存储配置文件(也有其他方式,比如支持svn和本地文件),但推荐Git,而且使用的是 http/https 访问的形式
Config服务端配置与测试
- 在GitHub上新建一个名为springcloud-config的新Repository
- 由上一步获得刚新建的git地址
- 本地硬盘目录新建git仓库并clone
- 新建Module模块cloud-config-center-3344,即微服务的配置中心模块CloudConfig Center
- pom
新增:
<!--config-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
- 配置文件
server:
port: 3344
spring:
application:
name: cloud-config-center #注册到eureka微服务名
cloud:
config:
server:
git:
uri: git@github.com:kisshotlirs/springcloud-config.git #git仓库名字
search-paths:
- springcloud-config #搜索目录
label: master #读取分支
#服务注册到eureka
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
- 主启动类
添加注解 @EnableConfigServer - windows下修改hosts文件,增加映射:127.0.0.1 config-3344.com
- 测试通过Config微服务是否可以从GitHub上获取配置内容
- 启动微服务
- 访问 http://config-3344.com:3344/master/config-dev.yml
- 配置读取规则:
- /{label}/{application}-{profile}.yml
实例:master分支:http://config-3344.com:3344/master/config-dev.yml
dev分支:http://config-3344.com:3344/dev/config-dev.yml - /{application}-{profile}.yml
实例:http://config-3344.com:3344/config-dev.yml
- 成功实现了使用SpringCloud Config通过GitHub获取配置信息
Config客户端配置与测试
- 新建 cloud-config-client-3355
- pom
<!--config client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
- bootstrap.yml
配置如下:
server:
port: 3355
spring:
application:
name: config-client
cloud:
config: #config客户端配置
label: main #分支名称
name: config #配置文件名称
profile: dev #读取后缀名称 上述三个综合为 main分支上的config-dev.yml配置文件
uri: http://localhost:3344 #配置文件地址
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
- 主启动类
注册进入服务中心:@EnableEurekaClient - 业务类:
@RestController
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@RequestMapping("/configInfo")
public String getConfigInfo(){
return configInfo;
}
}
- 测试
启动config配置中心 ConfigServer3344 并自测:
启动3355作为Client准备访问:
- 实现了客户端3355 访问config配置中心config-3344 通过github获取配置信息
- 问题出现:分布式配置的动态刷新问题:
- Linux运维修改Github上的配置文件内容做调整
- 刷新3344,发现ConfigServer配置中心立即响应
- 刷新3355,发现ConfigClient客户端没有任何响应
- 3355没有变化除非自己重启或者重新加载
Config客户端之动态刷新
避免每次更新配置都要重启客户端微服务3355
动态刷新
- pom引入actuator服务监控
<!--actuator服务监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 修改yml,暴露监控端口
#暴露监控端点
management:
endpoints:
web:
exposure:
include: "*"
- 业务类Controller修改
添加 @RefreshScope 注解 - 此时修改github上的配置文件,测试3344、3355
- 此时客户端3355并没有动态刷新,需要运维人员发送Post请求刷新客户端3355
必须是post请求:curl -X POST “http://localhost:3355/actuator/refresh” - 再次访问客户端3355,成功实现了客户端3355刷新到最新配置内容,避免了服务重启
还存在的问题:
假设有多个微服务客户端,每个微服务都要执行一次post请求,手动刷新?(可使用脚本)
可否广播,一次通知,处处生效
可否精确通知,选择特定的微服务使其配置生效
上述问题还无法实现,所以需要引入 消息总线,和spring cloud Bus配合