和Spring Cloud Config一样,我们接下来要聊的Spring Cloud Bus也是微服务架构系统中的必备组件。Spring Cloud Bus可以将分布式系统的节点与轻量级消息代理链接,然后可以实现广播状态更改(例如配置更改)或广播其他管理指令。Spring Cloud Bus就像一个分布式执行器,用于扩展的Spring Boot应用程序,但也可以用作应用程序之间的通信通道。那么这里就涉及到了消息代理,目前流行的消息代理中间件有不少,Spring Cloud Bus支持RabbitMQ和Kafka,本文我们主要来看看RabbitMQ的基本使用。
本文是Spring Cloud系列的第二十六篇文章,了解前二十五篇文章内容有助于更好的理解本文:
1. 使用Spring Cloud搭建服务注册中心
2. 使用Spring Cloud搭建高可用服务注册中心
3. Spring Cloud中服务的发现与消费
4. Eureka中的核心概念
5. 什么是客户端负载均衡
6. Spring RestTemplate中几种常见的请求方式
7. RestTemplate的逆袭之路,从发送请求到负载均衡
8. Spring Cloud中负载均衡器概览
9. Spring Cloud中的负载均衡策略
10. Spring Cloud中的断路器Hystrix
11. Spring Cloud自定义Hystrix请求命令
12. Spring Cloud中Hystrix的服务降级与异常处理
13. Spring Cloud中Hystrix的请求缓存
14. Spring Cloud中Hystrix的请求合并
15. Spring Cloud中Hystrix仪表盘与Turbine集群监控
16. Spring Cloud中声明式服务调用Feign
17. Spring Cloud中Feign的继承特性
18. Spring Cloud中Feign配置详解
19. Spring Cloud中的API网关服务Zuul
20. Spring Cloud Zuul中路由配置细节
21. Spring Cloud Zuul中异常处理细节
22. 分布式配置中心Spring Cloud Config初窥
23. Spring Cloud Config服务端配置细节(一)
24. Spring Cloud Config服务端配置细节(二)之加密解密
25. Spring Cloud Config客户端配置细节
RabbitMQ是用Erlang语言编写的,因此安装RabbitMQ之前我们要先安装Erlang环境,首先去 http://www.erlang.org/downloads 地址下载erlang,下载到的是一个exe文件,直接双击安装即可,然后去 http://www.rabbitmq.com/download.html 地址下载RabbitMQ,下载成功之后,也是一个exe,双击安装即可(我在网上看到有人说安装目录不能有空格,我自己的软件安装目录都是没有空格的,所以没去验证这句话真假,小伙伴们注意下别掉坑里了)。RabbitMQ安装成功之后,默认会创建系统服务,将和Windows系统一起启动。所以安装成功之后,打开系统服务,我们如果看到如下结果表示安装成功了:
安装成功之后,我们可以使用web来管理我们的RabbitMQ,管理之前需要我们先开启web管理功能,开启方式:进入到安装目录的sbin目录下,然后执行 ./rabbitmq-plugins enable rabbitmq_management命令,如下:
执行成功之后,打开浏览器,输入 http://localhost:15672 进入到web管理页面,需要先登录,默认用户名密码都是guest,web管理页面如下:
这个管理页面涉及到的信息面板比较多,我们后面在用到的时候都会给小伙伴们一一介绍,好了,登录成功之后,我们可以先尝试创建一个用户,创建用户页面如下:
输入用户名密码就可以创建了,tags表示用户标签,相当于角色,可选值有management、none、policymaker、monitoring和administrator,不同取值所对应的权限区别如下:
1.不能访问 management plugin
用户可以通过AMQP做的任何事外加:
1.列出自己可以通过AMQP登入的virtual hosts
2.查看自己的virtual hosts中的queues, exchanges 和 bindings
3.查看和关闭自己的channels 和 connections
4.查看有关自己的virtual hosts的“全局”的统计信息,包含其他用户在这些virtual hosts中的活动
management可以做的任何事外加:
1.查看、创建和删除自己的virtual hosts所属的policies和parameters
management可以做的任何事外加:
1.列出所有virtual hosts,包括他们不能登录的virtual hosts
2.查看其他用户的connections和channels
3.查看节点级别的数据如clustering和memory使用情况
4.查看真正的关于所有virtual hosts的全局的统计信息
policymaker和monitoring可以做的任何事外加:
1.创建和删除virtual hosts
2.查看、创建和删除users
3.查看创建和删除permissions
4.关闭其他用户的connections
OK,我这里就自己创建一个sang用户一会使用(当然不创建也可以,不创建就直接使用默认的guest用户),sang用户创建好之后,点击用户名,给用户设置virtual hosts,否则一会使用这个用户的时候会报错。设置方式如下:
OK,配置完成后,接下来我们来看一个Spring Boot和RabbitMQ整合的案例,来对RabbitMQ做进一步的了解。
整合案例是非常简单的。
首先我们来创建一个普通的Spring Boot工程,然后添加如下依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
接下来在application.properties中配置RabbitMQ的连接信息,如下:
spring.application.name=rabbitmq-hello spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=sang spring.rabbitmq.password=123456 server.port=2009
这里我们分别配置了RabbitMQ的地址为localhost,端口为5672(注意这里没写错,web管理端端口是15672),用户名和密码则是我们刚刚创建出来的(也可以使用默认的guest)。
发送消息我们有一个现成的封装好的对象AmqpTemplate,通过AmqpTemplate我们可以直接向某一个消息队列发送消息,消息生产者的定义方式如下:
@Component public class Sender { @Autowired private AmqpTemplate rabbitTemplate; public void send() { String msg = "hello rabbitmq:"+new Date(); System.out.println("Sender:"+msg); this.rabbitTemplate.convertAndSend("hello", msg); } }
注入AmqpTemplate,然后利用AmqpTemplate向一个名为hello的消息队列中发送消息。
@Component @RabbitListener(queues = "hello") public class Receiver { @RabbitHandler public void process(String msg) { System.out.println("Receiver:"+msg); } }
@RabbitListener(queues = “hello”)注解表示该消息消费者监听hello这个消息队列,@RabbitHandler注解则表示process方法是用来处理接收到的消息的,我们这里收到消息后直接打印即可。
@Configuration public class RabbitConfig { @Bean public Queue helloQueue() { return new Queue("hello"); } }
创建一个名为hello的消息队列。
创建单元测试类,用来发送消息,如下:
@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = RabbitmqHelloApplication.class) public class RabbitmqHelloApplicationTests { @Autowired private Sender sender; @Test public void contextLoads() { sender.send(); } }
上面所有的工作做完后,我们就可以启动我们的Spring Boot工程了,启动成功后,我们可以在启动日志中看到如下内容:
这个表示程序已经创建了一个访问RabbitMQ的连接,此时在RabbitMQ的web管理面板中,我们也可以看到连接信息,如下:
此时运行执行单元测试发送发送一条消息,我们可以在单元测试执行的控制台看到如下日志,表示消息已经发送出去了:
然后在程序运行的控制台也可以看到如下日志,表示消息已经接收到了:
好了,RabbitMQ我们就先介绍到这里,有问题欢迎小伙伴们留言讨论。
参考资料:
1.《Spring Cloud实战》
更多JavaEE资料请关注公众号: