1

一、前言

上一篇【分布式消息中间件 - 概述】中,我们主要介绍了消息队列(Message Queue,简称MQ)的应用场景和基本原理。MQ是对消息队列(文章中也叫消息中间件)的统称。业界主流的消息中间件主要有:RabbitMQ、ActiveMQ、Kafka、RocketMQ等。为方便学习,本小节主要通过RabbitMQ作为消息队列入门级介绍。

二、纲要

  • RabbitMQ 原理介绍
  • RabbitMQ 安装配置
  • RabbitMQ 入门程序

三、内容

1、RabbitMQ原理介绍

官网:https://www.rabbitmq.com/

RabbitMQ是一个Erlang语言开发的基于AMQP协议的开源实现。主要用来暂存并转发**消息**(Message)。就像一个快递点,可以寄快递,也可以取快递。

其具体特点包括:

  • 支持多种语言
  • 支持多种协议
  • 支持集群部署
  • 支持插件扩展
  • 高可用性
  • ......

其整体架构如图所示:
image.png

基础概念:
Message(消息):由消息头和消息体构成 (快递单)
Publisher(消息生产者):发送消息到交换器 (发快递)
Exchanger(交换器):接收生产者发送的消息并路由给服务器队列(发到哪)
Binding(绑定):连接交换器和消息队列的路由规则(物流路线)
Queue(消息队列):消息容器,用于消息储存和转发给消费者(快递代理点)
Connection(网路连接):如建立一个TCP连接(打联系电话)
Channel(信道):多路复用的虚拟TCP连接。减少操作系统TCP的建立和销毁 (快递小哥打你电话)
Consumer(消息消费者):从队列中获取消息的客户端应用程序(取快递)

我想,把这个消息生产和消费的过程比作生活实例 ( 快递 ) 会更容易理解。官网上的介绍相对简单。而对于开发者来说,可以将它理解为由三部分组成:(请读者仔细研读图中标记红色的部分)
image.png
2、RabbitMQ安装和配置

(1)资料获取

image.png

由于RabbitMQ是基于Erlang语言开发的,因此需要先安装Erlang。为方便使用,(贴心)作者已整理:
Erlang:
链接:https://pan.baidu.com/s/1a3K8hX0AwqKA0npr2nUttg
提取码:9swp
RabbitMq:
链接:https://pan.baidu.com/s/1Jbtj96GaJaGQb0kj2QDXSQ
提取码:1rkv
(2)安装步骤

  • Erlang安装和配置

双击运行otp_win64_23.0.exe文件,
image.png
image.png
3.png
4.png

安装时特别注意:安装路径最好不要采用默认路径,**不要带空格!!!**
  • RabbitMQServer安装和配置

    同上,这里不再赘述。

3、RabbitMQ的入门程序

我们使用Java语言做Demo,模拟消息队列的两端MsgProducer(消息生产者)异步发送消息和MsgConsumer(消息消费者)接收消息。

  • 新建maven工程

image.png

  • 添加依赖
<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
</dependency>
  • 消息生产者 MsgProducer
package com.example.rabbitmq.mqdemo;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class MsgProducer {

    //消息队列命名
    public static final String QUEUE_NAME = "hello";

    public static void main(String[] args) throws Exception{
        //创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //设置rabbit mq地址,这里用本机
        factory.setHost("localhost");
        //创建到代理服务器的连接
        Connection connection = factory.newConnection();
        //创建信道
        Channel channel = connection.createChannel();
        //与消息队列对接
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        //定义发布消息内容
        String msg = "Hello World!";
        //发布消息
        channel.basicPublish("",QUEUE_NAME,null,msg.getBytes());
        System.out.println(" [x] MsgProducer Send ----------'" + msg + "'");

        //关闭资源
       // connection.close();
       // channel.close();
    }
}


>
  • 消息消费者 MsgConsumer
package com.example.rabbitmq.mqdemo;


import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;

public class MsgConsumer {

    public static final String QUEUE_NAME = "hello";

    public static void main(String[] args) throws Exception{
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);

        //服务器将队列中异步地向我们发送消息,DeliverCallback子类异步回调和缓存消息
        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            //接收服务端消息
            String message = new String(delivery.getBody(), "UTF-8");
            System.out.println(" [x] MsgConsumer Received ========='" + message + "'");
        };
        channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
    }
}
  • 运行结果

image.png

image.png

至此,Rabbit初体验基本完成!

【小结】

1、从原理上理解RabbitMQ的作用,重点 P-Q-C 模型理解 异步 的概念;
2、学会利用官网学习新技能

【尾声】

本人职场小白,文章中难免出现理解不到位或错误的地方,还望大佬们批评指正。也欢迎你评论,留言,点赞!


微微一笑
4 声望0 粉丝

冰者,诡道也。