RabbitMQ 管理界面解析框架

前言

RabbitMQ的安装,网上例子非常多,此处不做累赘.至于为什么装RabbitMQ的时候要装erlang,因为erlang也是一门语言,通俗讲就是开发rabbitmq人员当时为了高并发,分布,健壮性,等等一系列优点的考虑,采用erlang作为rabbitmq的底层语言来开发.

erlang现如今是开源语言.函数式编程,支持多种开发环境.

当然博主也只能说成这样,没有更深层次的研究和学习.接下来要说的是怎么从rabbitmq的交互界面去浅入这种消息队列框架,它的内部有什么,它是怎么来进行消息的传输的.

看了一些书,还没有看完,也是入门!感觉书上讲的方式有些晦涩,至此我想通过我自己的理解,来解决我的困惑.如果你不喜欢,或者不能用这种方式学习,请关闭网页.出门买本书,或者下载个PDF来学习吧.

准备

消息列队框架,必先有发布者和接收者,在这里我们统称为生产者和消费者.

生产者: 连接服务,发布消息

消费者: 接收消息,进行消息业务逻辑处理.

进入

首先我们来访问下本机(windows)安装后,查看管理界面http://localhost:15672  账户/密码:guest/guest (15672是默认web界面访问接口,guest/guest账户密码亦是默认的账户密码.)

解析

首页进去是一个TOP横幅,上面是RabbitMQ的版本和Erlang版本信息.

1. overview(概述),记录一些本地rabbit的磁盘信息和内存占用,而后是一个监听端口,意思是协议的端口.

这里我们需要记下amqp协议的端口5672.因为rabbitmq就是遵从amqp协议的erlang语言实现的消息列队框架技术.也就是我们需要在rabbitmq开发和实现时,必须要用此端口来进行连接.

2. Connections (连接)

连接界面此时是空的,看似什么也没有,但是通过词意大概可以猜想到,这个界面记录应该是展示客户端或者某个服务连接到此rabbitmq的信息展示,那么通过什么连接呢?

IP?用户名?密码?还有端口,前3个都有了,那么后面的端口呢,是不是概述里面的监听协议端口.显然是的.

刚入门之初,我一直以为是15672,事实证明是错的,5672才是正确的协议连接端口.

为了查看方便,我后台写了简单的写了一个连接程序,打开看看,代码之后会乘上,现在带着好奇心去往下看和理解.

连接成功,用的协议amqp当然用的是协议端口.

3. Channels 信道

信道抽象理解一下,就是在创建连接的时候,我们还需要给一个信道,来承载信息的传输.好比一根电线,当它通电后,其实是其内的铜线来传输电力一样.

4. Exchanges (交换器)

交换器的理解就是在第三步创建信道后,信道上需要设置一个交换器.那么用交换器去做什么呢,往下看.

界面一个列表,Name列就是名称,Type是交换器类型,既然类型那么交换器肯定通过类型会做不同的逻辑处理.还有一个Features特性列,证明在我们实现代码的时候也需要如此定位类型.

D表示(durable(持久化的)),I表示(internal(内在的))

词面理解交换器可以是持久化的也可以定义为内部内在的,外部无法访问,只能通过交换器之间来访问

接下来点开某个交换器看下

新大陆来啦. 交换器内工作

4.1 绑定queue(列队)Routing key(路由) Arguments(参数) 

4.2 发布信息Routing key(路由) ... 证明这个Routing key(路由key)也是至关重要的.

交换器绑定通过路由key绑定列队进行消息发布.

5. Queues(列队)

列队用于存储消息.等待消息被接收.

在理论层面上来看,以上都是生产者需要做的工作.

总结

1. 生产者通过amqp协议连接RabbitMQ,建立连接!

2. 连接上创建信道.

3. 信道内创建不同类型的交换器和消息列队,交换器通过Routing key绑定消息列队,并且发布消息存储在列队内.

4. 消费者获取连接和信道,在信道内通过消息列队标识(QueueName)启动一个消费者,消费者消费消息.

代码实现

生产者

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

import java.io.IOException;
import java.util.concurrent.TimeoutException;


public class RabbitProducer {

    private static final String EXCHANGE_NAME = "exchange demo";
    private static final String ROUTING_KEY = "routingkey demo";
    private static final String QUEUE_NAME = "queue demo";
    private static final String IP_ADDRESS = "192.168.0.1";
    /**
     * RabbitMQ 服务端默认端口号为5672
     */
    private static final int PORT = 5672;

    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost(IP_ADDRESS);
        factory.setPort(PORT);
        factory.setUsername("root");
        factory.setPassword("root");
        //创建连接
        Connection connection = factory.newConnection();
        //创建信道
        Channel channel = connection.createChannel();

        // 创建一个type="direct" 、持久化的、非自动删除的交换器
        channel.exchangeDeclare(EXCHANGE_NAME, "direct", true, false, null);

        //创建一个持久化、非排他的、非自动删除的队列
        channel.queueDeclare(QUEUE_NAME, true, false, false, null);

        //将交换器与队列通过路由键绑定
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);

        //发送一条持久化的消息: hello world !
        String message = "Hello World !";
        channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());

        channel.close();
        connection.close();
    }


}

消费者

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Address;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import lombok.extern.log4j.Log4j;

import java.io.IOException;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;


@Log4j
public class RabbitConsumer {

    private static final String QUEUE_NAME = "queue demo";

    private static final String IP_ADDRESS = "192.168.0.1";
    private static final int PORT = 5672;

    public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setUsername("root");
        factory.setPassword("root");

        //这里的连接方式与生产者的demo 略有不同, 注意辨别区别
        // 创建连接
        Connection connection = factory.newConnection(Arrays.asList(new Address(IP_ADDRESS, PORT)));
        // 创建信道
        final Channel channel = connection.createChannel();
        // 设置客户端最多接收未被ack 的消息的个数
        channel.basicQos(64);

        Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("recv message: " + new String(body));
                try {
                    TimeUnit.SECONDS.sleep(1L);
                } catch (InterruptedException e) {
                    log.error("error", e);
                    channel.basicAck(envelope.getDeliveryTag(), false);
                }

            }
        };
        TimeUnit.SECONDS.sleep(5L);
        channel.basicConsume(QUEUE_NAME, consumer);

        channel.close();
        connection.close();
    }
}

AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。

>>转载请标明出处,谢谢.

  • 19
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员大猩猩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值