Spring Cloud Bus使用轻量级消息代理链接分布式系统的节点。然后,这可以用于广播状态改变(例如,配置改变)或其他管理指令。目前唯一的实现是使用AMQP代理作为传输,但是相同的基本功能集(以及一些更多取决于传输)是其他传输的路线图。
Spring Cloud Bus使用轻量级消息代理链接分布式系统的节点。然后,此代理可用于广播状态更改(例如配置更改)或其他管理指令。一个关键的想法是总线就像一个分布式执行器,用于扩展的Spring Boot应用程序。但是,它也可以用作应用程序之间的通信通道。该项目为AMQP经纪人或Kafka提供启动器作为运输工具。
SpringCloud详细教程 | 第七篇:分布式配置中心(Spring Cloud Config)(Greenwich版本)一文中介绍了 Spring Cloud Config 的使用,已经实现了配置文件的统一管理,但是,每次修改配置文件后,还需要重新启动应用才能加载到修改后的配置文件,这还没有达到我们的目的,我们最终想要的是,修改完配置文件后,不需要重启我们的应用,就可以重新加载到修改后的配置文件,其实 Spring Cloud 已经为我们提供了这样的支持,那就是 Spring Cloud Bus 组件。
Spring Cloud Bus的工作原理是,如果它在类路径上检测到自身,则添加Spring Boot自动配置。要启用总线,请添加spring-cloud-starter-bus-amqp或 spring-cloud-starter-bus-kafka依赖于您的依赖关系管理。Spring Cloud负责其余部分。确保代理(RabbitMQ或Kafka)可用并配置
消息队列的发布订阅模型。让所有为服务来订阅这个事件,当这个事件发生改变了,就可以通知所有微服务去更新它们的内存中的配置信息。这时Bus消息总线就能解决,你只需要在springcloud Config Server端发出refresh,就可以触发所有微服务更新了。如下架构图所示:
本文将讲述RabbitMQ作为工具
按照官方文档,我们只需要在配置文件中配置 spring-cloud-starter-bus-amqp 我们需要装rabbitMQ, 参考我的这篇文章
改造上篇文章的config-client服务 引入依赖
<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>
bootstrap.properties 配置
# rabbitmq配置spring.rabbitmq.host=localhostspring.rabbitmq.port=5672spring.rabbitmq.username=guestspring.rabbitmq.password=guestspring.rabbitmq.virtual-host= /#消息总线配置spring.cloud.bus.enabled=truespring.cloud.bus.trace.enabled=true#暴露bus-refreshmanagement.endpoints.web.exposure.include=bus-refresh
启动类加入注解@RefreshScope 启动刷新功能
package com.li.configclient;
import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.context.config.annotation.RefreshScope;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;
@RefreshScope@RestController@EnableEurekaClient@SpringBootApplicationpublic class ConfigClientApplication {
public static void main(String[] args) { SpringApplication.run(ConfigClientApplication.class, args); }
@Value("${my.name}") String name;
@RequestMapping("/hello") public String hello(){ return name; }}
这样就改动完毕 下面进行测试
依次启动eureka-server, config-server, config-client
打开浏览器访问 http://localhost:8761/ 查看服务注册中心
config-client 服务控制台打印以下信息 说明启动成功
也可以查看 RabbitMQ有没有数据 浏览器访问 http://localhost:15672
发现已经有队列显示 说明是ok的
浏览器访问 http://localhost:8770/hello 获取以下响应
修改github配置信息 修改为lhd 666
现在使用postman工具 post访问 http://localhost:8770/actuator/bus-refresh进行刷新
控制台会更新一些信息
再次访问 http://localhost:8770/hello
搞定 配置更新完毕 不需要重启服务
目前我测试 数据库和Git可以更新 本地不更新
源码下载: https://github.com/LiHaodong888/SpringCloudLearn
未经允许不得转载