文档章节

分布式配置中心优化 - 消息总线(rabbit)

lemos
 lemos
发布于 2017/04/17 12:31
字数 802
阅读 53
收藏 0

原文 参考资料

消息代理中间件可以将消息路由到一个或多个目的地。通过这个可以实现配置文件的实时更新。下面我们来说说Spring Cloud Bus中的具体实现方案。

 

RabbitMQ实现

之前的项目

基于之前的 Spring Cloud Config项目,这个项目有 4个模块

  • eureka-server:注册中心。
  • config-server-eureka:配置了Git仓库,并注册到了Eureka的服务端。
  • config-client-eureka:通过Eureka发现Config Server的客户端,应用名为didispace,用来访问配置服务器以获取配置信息。该应用中提供了一个/from接口,它会获取config-repo/didispace-dev.properties中的from属性返回,端口为 7002。
  • config-client-eureka2:同上,端口为 7003。

 

修改 config-client-eureka 和 config-client-eureka2项目

添加 pom.xml增加spring-cloud-starter-bus-amqp模块(注意spring-boot-starter-actuator模块也是必须的)。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

在配置文件中增加关于RabbitMQ的连接和用户信息

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=username
spring.rabbitmq.password=password

测试

首先,分别访问两个 config-client-eureka的/from请求(http://localhost:7002/from 和
http://localhost:7003/from),返回当前config-repo/didispace-dev.properties中的from属性。

接着,我们修改config-repo/didispace-dev.properties中的from属性值

访问刚才的两个请求页面,没有变化。

接下来,发送POST请求到其中的一个/bus/refresh

curl -X POST http://localhost:7002/bus/refresh

最后,再次访问(http://localhost:7002/from 和
http://localhost:7003/from)。两个页面都返回了最新的config-repo/didispace-dev.properties中的from属性。

其中,从Git仓库中配置的修改到发起/bus/refresh的POST请求这一步可以通过Git仓库的Web Hook来自动触发。由于所有连接到消息总线上的应用都会接受到更新请求,所以在Web Hook中就不需要维护所有节点内容来进行更新,从而解决了通过Web Hook来逐个进行刷新的问题。

借助Git仓库的WebHook,我们就可轻松实现配置的自动刷新(指定 刷新地址)。如图所示

局部刷新

Spring Cloud Bus对特定配置刷新也有很好的支持:/bus/refresh接口还提供了destination参数,用来定位具体要刷新的应用程序。比如,我们可以请求/bus/refresh?destination=customers:9000,此时总线上的各应用实例会根据destination属性的值来判断是否为自己的实例名,若符合才进行配置刷新,若不符合就忽略该消息。

destination参数除了可以定位具体的实例之外,还可以用来定位具体的服务。定位服务的原理是通过使用Spring的PathMatecher(路径匹配)来实现,比如:/bus/refresh?destination=customers:**,该请求会触发customers服务的所有实例进行刷新。

 

架构优化

有时我们希望通过直接请求 config server 来更新相关配置 

配置

config-server 也添加 Spring Cloud Bus

pom

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

prop

## rabbitMQ
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=username
spring.rabbitmq.password=password

这样,就将其添加到消息总线中了。

测试

#全栈刷新
curl -X POST http://localhost:7001/bus/refresh
#局部刷新
curl -X POST http://localhost:7001/bus/refresh?destination=didispace:7002

© 著作权归作者所有

lemos
粉丝 10
博文 208
码字总数 99924
作品 0
芜湖
后端工程师
私信 提问
RabbitMQ学习之spring配置文件rabbit标签的使用

下面我们通过一个实例看一下rabbit的使用。 1.实现一个消息监听器ReceiveMessageListener.java [java] view plain copy package org.springframework.amqp.core; /** * Listener interface ......

onedotdot
2018/05/12
128
0
(十七) 整合spring cloud云架构 -消息驱动 Spring Cloud Stream

在使用spring cloud云架构的时候,我们不得不使用Spring cloud Stream,因为消息中间件的使用在项目中无处不在,我们公司后面做了娱乐方面的APP,在使用spring cloud做架构的时候,其中消息的...

itcloud
2018/08/28
105
0
并发请求rabbitmq之后增加的channel显示no customers

spring和rabbitmq结合,rabbitmq有个channel的缓存,默认好像是25,生产者和消费者都配好后默认会创建一个channel,在并发以后又会自动增加channel,但是这些增加的channel都显示no customer...

malie0
2017/05/16
489
1
RabbitMQ及Spring集成

部分转载自https://blog.csdn.net/whoamiyang/article/details/54954780 1.背景 RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现。 2.应用场景 2.1异步处理 场景说明:...

sun_tantan
2018/04/20
0
0
rabbitmq和spring整合后发送消息失败,一直报java.util.concurrent.TimeoutException

在做spring和rabbitmq整合后,一直不能发送和接受消息。可以确定的是,rabbitmq server配置没问题,因为,如果rabbitmq不和spring整合,rabbitmq可以正常的发送和接受消息。 我的配置如下和代...

梦蝶飘雪
2016/09/27
18.5K
1

没有更多内容

加载失败,请刷新页面

加载更多

堆”和“栈

C++作为一款C语言的升级版本,具有非常强大的功能。它不但能够支持各种程序设计风格,而且还具有C语言的所有功能。我们在这里为大家介绍的是其中一个比较重要的内容,C++内存区域的基本介绍。...

SibylY
19分钟前
2
0
总结:Https

一、介绍 简单理解,https即在http协议的基础上,增加了SSL协议,保障数据传输的安全性。 它由以前的http—–>tcp,改为http——>SSL—–>tcp;https采用了共享密钥加密+公开密钥加密的方式 ...

浮躁的码农
22分钟前
2
0
数据库表与表之间的一对一、一对多、多对多关系

表1 foreign key 表2 多对一:表 1 的多条记录对应表 2 的一条记录 利用foreign key的原理我们可以制作两张表的多对多,一对一关系 多对多: 表1的多条记录可以对应表2的一条记录 表2的多条记...

Garphy
52分钟前
6
0
MySQL 表崩溃修复

MySQL日志报错 2019-10-19 13:41:51 19916 [ERROR] /usr/local/mysql/bin/mysqld: Table './initread_hss/user_info' is marked as crashed and should be repaired2019-10-19 13:41:51 1......

雁南飞丶
今天
6
0
Error和Exception

1.Error类和Exception类都是继承Throwable类 2.Error(错误)是系统中的错误,程序员是不能改变的和处理的,是在程序编译时出现的错误,只能通过修改程序才能修正。一般是指与虚拟机相关的问...

大瑞清_liurq
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部