Spring Cloud Config配置刷新问题解决方法总结。
spring-cloud-bus项目结构
spring-cloud-bus是用来实现服务间异步通信的服务总线,有基于kafka和rabbitmq的两个实现。
kafka和rabbitmq的消息处理逻辑本身也被抽象成了spring-cloud-stream,所以就有了上图中的依赖结构
spring-cloud-config-monitor一个通过spring-cloud-bus实现配置实时更新的依赖库。
spring-cloud-config-monitor架构
monitor一般是作为config-server的一个依赖库放在config-server上,这个库里提供了一个PropertyPathEndpoint的Controller接口。流程大致如下:
1、使用者在gitlab上修改并提交配置
2、gitlab在收到新的push后,把调用预先配置的webhook接口。这个webhook接口一般就是monitor提供的http接口。通过这个接口把git的push事件发送给monitor。
3、monitor收到事件后,解析事件中修改的文件,广播一个RefreshRemoteApplicationEvent事件到eventbus。这个事件有三个字段。
public abstract class RemoteApplicationEvent extends ApplicationEvent {
private static final Object TRANSIENT_SOURCE = new Object();
// 事件由哪个服务发送的
private final String originService;
// 事件发送给哪个服务,支持"**"的通配符,表示所有服务都接受这个事件
private final String destinationService;
// 事件ID
private final String id;
...
}
4、所有依赖了eventbus的服务会收到这个Refresh事件,根据事件中的destinationService字段判断,这个事件是否需要处理,如果匹配成功,会由RefreshListener接受并处理这个事件。
5、RefreshListener中会调用ContextRefresher,拉取最新的配置,并更新Environment,重建所有加了@RefreshScope注解的Bean。
SpringBus的几个配置
spring:
cloud:
bus:
enabled: true
refresh:
enabled: true
env:
enabled: true
ack:
enabled: true
trace:
enabled: false
1、refresh代表是否要接受远程EventBus发送过来的RefreshRemoteApplicationEvent事件。事件由RefreshListener处理。处理过程中,会从config-server拉取最新配置,并发送EnvironmentChangeEvent通知ConfigurationPropertiesRebinder刷新配置Bean
2、env是用来刷新部分配置的,事件里面要提供刷新的name和value值。
3、ack是收到EventBus远程发来的事件后,是否返回确认事件。
4、trace是用来记录这些事件的,目前SpringCloud没有实现,只是打了debug日志。但是SpringCloud提供了HttpTraceRepository接口,后期可能会扩展。
存在的问题
1、如果config-server存在多个实例,webhook没办法广播到多个config-server实例,config-server本地备份的git仓库如何更新。如果有实例没有更新,就会导致第5步,拉取不到最新的配置。
2、gitlab中通常只配置一个webhook,测试、预发、生产环境的config-server怎么能都收到这个配置进行仓库的更新。
解决方案一
1、首先mq必须全局共享,开发、测试、预发、生产都用同一套mq
2、gitlab中配置的webhook是生产环境的config-server,收到push事件后,根据修改的文件提取出来环境和应用,通知对应环境的config-server更新git仓库
3、对应环境的config-server更新git仓库完成后,需要返回响应,响应中需要带上该环境下其他的config-server实例的信息(这个信息可以从eureka中获取,eureka是环境隔离的)。
4、需要等其他的config-server都更新完成后,再推送Refresh事件到其他需要更新配置的服务,这个时候能保证所有的服务拉到的配置都是最新的
解决方案二
1、gitlab中配置多个环境的webhook,这要求各环境的config-server域名区分开
2、webhook调用接口后,config-server检查更新的文件是否涉及当前环境,如果没有不需要做任何处理,相反如果涉及当前环境执行第3步
3、发送事件给当前环境的所有config-server实例,更新完成后返回确认
4、收到所有的确认后再由config-server发送Refresh事件到需要更新配置的服务
声明:本文部分素材转载自互联网,如有侵权立即删除 。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
暂无评论内容