Spring Cloud Config2.2.1版本使用webhooks无法刷新client配置

一、问题描述:

在整合使用SpringCloud Bus和SpringCloud Config配合github的WebHooks实现自动更新配置时发现,通过config手动访问/actuator/bus-refresh可以正常刷新,但是通过配置webhooks访问/monitor无法却无法刷新配置。

二、错误排查:

1.首先检查是否正确引入依赖。

如果你没有引入这个依赖,自然是无法通过访问/monitor来实现配置的自动刷新的。

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

2.检查ConfigServer端是否正确接收到webHooks发出的请求。

我们先去修改下我们git仓库的配置文件,然后观察我们的ConfigServer的日志,
可以看到Refresh for: order:dev,说明接收到webHooks的访问了。
日志
为了进一步验证,我们再去看下rabbitmq,这里确认确实有消息。
在这里插入图片描述
如果以上都没问题,尝试刷是否可以刷新配置,如果还是不可以刷新配置,请继续往下看。
但是基本可以确认我们的ConfigServer是没有问题的,接下来按照正常逻辑,我们应该去检查我们的Client。

3、检查Client的寻址匹配。

首先将我们的日志级别改成debug,在yml配置文件中填入如下配置即可。

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

配置后,重启应用,再次修改git仓库的配置文件,然后观察Client的日志。这时候,我们能看到,控制台打印出了匹配规则和待匹配的字符串。
匹配规则:order:dev:**,待匹配字符串order:8081:xx,这明显不一致嘛,我是8081,你是dev,匹配都匹配不上,我怎么能确定你刷新的是我的配置而不是别的Client别的应用需要的配置呢?这里发现了问题。
那如何解决呢?
在这里插入图片描述
众所周知,spring的文档是十分全面的,你可能遇到的问题,文档中可以说几乎都有覆盖说明。这也是开发中必须要学会的一个技能,看文档。
spring-cloud-bus文档:https://cloud.spring.io/spring-cloud-bus/reference/html/
在这里插入图片描述
我们可以看到,这段关于地址的描述。
应用有一个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,否则给一个随机值

控制台会打印出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以及下面的profile要与你自己的配置对应好!不要完全复制下面内容。

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}

查看结果:

修改完配置后,重新启动Client,然后继续观察匹配的日志。
匹配日志这时候我们看到匹配的规则和待匹配字符串已经相符。
测试配置也已经完成了刷新~。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Evan Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值