集中管理配置文件
不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release
运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心同意拉取配置自己的信息
当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的领域
将配置信息以REST接口的形式暴露
由于Spring Config默认使用Git来存储配置文件(也有其他方式,比如支持svn和本地文件),但推荐Git,而且使用的是 http/https 访问的形式
在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:3344spring: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#读取分支#服务注册到eurekaeureka:client:service-url:defaultZone: http://eureka7001.com:7001/eureka/
主启动类
添加注解 @EnableConfigServer
windows下修改hosts文件,增加映射:127.0.0.1 config-3344.com
测试通过Config微服务是否可以从GitHub上获取配置内容
配置读取规则:
/{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获取配置信息
新建 cloud-config-client-3355
pom
<!--config client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
bootstrap.yml
配置如下:
server:port:3355spring:application:name: config-clientcloud: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
业务类:
@RestControllerpublicclassConfigClientController{@Value("${config.info}")privateString configInfo;@RequestMapping("/configInfo")publicStringgetConfigInfo(){return configInfo;}}
测试
启动config配置中心 ConfigServer3344 并自测:
启动3355作为Client准备访问:
实现了客户端3355 访问config配置中心config-3344 通过github获取配置信息
问题出现:分布式配置的动态刷新问题:
避免每次更新配置都要重启客户端微服务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配合