深入学习消息中间件 -- 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文件。具体操作如下:

 

 

好了,上述操作可能会报出一个警告,这里我们先不用管,我们继续在源码路径下执行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文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.wcan.rabbitmq</groupId>
    <artifactId>rabbitmq-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>rabbitmq-demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

 

接着我们在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的环境搭建以及入门小案例就给大家先介绍到这里了。 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值