0%

Spring Cloud Bus 配置 Webhooks 不生效(无法请求 "/monitor" )以及客户端配置不刷新

Spring Cloud Config 2.x 中手动通过访问/actuator/bus-refresh可以正常刷新,但是通过配置 webhooks 访问/monitor无法刷新配置

配置 Webhooks 不生效

在 Github 中配置 Webhooks,当配置发生变动时推送到配置中心的/monitor,发现配置中心没有响应,查阅相关资料后,发现需要引入如下依赖包

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-monitor</artifactId>
</dependency>

加入依赖以后,/monitor就可以正常请求了,但下面还有一个坑会导致客户端不会自动刷新。

“/monitor”能正常请求,但客户端配置不刷新

这种情况一般都是因为spring.cloud.bus.id出现了问题,我们先在客户端配置中设置一下日志打印级别:

1
2
3
logging:
level:
org.springframework.cloud.bus: debug

然后重启应用,然后在配置重新中修改配置,发现在客户端出处如下日志:
spring-cloud-bus-webhooks-monitor.png

这段日志相关代码如下

1
2
3
4
5
6
7
8
9
protected boolean matchMultiProfile(String pattern, String idToMatch) {
log.debug("matchMultiProfile : " + pattern + ", " + idToMatch);
// 省略不相关代码 ...
}

public boolean match(String pattern, String path) {
log.debug("In match: " + pattern + ", " + path);
return !this.delagateMatcher.match(pattern, path) ? this.matchMultiProfile(pattern, path) : true;
}

从代码中我们大概能猜到了,就是查看发过来的消息是否属于自己,如果不属于就不处理,然后日志中正则为order:dev:**,待匹配字串为 order:9909:99ca1d69f9845bdeea2518b24ddea9fc这明显是不匹配的,所以客户端没有刷新配置。

查看官方文档关于spring.cloud.bus.id的描述
spring-cloud-bus-webhooks-bus-id.png
可以看到每个应用都有一个Service ID, 默认的值是app:index:id的组装,规则是:

app:如果vcap.application.name存在则使用vcap.application.name,否则使用spring.application.name(默认值为application)
index:优先使用vcap.application.instance_index,否则依次使用spring.application.indexlocal.server.portserver.port0
id: 如果vcap.application.instance_id存在则使用vcap.application.instance_id,否则给一个随机值

从上面的日志中,我们看到是app:index:id中的index不一致,有如下两种修改方法
方法一:设置vcap.application.instance_index

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

方法二:修改bus.id匹配规则

1
2
3
4
5
6
7
8
9
10
11
spring:
application:
name: order
cloud:
config:
discovery:
enabled: true
service-id: config-server
profile: dev
bus:
id: ${spring.application.name}:${spring.cloud.config.profile}:${random.value}

注意spring.application.namespring.cloud.config.profile要提前定义好