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

原文 参考资料

消息代理中间件可以将消息路由到一个或多个目的地。通过这个可以实现配置文件的实时更新。下面我们来说说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属性。

171239_R7IT_3053700.png

171302_nYok_3053700.png

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

134521_pGPX_3053700.png

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

接下来,发送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属性。

171119_yVep_3053700.png

171147_ydEY_3053700.png

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

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

20134215_AuIl.png

局部刷新

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

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

 

架构优化

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

20154902_2Sbc.png

配置

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

转载于:https://my.oschina.net/lemos/blog/880842

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值