消息总线Spring Cloud Bus
什么是消息总线?
在微服务架构中,通常会使用轻量级的消息代理来构建一个共用的消息主题来连接各个微服务实例, 它广播的消息会被所有在注册中心的微服务实例监听和消费,也称消息总线。
SpringCloud中也有对应的解决方案,SpringCloud Bus 将分布式的节点用轻量的消息代理连接起来, 可以很容易搭建消息总线,配合SpringCloud config 实现微服务应用配置信息的动态更新。消息代理属于中间件,设计代理的目的就是为了能够从应用程序中传入消息,并执行一些特别的操作。开源产品很多如ActiveMQ、Kafka、RabbitMQ、RocketMQ等 目前springCloud仅支持RabbitMQ和Kafka。
基于RabbitMQ实现
RabbitMQ是消息对列,主要是用于做消息代理。本质上说,它接受来自生产者的信息,并将它们传递给消费者。在两者之间, 它可以根据你给它的路由,缓冲规则有选择地进行传递消息。
1、下载并安装Erlang:
RabbitMQ服务端代码是使用并发式语言Erlang编写的,安装Rabbit MQ的前提是安装Erlang,点击http://www.erlang.org/downloads这里下载;
下载完是一个exe执行文件,双击安装,Erlang在安装时候会检查环境的组件是否其齐全,如果不全会弹出Microsoft Visual C++,Redistributable 可再发行组件包要求用户修复,可以进行修复,不影响安装。
安装完事儿后要记得配置一下系统的环境变量。此电脑–>鼠标右键“属性”–>高级系统设置–>环境变量–>“新建”系统环境变量:
- 变量名:ERLANG_HOME
- 变量值就是刚才erlang的安装地址,点击确定。
然后是Path路径配置:将%ERLANG_HOME%\bin加入到path中。
最后打开命令行输入erl打印eshell版本号即代表安装成功。
2、下载并安装RabbitMQ
点击http://www.rabbitmq.com/download.html下载
双击下载后的.exe文件,安装过程与erlang的安装过程相同。
RabbitMQ安装好后接下来安装RabbitMQ-Plugins。打开命令行,切换到RabbitMQ的sbin目录,然后在后面输入rabbitmq-plugins enable rabbitmq_management命令进行安装。
浏览器访问rabbitmq web界面
访问rabbitmq web界面:浏览器上输入地址:rabbitmq服务器地址:15672。默认管理员账号:guest,密码:guest。
3、 导入pom.xml文件需要的依赖(等待片刻~);
<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>
<groupId>com.cxk.bus</groupId>
<artifactId>sgccplatform-framework-bus</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>sgccplatform-framework-config</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</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-netflix-eureka-client</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>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</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>
</project>
4、在配置文件application.properties中加上RabbitMq的配置;
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.cloud.bus.enabled=true
spring.cloud.bus.trace.enabled=true
management.endpoints.web.exposure.include=bus-refresh
5、启动类BusApplication.java配置:
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@RestController
@RefreshScope
public class BusApplication{
public static void main(String[] args) {
SpringApplication.run(BusApplication.class, args);
}
@Value("${foo}")
String test;
@RequestMapping(value = "/hi")
public String hi(){
return test;
}
}
测试:依次启动eureka-server、confg-cserver,启动两个config-client,端口为:6002、6003。
访问http://localhost:6002/login 或者http://localhost:6003/login 浏览器显示:
这时我们去代码仓库将foo的值改为“foo version 4”,即改变配置文件foo的值。如果是传统的做法,需要重启服务,才能达到配置文件的更新。此时,我们只需要发送post请求:http://localhost:8881/actuator/bus-refresh,你会发现config-client会重新读取配置文件。
这是如果我们再访问便会发现已经改变。