文档章节

spring cloud config与bus结合

go4it
 go4it
发布于 2016/12/05 11:13
字数 312
阅读 236
收藏 1

3 月,跳不动了?>>>

##整体流程

输入图片说明

默认gitlab的webhook更新调用config server的/monitor(spring-cloud-config-monitor)触发RefreshRemoteApplicationEvent事件,然后spring cloud bus的StreamListener监听RemoteApplicationEvent,通过mq发布到每个config client,然后client接收RemoteApplicationEvent事件来实现refresh。

##PropertyPathEndpoint/monitor

@RequiredArgsConstructor
@RestController
@RequestMapping(path = "${spring.cloud.config.monitor.endpoint.path:}/monitor")
@CommonsLog
public class PropertyPathEndpoint
		implements ApplicationEventPublisherAware, ApplicationContextAware {

@RequestMapping(method = RequestMethod.POST)
	public Set<String> notifyByPath(@RequestHeader HttpHeaders headers,
			@RequestBody Map<String, Object> request) {
		PropertyPathNotification notification = this.extractor.extract(headers, request);
		if (notification != null) {

			Set<String> services = new LinkedHashSet<>();

			for (String path : notification.getPaths()) {
				services.addAll(guessServiceName(path));
			}
			if (this.applicationEventPublisher != null) {
				for (String service : services) {
					log.info("Refresh for: " + service);
					this.applicationEventPublisher
							.publishEvent(new RefreshRemoteApplicationEvent(this,
									this.contextId, service));
				}
				return services;
			}

		}
		return Collections.emptySet();
	}
}

##MQ接收RefreshRemoteApplicationEvent发布message(BusAutoConfiguration)

@EventListener(classes = RemoteApplicationEvent.class)
	public void acceptLocal(RemoteApplicationEvent event) {
		if (this.serviceMatcher.isFromSelf(event)
				&& !(event instanceof AckRemoteApplicationEvent)) {
			this.cloudBusOutboundChannel.send(MessageBuilder.withPayload(event).build());
		}
	}

##每个client的MQ接收message

@StreamListener(SpringCloudBusClient.INPUT)
	public void acceptRemote(RemoteApplicationEvent event) {
		if (event instanceof AckRemoteApplicationEvent) {
			if (this.bus.getTrace().isEnabled() && !this.serviceMatcher.isFromSelf(event)
					&& this.applicationEventPublisher != null) {
				this.applicationEventPublisher.publishEvent(event);
			}
			// If it's an ACK we are finished processing at this point
			return;
		}
		if (this.serviceMatcher.isForSelf(event)
				&& this.applicationEventPublisher != null) {
			if (!this.serviceMatcher.isFromSelf(event)) {
				this.applicationEventPublisher.publishEvent(event);
			}
			if (this.bus.getAck().isEnabled()) {
				AckRemoteApplicationEvent ack = new AckRemoteApplicationEvent(this,
						this.serviceMatcher.getServiceId(),
						this.bus.getAck().getDestinationService(),
						event.getDestinationService(), event.getId(), event.getClass());
				this.cloudBusOutboundChannel
						.send(MessageBuilder.withPayload(ack).build());
				this.applicationEventPublisher.publishEvent(ack);
			}
		}
		if (this.bus.getTrace().isEnabled() && this.applicationEventPublisher != null) {
			// We are set to register sent events so publish it for local consumption,
			// irrespective of the origin
			this.applicationEventPublisher.publishEvent(new SentApplicationEvent(this,
					event.getOriginService(), event.getDestinationService(),
					event.getId(), event.getClass()));
		}
	}

##本地监听RefreshListener

public class RefreshListener
		implements ApplicationListener<RefreshRemoteApplicationEvent> {

	private static Log log = LogFactory.getLog(RefreshListener.class);

	private ContextRefresher contextRefresher;

	public RefreshListener(ContextRefresher contextRefresher) {
		this.contextRefresher = contextRefresher;
	}

	@Override
	public void onApplicationEvent(RefreshRemoteApplicationEvent event) {
		Set<String> keys = contextRefresher.refresh();
		log.info("Received remote refresh request. Keys refreshed " + keys);
	}
}

##docs

© 著作权归作者所有

go4it
粉丝 93
博文 1290
码字总数 1205712
作品 0
深圳
私信 提问
加载中

评论(0)

【Spring Cloud】分布式必学springcloud(十)——消息总线 SpringCloud Bus

一、前言 在上篇博客中,向大家介绍了Spring Cloud Config ,分布式配置中心。它分成了服务端和客户端,服务端提供配置,客户端读取配置,既可以使用svn,也可以使用git存放配置文件,集中管...

kisscatforever
2018/04/25
0
0
Spring Cloud Config 集成 Spring Cloud Bus 同步远程配置

软件版本: Spring Boot - 2.1.3.RELEASE Spring Cloud - Greenwich.SR1 Spring Cloud Config Server 端 Spring Config Server 端依赖: bootstrap.properties 配置文件配置 : Spring Cloud......

OSC首席混子
2019/04/02
211
0
Spring Cloud 入门教程:聊聊Spring Cloud

一、 Spring Cloud 是什么? Spring Cloud 是将分布式系统中一系列基础框架/工具进行整合的框架。其中包含:服务注册与发现、服务网关、熔断器、配置中心、消息中心、服务链路追踪等等。 Sp...

吴伟祥
2018/12/03
826
0
springcloud(九):配置中心和消息总线(配置中心终结版)

Spring Cloud Bus Spring cloud bus通过轻量消息代理连接各个分布的节点。这会用在广播状态的变化(例如配置变化)或者其他的消息指令。Spring bus的一个核心思想是通过分布式的启动器对spr...

itcloud
2018/11/29
134
1
springCloud(20):统一管理微服务配置-刷新配置

一、使用/refresh端点手动刷新配置 很多场景下,需要在运行期间动态调整配置。如果配置发生了修改,微服务要如何实现配置的刷新呢? 1、复制config-client,重命名为config-client-refresh(...

我爱大金子
2018/07/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

设计模式学习---工厂模式

工厂模式:主要用于实例化对象,把实例化对象代码与使用对象代码分开, 目的是降低系统中代码耦合度,并且增强了系统的扩展性,如果实例化一个对象的过长很复杂,需要一定的代码量,并且多处...

爸爸受不了
23分钟前
11
0
聊聊skywalking的HTTPAccessLog

序 本文主要研究一下skywalking的HTTPAccessLog HTTPAccessLog skywalking-6.6.0/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/HTTPAccessLog.java......

go4it
25分钟前
19
0
Java开发必备之配置类总结

Java开发必备之配置类总结 在我们开发中,有两种非常常见的配置类配置的方式 不过呢,在此之前我带你认识一下一些注解: 认识: 1.@ConfigurationProperties 是什么呢? @ConfigurationPropertie...

煌sir
43分钟前
12
0
2020年一季度总结

2020年一季度总结: 读书篇: 序号 书名 开始时间 结束时间 进度 备注 1 深入理解java虚拟机 2020-1-1 2020-2-15 未完成 215/403 2 Spring实战 2020-2-16 2020-3-15 未完成 100/577 3 java编...

素小暖OSC
45分钟前
15
0
使用Python Flask框架开发项目安装运行环境

1. 安装Anaconda 下载地址:https://www.anaconda.com/download/ 执行 conda list ,查看是否安装成功 2. 安装Flask pip install Flask 3. 安装 flask-sqlalchemy pip install flask-sqlalch......

老查
58分钟前
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部