Spring Cloud 学习(27) --- Spring Cloud Config(二) 刷新配置

    xiaoxiao2022-07-12  157

    刷新配置信息的方式有三种:手动刷新、半自动刷新、自动刷新,其中,半自动刷新利用的是 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

    <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

    spring: cloud: config: label: master uri: http://localhost:9090 name: config-simple profile: dev

    application.yml

    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

    @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 ,观察返回值为:

    dev 环境,git 版 spring cloud config

    修改 https://gitee.com/laiyy0728/config-repo/blob/master/config-simple/config-simple-dev.yml 的内容为:

    com: laiyy: gitee: config: dev 环境,git 版 spring cloud config,使用手动刷新。。。

    再次访问 http://localhost:9091/get-config-info ,观察返回值仍为:

    dev 环境,git 版 spring cloud config

    这是因为没有进行手动刷新,POST 访问:http://localhost:9091/actuator/refresh ,返回信息如下:

    [ "config.client.version", "com.laiyy.gitee.config" ]

    控制台输出如下:

    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 ,观察返回值变为:

    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 刷新配置的流程图:

     

    Spring Cloud Bus 流程图

    Rabbit MQ 请自行安装启动,在此不做描述

    config server bus

    <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> spring: cloud: config: server: git: uri: https://gitee.com/laiyy0728/config-repo.git search-paths: config-simple bus: trace: enabled: true # 是否启用bus追踪 application: name: spring-cloud-config-bus-server rabbitmq: # rabbit mq 配置 host: 192.168.67.133 port: 5672 username: guest password: guest server: port: 9090 management: endpoints: web: exposure: include: '*' endpoint: health: show-details: always @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

    <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

    spring: cloud: config: label: master uri: http://localhost:9090 name: config-simple profile: test

    application.yml

    spring: cloud: config: server: git: uri: https://gitee.com/laiyy0728/config-repo.git search-paths: config-simple bus: trace: enabled: true # \u662F\u5426\u542F\u7528bus\u8FFD\u8E2A application: name: spring-cloud-config-bus-server rabbitmq: # rabbit mq \u914D\u7F6E 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 Bus

     

    将 config-simple/config-simple-test.yml 内容修改为

    com: laiyy: gitee: config: test 环境,git 版 spring cloud config,bus 半自动刷新配置

    再次访问 http://localhost:9095/get-config-info ,返回值仍为:

    test 环境,git 版 spring cloud config

    使用 bus 刷新配置,POST 请求 http://localhost:9095/actuator/bus-refresh ,查看控制台输出:

    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 ,返回值变为:

    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 节点用英文逗号分隔

    Config webhook

    作者:laiyy0728 链接:https://www.jianshu.com/p/99550377db8f 来源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    最新回复(0)