上一章节,咱们讲解了分布式配置中心spring cloud config,咱们把配置项存放在git或者本地,当咱们修改配置时,须要从新启动服务才能生效。可是在生产上,一个服务部署了多台机器,从新启动比较麻烦且会短暂影响用户体验。spring cloud生态在发展,确定有对应的解决之法,接下来将要讲解的Spring Cloud Bus就是为了解决这一难题而存在的。html
Spring Cloud Bus(消息总线)经过一个轻量级的消息中间件能够链接分布式系统中的各个节点。使用该总线来广播某些状态的改变(好比配置信息发生变动)或其余管理指令。能够说,消息总线是spring boot应用扩展“道路”上的推动器,并且也把它用来做应用间相互通讯的消息管道。java
1、项目搭建:git
1. 环境准备web
本章仍是基于上一章来实现的,上一章讲解了git和本地配置两种方式,配置刷新原理都是同样的,此次咱们只讲git配置修改后进行刷新。spring
上一章节内容能够参考:一块儿来学Spring Cloud | 第七章:分布式配置中心(Spring Cloud Config)apache
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.haly</groupId> <artifactId>springcloud</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <groupId>com.haly</groupId> <artifactId>springcloud-feign-client</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springcloud-ribbon-client</name> <description>新建一个springcloud项目</description> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>com.haly</groupId> <artifactId>springcloud-config</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <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> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
3. 在springcloud-feign-client模块的application.properties中加上RabbitMq的配置,包括RabbitMq的地址、端口,用户名、密码。并加上spring.cloud.bus的三个配置:浏览器
spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=young spring.rabbitmq.password=young spring.cloud.bus.enabled=true spring.cloud.bus.trace.enabled=true management.endpoints.web.exposure.include=bus-refresh
4. springcloud-feign-client模块的启动类上加上注解:@RefreshScopeapp
package com.haly; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication @EnableFeignClients @EnableDiscoveryClient @RefreshScope public class SpringcloudFeignClientApplication { public static void main(String[] args) { SpringApplication.run(SpringcloudFeignClientApplication.class, args); } }
5. springcloud-feign-client模块的测试类FeignController,测试上一章节的/testconfig方法,具体内容能够参考:一块儿来学Spring Cloud | 第七章:分布式配置中心(Spring Cloud Config) maven
package com.haly.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.haly.romote.FeignRemoteService; @RestController public class FeignController { @Autowired FeignRemoteService feignRemoteService; @Value("${configword}") String configword; @GetMapping(value = "/getHello") public String getHello(@RequestParam String name) { return feignRemoteService.hello(name); } @GetMapping(value = "/testzuul") public String testzuul(@RequestParam String name) { return name +",这是springcloud-feign-client的服务接口"; } @GetMapping(value = "/testconfig") public String testconfig(@RequestParam String name) { return name +",git配置值:" + configword ; } }
6. 运行项目分布式
启动springcloud-eureka-server,启动springcloud-config-server,启动springcloud-config,最后启动springcloud-feign-client模块
为了测试配置修改,多个服务实例都能更新,就启动两个 springcloud-feign-client 实例,端口分别是9600,9601,sts启动两个实例(端口为9600时启动项目,而后将端口改为9601,再启动项目)。
浏览器输入:http://localhost:9600/testconfig?name=young码农 或者输入 http://localhost:9601/testconfig?name=young码农
页面展现结果:young码农,git配置值:NewConfig !
7. 修改git配置,从新运行项目
这时咱们去代码仓库将configword的值改成“update config”,即改变配置文件configword的值。若是是传统的作法,须要重启服务,才能达到配置文件的更新。
如今,咱们只须要发送post请求:http://localhost:8881/actuator/bus-refresh,你会发现springcloud-feign-client会从新读取配置文件,接着咱们查看页面运行结果。
浏览器输入:http://localhost:9600/testconfig?name=young码农 或者输入 http://localhost:9601/testconfig?name=young码农
页面展现结果:young码农,git配置值:update config !
2、总结:
使用"destination"参数,/actuator/bus-refresh接口能够指定服务,例如 “/actuator/bus-refresh?destination=client:**”, 即刷新服务名为client的全部服务。
经过上面的测试,咱们能够知道当git文件更改的时候,用post 向端口为8882的config-client发送请求/bus/refresh/;此时8882端口会发送一个消息,由消息总线向其余服务传递,从而使整个微服务集群都达到更新配置文件。
引入程序猿DD 画的一张图片,简单理解一下刷新原理:
最后项目目录结构: