乐趣区

Spring-Cloud-Config2x-版本使用webhooks无法刷新client配置的解决方案

前言:本次开发环境为 SpringBoot 2.1.4.RELEASE、SpringCloud Greenwich.SR1、SpringCloudConfig 2.1.1.RELEASE

发现问题

使用 config 手动通过访问 /actuator/bus-refresh 可以正常刷新,但是通过配置 webhooks 访问 /monitor 无法刷新配置。

解决问题

官方文档排查

https://cloud.spring.io/sprin… bus 的文档中对 spring.cloud.bus.id 有如下描述:

应用有一个 ServiceID,默认的值是 app:index:id 的组装。
规则是:

 app:如果 vcap.application.name 存在,使用 vcap.application.name,否则使用 spring.application.name(默认值为 application)index:配置值的情况下优先使用 vcap.application.instance_index,否则依次使用 spring.application.index、local.server.port、server.port(默认值 0)id: 如果 vcap.application.instance_id 存在,使用 vcap.application.instance_id,否则给一个随机值

##### 代码排查
设置客户端的打印日志级别

logging:
  level:
    org.springframework.cloud.bus: debug

控制台会打印出 org.springframework.cloud.bus.DefaultBusPathMatcher 中匹配规则的日志(如果客户端不刷新,一般这里的日志打印出的匹配规则和待匹配字符串是不一致的),webhooks 端的过来匹配规则由三部分数据组成,使用“:”拼接,得到的结果如下:

spring.application.name:spring.cloud.config.profile:**

如果我们 serviceID 不进行设置,当前服务那么会使用默认配置(默认配置代码体现在:org.springframework.cloud.bus.BusEnvironmentPostProcessor#getDefaultServiceId),如下:

private String getDefaultServiceId(ConfigurableEnvironment environment) {return "${vcap.application.name:${spring.application.name:application}}:${vcap.application.instance_index:${spring.application.index:${local.server.port:${server.port:0}}}}:${vcap.application.instance_id:${random.value}}";
    }

对应官方文档,以及我们的配置文件,我们可以依据 serviceID 的匹配规则来设置对应的参数去匹配 webhooks。

如果发现 app:index:id 中的 index 不一致,举例 yml 配置:

vcap:
  application:
    instance_index: ${spring.cloud.config.profile}

或者直接修改 bus.id 的配置,如下:

spring:
  application:
    name: client
  cloud:
    config:
      discovery:
        service-id: CONFIG
        enabled: true
      profile: dev 
    bus:
      id: ${spring.application.name}:${spring.cloud.config.profile}:${random.value}
退出移动版