本文作者:陈刚,叩丁狼高级讲师。原创文章,转载请注明出处。
一.什么是消息总线
在微服务架构中,为了更方便的向微服务实例广播消息,我们通常会构建一个消息中心,让所有的服务实例都连接上来,而该消息中心所发布的消息都会被微服务实例监听和消费,我们把这种机制叫做消息总线(SpringCloud Bus),在总线上的每个服务实例都可以去广播一些让其他服务知道的消息,消息总线可以为微服务做监控,或实现应用之间的通信,和其他的一些管理工作,SpringCloud Bus可选的消息组件包括RabbitMQ,Kafka等,本章节讲述使用 RabbitMQ 作为Spring Cloud的消息组件实现刷新更改微服务的配置文件。
二.为什么要用SpringCloud Bus刷新配置
例如有成十上百个微服务实例,当更改配置时,需要重启多个微服务实例,会非常麻烦。SpringCloud Bus 就能让这个过程变得非常简单,当我们Git仓库中的配置更改不后,只需要某个微服务实例发送一个POST请求,通过消息组件通知其他微服务实例重新获取配置文件,以达到配置的自动刷新效果。实现原理如下:
1.本章节基于第十章“配置中心”的基础上进行修改,给 config-client应用添加SpringCloud Bus相关依赖 spring-cloud-starter-bus-amqp和 spring-boot-starter-actuator
```<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
>2.搭建RabbitMQ服务,不会使用 RabbitMQ 的同学请先百度一下,RabbitMQ使用非常简单(体现你们自学能力的时候到了)
>3.修改配置文件 bootstrap.properties,增加RabbitMQ连接配置
分支
spring.cloud.config.label=master
dev开发环境配置文件 dev开发环境配置文件 ,test测试环境,pro正式环境
spring.cloud.config.profile=dev
spring.cloud.config.name=config-client
配置服务地址
spring.cloud.config.uri=http://localhost:5555/
增加 rabbitmq相关配置
spring.rabbitmq.host=localhost #mq连接地址
spring.rabbitmq.port=5672 #mq端口
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.cloud.bus.enabled=true #开启 bus
spring.cloud.bus.trace.enabled=true
management.endpoints.web.exposure.include=bus-refresh #暴露刷新地址,完整访问路径: xxx/actuator/bus-refresh
>4.在要属性的配置的配置类上打上 标签@RefreshScope,否则不能自动刷新
@RestController
@RefreshScope
public class HelloController {
@Value("${notify}") //从远程配置中取值
private String notify;
@RequestMapping("/hello")
public String hello(){
return notify;
}
}
```
5.启动 config-server ,再启动 config-client ,你可以从控制台看到
说明RabbitMQ配置起效了访问 config-client :http://localhost:7777/hello ,可以看到响应内容为 “You are successful for dev” ,接下来修改 Git中的配置 config-client-dev.properties中的 notify为 :6.请求配置刷新地址,使用post请求 :http://localhost:7777/actuator/bus-refresh ,如我这里使用了postman进行测试:,观察控制台会出现变化,说明刷新的新的配置
再次访问http://localhost:7777/hello你可以看到
“You are successful for dev hai bus test” ,已经发生变化,说明我们从 git中获取的配置属性值已经被刷新