前几天给大家介绍了一下Redis的基本使用以及主从复制的集群搭建,今天来给大家介绍 一下RabbitMQ的基本使用,首先我们来搭建环境,本次教程是在CentsOS7下搭建,首先准备好虚拟机
打开虚拟机,我们知道RabbitMQ是使用Erlang语言开发的,因此我们在使用RabbitMQ之前必须要安装一个Erlang的环境,这就类似于我们想要运行Java应用,就必须要安装一个Java的运行环境是一样的。首先准备好安装包,如下图所示:
这里我使用的是RabbitMQ的版本是3.7.15,Erlang的版本是22.0。下载地址是:
Erlang下载地址: http://erlang.org/download/otp_src_22.0.tar.gz
RabbitMQ下载地址: https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.15/rabbitmq-server-generic-unix-3.7.15.tar.xz
下载好了之后我们需要先安装Erlang 语言的环境,第一步我们先来安装依赖,这里我们可以使用yum命令进行联网安装:
yum -y install gcc glibc-devel make ncurses-devel openssl-devel xmlto perl wget gtk2-devel binutils-devel
好了,接下来我们来解压Erlang的源码包,这里安装和Redis类似,我们下载下来的Rabbit都是源码,需要编译成可运行的文件在进行安装,好了,第一不我们在/usr/local目录下新建一个Erlang文件夹,用来做指定编译安装后的目录,接着我们使用configure这个文件生成MakeFile文件。具体操作如下:
好了,上述操作可能会报出一个警告,这里我们先不用管,我们继续在源码路径下执行make install命令,进行安装 ,安装完成之后我们在/usr/local/erlang目录下可以看到安装文件,如下图所示:
好了,我们接下来需要配置一下环境变量,我们在/etc/profile文件左后一行追加一行:
接着我们使用source命令是我们刚刚的修改生效。然后在终端输入 erl命令,发现进入了erlang的终端
至此,erlang 的幻剑搭建完毕。接着我们解压RabbitMQ的压缩包,解压之后将其复制到/usr/local/路径下,并且将文件夹的名字修改成RabbitMQ。如下图:
接着我们继续配置一下RabbitMQ的环境变量,在最后一行追加:
好了,修改了之后记得source一下配置文件,让修改生效。
接下来我么就需要启动RabbitMQ了,启动的命令如下所示:
启动之后我们来看一下进程
我们发现已经成功启动了。 接下来我们需要开启web插件,使用以下命令:
rabbitmq-plugins enable rabbitmq_management
然后我们可以通过浏览器来访问web管理控制台了:
如果发现guest用户登陆不上是因为该用户只允许使用localhost地址登录,这里有两种解决办法,第一种就是修改一个配置文件,
将上述配置文件按照下图修改:
然后重启一下服务。我们在继续使用guest账号和密码即可登录成功:
第二种方式是我们新建一个用户,首先我们来看一下所用的用户信息
接着我们添加一个用户,并且设置密码
接下来我们给刚刚配置的用户分配权限,其中我们将默认的虚拟主机“/”所有的权限都分配给该用户。
关于虚拟主机后续在为大家详细的讲解。接着我们查看用户权限以及给用户设置tag
然后我们打开浏览器,用该用户也可以登录进来
好了,关于环境的搭建就先给大家介绍到这里了,接下来我们来我们来说一下RabbitMQ的工作机制。
首先RabbitMQ是一个开源的AMQP的实现,我们在谈到消息队列的时候肯定会想到消息生产者、队列、消息消费者,然而RabbitMQ 在这个基础之上多了一层抽象,在消息生产者和队列之间加了一个交换机(Exchange)的概念,消息生产者和队列之间没有直接联系,消息生产者将消息发给交换机,交换机根据调度策略将消息放入某个消息队列。基本结构图如下图所示:
上图中Broker指的就是一个RabbitMQ进程,该进程包含Exchange和Queue两个部分,其中Exchange 的作用就是按照指定的规则将消息路由转发到消息队列。Exchange主要分为4种,分别是Direct Exchange、TopicExchange、Fanout Exchange以及Headers Exchange。下面分别来看一下这几种 的区别。
Direct Exchange(直连交换机),也是RabbitMQ默认的交换机,特点是需要指定一个明确的Binding key ,只有在Routing key和Binding key 完全匹配的时候,绑定的某个队列才会收到消息。如下图所示:
如上图所示,当Routing key = key4的时候最终消息会被放到Queue4中。
TopicExchange(主题交换机),这种交换机的特点是Binding key 可以使用一个通配符去匹配Routing key.通配符有两个,*表示一个单词,#表示0个或者多个单词,所个单词之间用 . 隔开。例如;Routing_key 是com.key1那么可以和Binding_key是*.key1
进行匹配,或者com.#也行。
Fanout Exchange(广播交换机),这种交换机的特点是与某个队列绑定时不需要指定Routing_key 路由规则是当收到消息的时候,他会将消息发到所有的和该交换机绑定的队列中 ,即便是指定了Routing_key也会被忽略。也即是说(上面那张图)4个队列都可以收到。
Headers Exchange,这种交换机的特点是可以自定义一种匹配的规则,通常是在队列和交换机绑定的时候会设置一个键值对规则,消息中也包含一组键值对(headers 属性),当这些键值有一对或者全部匹配的时候就会将消息发送到该队列中。
除了Exchange和Queue之外还有一个比较重要的概念就是虚拟主机,一个虚拟主机持有一组交换机以及对应绑定的队列,在RabbitMQ中,用户权限控制的粒度就是虚拟主机。在一个Broker中可以有多个虚拟主机(Vhost),可以用作不同用户的权限隔离。
好了,基本的概念就先和大家介绍这么多了,我们下面来试试一个小案例,我们使用SpringBoot整合RabbitMQ做一个小案例。
首先打开Idea,新建一个SpringBoot工程,引入spring-boot-starter-amqp pom文件如下所示:
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.3.0.RELEASE
com.wcan.rabbitmq
rabbitmq-demo
0.0.1-SNAPSHOT
rabbitmq-demo
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-amqp
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
org.springframework.boot
spring-boot-maven-plugin
接着我们在application.properties文件中配置mq的信息,
spring.application.name=rabbitmq-demo
spring.rabbitmq.host=192.168.137.91
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
接着我们创建一个配置类来定义队列
@Configuration
public class QueueConfig {
@Bean
public Queue queue(){
return new Queue("hello");
}
}
接着我们再写一个消息生产者,SpringBoot为我们提供了一个AmqpTemplate。
@Component
public class SendMessage {
@Autowired
private AmqpTemplate rabbitmqTemplate;
public void send(){
String message = "hello ! "+new Date();
System.out.println("send message :"+ message);
rabbitmqTemplate.convertAndSend("hello",message);
}
}
接下来,我们编写一个简单的消息消费者,把消息打印在控制台
@Component
@RabbitListener(queues = "hello")
public class MessageConsumer {
@RabbitHandler
public void receviceMessage(String message){
System.out.println("收到的消息是: "+message);
}
}
我们需要使用 @RabbitListener来指定具体监听的队列,编写完成之后我们再进行编写测试类
@SpringBootTest
class RabbitmqDemoApplicationTests {
@Autowired
private SendMessage sendMessage;
@Test
public void testRabbitmq() throws InterruptedException {
sendMessage.send();
Thread.sleep(1000);
}
}
我们运行的时候据可以看到消息了,
接着我们打开控制后台,发现有一个hello的队列。
好了,关于RabbitMQ的环境搭建以及入门小案例就给大家先介绍到这里了。