SpringCloud bus 手动post可用 使用webhooks自动更新配置失效的解决小记

时间:2022-07-22
本文章向大家介绍SpringCloud bus 手动post可用 使用webhooks自动更新配置失效的解决小记,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

先说解决办法:

查阅网上资料发现大家的问题其实都出在少了一个依赖,而不应该手动去拦截。这个依赖加在配置中心上

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-monitor</artifactId>
        </dependency>

在GitHub上创建了一个仓库用来存储配置。

配置中心及消费端要使用消息总线都要添加的依赖:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>

配置中心的配置文件application.yml:

spring:
  application:
    name: config
  cloud:
    config:
      server:
        git:
          uri: https://github.com/37176427/config-repo.git
          username: 
          password: 
          #配置存储目录
          basedir: /fileRoot/config/baseDir
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
management:
  endpoints:
    web:
      exposure:
        include: "*"

client端的配置文件bootstrap.yml:

spring:
  application:
    name: order
  cloud:
    config:
      discovery:
        enabled: true
        service-id: CONFIG
      profile: dev

测试使用的controller,直接输出env变量来观察是否更新了该配置:

@RestController
@RequestMapping("/env")
@RefreshScope
public class EnvController {

    @Value("${env}")
    private String env;

    @GetMapping("/print")
    public String print() {
        return env;
    }
}

项目运行并访问localhost:8081/env/print路径后,成功输出配置文件中的值。

当访问配置中心时 会输出最新的值 因为他去GitHub上拉取文件了

在GitHub上更改了值后,再次访问消费端路径 localhost:8081/env/print,并没有更新为新值,没有同步到最新的配置

发起一个post请求 curl -v -X POST "http://localhost:8080/actuator/bus-refresh" 此时的路径是/actuator/bus-refresh

可以看到配置中心config项目有新打印的日志 访问消费端/env/print后 值更新为最新值。

为了避免每次都要手动发起post请求来更新配置的弊端 使用了GitHub中的webhooks,它可以在每次该仓库有push时,对你设定的url发起一个post请求。

这里设定的路径为 http://外网域名/monitor 这个外网域名可以用natapp免费申请。正常情况下webhooks发起的post请求不应该返回400 404等错误

大多问题出现在这里,网上很多解决方案其实就是将这个post请求进行拦截,然后去调用/actuator/bus-refresh这个之前手动更新配置的路径来规避错误。

加上上述这个依赖后,重启项目,对/monitor路径进行post请求就不会出错了。

再次试验对配置进行更新后,访问消费端,成功读取到了最新的配置值。