在之前的SpringCloud - 统一配置中心(一)基础上,我们再升级下,如何让统一配置自动发布更新到各个 yml 上。
Spring Cloud Bus自动更新配置
Spring Cloud Bus自动更新配置原理:SpringCloud Bus可以实现,自动刷新。怎么实现呢,通过消息中间件,config-server用了Bus之后会提供一个/bus-refresh接口,然后webhook可以让git去访问这个接口,访问了这个接口就可以把更改的配置,发送到消息中间件。
开始
Config Server & Config Client(e.g. Order)
1、对于 config server 和 config client 微服务项目中,修改版本,正式版本是不需要修改的:spring boot修改版本为2.0.0.BUILD-SNAPSHOT,因为2.0.0.M3使用springCloud Bus是有bug的,spring cloud修改版本Finchley.BUILD-SNAPSHOT。
2、引入依赖 spring-cloud-starter-bus-amqp,添加刷新并启动config server项目。
3、对于 order 微服务项目,spring-cloud-starter-feign修改版本为spring-cloud-starter-openfeign,升版本后,这个组件叫openfeign了。
4、MQ访问地址:localhost:15672,配置好并重启order和config应用后,RabbitMQ上会出现2个消息队列,如图所示。
# config server spring: application: name: config cloud: config: server: git: uri: https://gitee.com/SpringCloud_Sell/config-repo username: lly835@163.com password: T#27h*E$cg@%}j basedir: /Users/admin/code/myProjects/java/imooc/SpringCloud_Sell/config/basedir eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ management: endpoints: web: expose: "*"
5、另外bus-refresh接口默认不暴露,需要在yaml配置文件中暴露出来。配置好重启后观察控制台日志输出(*号是全部暴露出来的意思)。
package com.imooc.order.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/env") @RefreshScope public class EnvController { @Value("${env}") private String env; @GetMapping("/print") public String print() { return env; } }