深入学习消息中间件 -- CentOS7下RabbitMQ环境搭建以及工作机制详解

        前几天给大家介绍了一下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文件。具体操作如下:

深入学习消息中间件 -- CentOS7下RabbitMQ环境搭建以及工作机制详解_第1张图片

 

 

好了,上述操作可能会报出一个警告,这里我们先不用管,我们继续在源码路径下执行make install命令,进行安装 ,安装完成之后我们在/usr/local/erlang目录下可以看到安装文件,如下图所示:

深入学习消息中间件 -- CentOS7下RabbitMQ环境搭建以及工作机制详解_第2张图片

好了,我们接下来需要配置一下环境变量,我们在/etc/profile文件左后一行追加一行:

深入学习消息中间件 -- CentOS7下RabbitMQ环境搭建以及工作机制详解_第3张图片

接着我们使用source命令是我们刚刚的修改生效。然后在终端输入 erl命令,发现进入了erlang的终端

至此,erlang 的幻剑搭建完毕。接着我们解压RabbitMQ的压缩包,解压之后将其复制到/usr/local/路径下,并且将文件夹的名字修改成RabbitMQ。如下图:

深入学习消息中间件 -- CentOS7下RabbitMQ环境搭建以及工作机制详解_第4张图片

接着我们继续配置一下RabbitMQ的环境变量,在最后一行追加:

深入学习消息中间件 -- CentOS7下RabbitMQ环境搭建以及工作机制详解_第5张图片

好了,修改了之后记得source一下配置文件,让修改生效。

接下来我么就需要启动RabbitMQ了,启动的命令如下所示:

启动之后我们来看一下进程

深入学习消息中间件 -- CentOS7下RabbitMQ环境搭建以及工作机制详解_第6张图片

我们发现已经成功启动了。 接下来我们需要开启web插件,使用以下命令:

rabbitmq-plugins enable rabbitmq_management

然后我们可以通过浏览器来访问web管理控制台了:

深入学习消息中间件 -- CentOS7下RabbitMQ环境搭建以及工作机制详解_第7张图片

如果发现guest用户登陆不上是因为该用户只允许使用localhost地址登录,这里有两种解决办法,第一种就是修改一个配置文件,

深入学习消息中间件 -- CentOS7下RabbitMQ环境搭建以及工作机制详解_第8张图片

将上述配置文件按照下图修改:

深入学习消息中间件 -- CentOS7下RabbitMQ环境搭建以及工作机制详解_第9张图片

然后重启一下服务。我们在继续使用guest账号和密码即可登录成功:

深入学习消息中间件 -- CentOS7下RabbitMQ环境搭建以及工作机制详解_第10张图片

第二种方式是我们新建一个用户,首先我们来看一下所用的用户信息

深入学习消息中间件 -- CentOS7下RabbitMQ环境搭建以及工作机制详解_第11张图片

接着我们添加一个用户,并且设置密码

深入学习消息中间件 -- CentOS7下RabbitMQ环境搭建以及工作机制详解_第12张图片

接下来我们给刚刚配置的用户分配权限,其中我们将默认的虚拟主机“/”所有的权限都分配给该用户。

 

 关于虚拟主机后续在为大家详细的讲解。接着我们查看用户权限以及给用户设置tag 

深入学习消息中间件 -- CentOS7下RabbitMQ环境搭建以及工作机制详解_第13张图片

 

然后我们打开浏览器,用该用户也可以登录进来

深入学习消息中间件 -- CentOS7下RabbitMQ环境搭建以及工作机制详解_第14张图片

 

 好了,关于环境的搭建就先给大家介绍到这里了,接下来我们来我们来说一下RabbitMQ的工作机制。

        首先RabbitMQ是一个开源的AMQP的实现,我们在谈到消息队列的时候肯定会想到消息生产者、队列、消息消费者,然而RabbitMQ 在这个基础之上多了一层抽象,在消息生产者和队列之间加了一个交换机(Exchange)的概念,消息生产者和队列之间没有直接联系,消息生产者将消息发给交换机,交换机根据调度策略将消息放入某个消息队列。基本结构图如下图所示:

深入学习消息中间件 -- CentOS7下RabbitMQ环境搭建以及工作机制详解_第15张图片

      上图中Broker指的就是一个RabbitMQ进程,该进程包含Exchange和Queue两个部分,其中Exchange 的作用就是按照指定的规则将消息路由转发到消息队列。Exchange主要分为4种,分别是Direct Exchange、TopicExchange、Fanout Exchange以及Headers Exchange。下面分别来看一下这几种  的区别。

      Direct Exchange(直连交换机),也是RabbitMQ默认的交换机,特点是需要指定一个明确的Binding key ,只有在Routing key和Binding key 完全匹配的时候,绑定的某个队列才会收到消息。如下图所示:

深入学习消息中间件 -- CentOS7下RabbitMQ环境搭建以及工作机制详解_第16张图片

如上图所示,当Routing key = key4的时候最终消息会被放到Queue4中。 

     TopicExchange(主题交换机),这种交换机的特点是Binding key 可以使用一个通配符去匹配Routing key.通配符有两个,*表示一个单词,#表示0个或者多个单词,所个单词之间用 . 隔开。例如;Routing_key 是com.key1那么可以和Binding_key是*.key1

进行匹配,或者com.#也行。

深入学习消息中间件 -- CentOS7下RabbitMQ环境搭建以及工作机制详解_第17张图片

 

      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);
    }
}

我们运行的时候据可以看到消息了,

深入学习消息中间件 -- CentOS7下RabbitMQ环境搭建以及工作机制详解_第18张图片

 

接着我们打开控制后台,发现有一个hello的队列。 

 

深入学习消息中间件 -- CentOS7下RabbitMQ环境搭建以及工作机制详解_第19张图片

 

好了,关于RabbitMQ的环境搭建以及入门小案例就给大家先介绍到这里了。 

 

 

 

 

 

你可能感兴趣的:(环境搭建)