刷新配置信息的方式有三种:手动刷新
、半自动刷新
、自动刷新
,其中,半自动刷新
利用的是 spring cloud bus
,自动刷新
利用的是 github、gitee、gitlab 等代码托管网站的 webhooks
手动刷新 源码:https://gitee.com/laiyy0728/spring-cloud/tree/master/spring-cloud-config/spring-cloud-config-refresh
手动刷新的 config server 依然选用示例中的 spring-cloud-config-simple-server
config client 1 2 3 4 5 6 7 8 9 10 11 <dependencies > <dependency > <groupId > org.springframework.cloud</groupId > <artifactId > spring-cloud-config-client</artifactId > </dependency > <dependency > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-security</artifactId > </dependency > </dependencies >
bootstrap.yml
1 2 3 4 5 6 7 spring: cloud: config: label: master uri: http://localhost:9090 name: config-simple profile: dev
application.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 spring: application: name: spring-cloud-config-refresh-client server: port: 9091 management: endpoints: web: exposure: include: '*' endpoint: health: show-details: always
改造 config properties、config controller
1 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 29 30 31 32 33 @Component @RefreshScope public class ConfigInfoProperties { @Value ("${com.laiyy.gitee.config}" ) private String config; public String getConfig () { return config; } public void setConfig (String config) { this .config = config; } } @RestController @RefreshScope public class ConfigController { private final ConfigInfoProperties configInfoProperties; @Autowired public ConfigController (ConfigInfoProperties configInfoProperties) { this .configInfoProperties = configInfoProperties; } @GetMapping (value = "/get-config-info" ) public String getConfigInfo () { return configInfoProperties.getConfig(); } }
验证 访问 http://localhost:9091/get-config-info ,观察返回值为:
1 dev 环境,git 版 spring cloud config
修改 https://gitee.com/laiyy0728/config-repo/blob/master/config-simple/config-simple-dev.yml 的内容为:
1 2 3 4 com: laiyy: gitee: config: dev 环境,git 版 spring cloud config,使用手动刷新。。。
再次访问 http://localhost:9091/get-config-info ,观察返回值仍为:
1 dev 环境,git 版 spring cloud config
这是因为没有进行手动刷新,POST 访问:http://localhost:9091/actuator/refresh ,返回信息如下:
1 2 3 4 [ "config.client.version" , "com.laiyy.gitee.config" ]
控制台输出如下:
1 2 3 Fetching config from server at : http://localhost:9090 Located environment: name=config-simple, profiles=[dev], label=master, version=a04663a171b0d8f552c3d549ad38401bd6873b95, state=null Located property source: CompositePropertySource {name='configService', propertySources=[MapPropertySource {name='configClient'}, MapPropertySource {name='https://gitee.com/laiyy0728/config-repo/config-simple/config-simple-dev.yml'}]}
此时,再次访问 http://localhost:9091/get-config-info ,观察返回值变为:
1 dev 环境,git 版 spring cloud config,使用手动刷新。。。
由此证明,手动刷新成功
半自动刷新 源码:https://gitee.com/laiyy0728/spring-cloud/tree/master/spring-cloud-config/spring-cloud-config-bus
半自动刷新依赖于 Spring Cloud Bus 总线,而 Bus 总线依赖于 RabbitMQ。 Spring Cloud Bus 刷新配置的流程图:
Rabbit MQ 请自行安装启动,在此不做描述
config server bus 1 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 <dependencies > <dependency > <groupId > org.springframework.cloud</groupId > <artifactId > spring-cloud-config-server</artifactId > </dependency > <dependency > <groupId > org.springframework.cloud</groupId > <artifactId > spring-cloud-config-monitor</artifactId > </dependency > <dependency > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-security</artifactId > </dependency > <dependency > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-actuator</artifactId > </dependency > <dependency > <groupId > org.springframework.cloud</groupId > <artifactId > spring-cloud-starter-bus-amqp</artifactId > </dependency > </dependencies >
1 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 spring: cloud: config: server: git: uri: https://gitee.com/laiyy0728/config-repo.git search-paths: config-simple bus: trace: enabled: true application: name: spring-cloud-config-bus-server rabbitmq: host: 192.168 .67 .133 port: 5672 username: guest password: guest server: port: 9090 management: endpoints: web: exposure: include: '*' endpoint: health: show-details: always
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure (HttpSecurity http) throws Exception { http.csrf().disable(); } } @SpringBootApplication @EnableConfigServer public class SpringCloudConfigBusServerApplication { public static void main (String[] args) { SpringApplication.run(SpringCloudConfigBusServerApplication.class, args); } }
config client bus 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <dependencies > <dependency > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-actuator</artifactId > </dependency > <dependency > <groupId > org.springframework.cloud</groupId > <artifactId > spring-cloud-starter-bus-amqp</artifactId > </dependency > <dependency > <groupId > org.springframework.cloud</groupId > <artifactId > spring-cloud-config-client</artifactId > </dependency > <dependency > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-security</artifactId > </dependency > </dependencies >
bootstrap.yml
1 2 3 4 5 6 7 spring: cloud: config: label: master uri: http://localhost:9090 name: config-simple profile: test
application.yml
1 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 spring: cloud: config: server: git: uri: https://gitee.com/laiyy0728/config-repo.git search-paths: config-simple bus: trace: enabled: true application: name: spring-cloud-config-bus-server rabbitmq: host: 192.168 .67 .133 port: 5672 username: guest password: guest server: port: 9090 management: endpoints: web: exposure: include: '*' endpoint: health: show-details: always
其余 Java 类与手动刷新一致。
验证 访问 http://localhost:9095/get-config-info
将 config-simple/config-simple-test.yml
内容修改为
1 2 3 4 com: laiyy: gitee: config: test 环境,git 版 spring cloud config,bus 半自动刷新配置
再次访问 http://localhost:9095/get-config-info ,返回值仍为:
1 test 环境,git 版 spring cloud config
使用 bus 刷新配置,POST 请求 http://localhost:9095/actuator/bus-refresh ,查看控制台输出:
1 2 3 4 5 6 7 Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$7c355e31] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) Fetching config from server at : http://localhost:9090 Located environment: name=config-simple, profiles=[test], label=master, version=45c17b3b2a7918ed7093251f2085641df446e961, state=null Located property source: CompositePropertySource {name='configService', propertySources=[MapPropertySource {name='configClient'}, MapPropertySource {name='https://gitee.com/laiyy0728/config-repo.git/config-simple/config-simple-test.yml'}]} No active profile set, falling back to default profiles: default Started application in 1.108 seconds (JVM running for 264.482) Received remote refresh request. Keys refreshed []
再次访问 http://localhost:9095/get-config-info ,返回值变为:
1 test 环境,git 版 spring cloud config,bus 半自动刷新配置
refresh、bus-refresh 比较 refresh:只能刷新单节点,即:只能刷新指定 ip 的配置信息 bus-refresh:批量刷新,可以刷新订阅了 rabbit queue 的所有节点配置 自动刷新 自动刷新实际上很简单,只需要暴露一个 bus-refresh 节点,并在 config-server 的 git 中,配置 webhook
指向暴露出来的 bus-refresh 节点即可,多个 bus-refresh 节点用英文逗号分隔