一、配置中心
先来一张流程图:
Spring Cloud Bus 如何触发 Refresh?
注:配置中心里我是配置的mq发送消息
-
RefreshBusEndpoint中加了@Endpoint(
id = "bus-refresh"
)注解,他就会监控这个/actuator/bus-refresh这个路径 -
这个事件发布过程中会使用到ApplicationListenerMethodAdapter来处理,部分代码如下:
protected Object doInvoke(Object... args) {
Object bean = getTargetBean();
ReflectionUtils.makeAccessible(this.method);
try {
//反射执行的方法是BusAutoConfiguration#acceptLocal()
return this.method.invoke(bean,args);
}
- 反射执行方法会发送mq消息,然后由各个配置中心客户端接收,接受方法为BusAutoConfiguration#acceptRemote
- 这个方法会发布RefreshRemoteApplicationEvent事件
- 这个事件由RefreshListener负责接收,然后去处理刷新配置
public void onApplicationEvent(RefreshRemoteApplicationEvent event) {
Set<String> keys = this.contextRefresher.refresh();
log.info("Received remote refresh request. Keys refreshed " + keys);
}
public synchronized Set<String> refresh() {
Set<String> keys = refreshEnvironment();
////对应的bean刷新
this.scope.refreshAll();
return keys;
}
- 先看 refreshEnvironment()方法
public synchronized Set<String> refreshEnvironment() {
//获取之前的配置
Map<String,Object> before = extract(
this.context.getEnvironment().getPropertySources());
//重新创建一个SpringApplication并获取新的配置
addConfigFilesToEnvironment();
//比较配置不同的key
Set<String> keys = changes(before,extract(this.context.getEnvironment().getPropertySources())).keySet();
//发布配置改变事件
this.context.publishEvent(new EnvironmentChangeEvent(context,keys));
return keys;
}
@ManagedOperation
public void rebind() {
this.errors.clear();
for (String name : this.beans.getBeanNames()) {
//初始化bean
rebind(name);
}
}
public void refreshAll() {
//销毁bean
super.destroy();
this.context.publishEvent(new RefreshScopeRefreshedEvent());
}
-
@H_472_14@RefreshScopeRefreshedEvent事件由EurekaClientConfigurationRefresher监听,进行对eureka服务器重连的操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。