关于rabbitmq:深入浅出-RabbitMQ

6次阅读

共计 3548 个字符,预计需要花费 9 分钟才能阅读完成。

什么是 RabbitMQ

简介(长处)

  • 基于 ErLang 语言开发有高可用高并发的长处,适宜集群。
  • 开源、稳固、易用、跨平台、反对多种语言、文档齐全。
  • 有音讯确认机制和长久化机制,可靠性高。

概念

生产者和消费者

  • Producer:音讯的生产者
  • Consumer:音讯的消费者

Queue

  • 音讯队列提供了 FIFO 的解决机制,具备缓存音讯的能力。在 RabbitMQ 中,队列音讯能够设置为长久化,长期或者主动删除。
  • 如果是长久化的队列,Queue 中的音讯会在 Server 本地硬盘存储一份,避免零碎 Crash 数据失落。
  • 如果是长期的队列,Queue 中的数据在零碎重启之后就会失落。
  • 如实是主动删除的队列,当不存在用户连贯到 Server,队列中的数据会被主动删除。

ExChange

ExChange 相似于数据通信网络中的交换机,提供音讯路由策略。

RabbitMQ 中,生产者不是将音讯间接发送给 Queue,而是先发送给 ExChangeExChange 依据生产者传递的 key 依照特定的路由算法将音讯给指定的 Queue。一个 ExChange 能够绑定多个 Queue。和 Queue 一样,ExChange 也能够设置为长久化、长期或者主动删除。

Binding

所谓绑定就是将一个特定的 ExChange 和一个特定的 Queue 绑定起来。ExChangeQueue 的绑定能够是多对多的关系。

Virtual Host

RabbitMQ Server 上能够创立多个虚构的 Message Broker(又叫做 Virtual Hosts)。每一个 vhost 实质上是一个迷你的 RabbitMQ Server,别离治理各自的 ExChangebinding。生产者和消费者连贯 RabbitMQ Server 须要指定一个 Virtual Host

应用过程

  1. 客户端连贯到音讯队列服务器,关上一个 Channel
  2. 客户端申明一个 ExChange,并设置相干属性。
  3. 客户端申明一个 Queue,并设置相干属性。
  4. 客户端应用 Routing Key,在 ExChangeQueue 之间建设好绑定关系。
  5. 客户端投递音讯到 ExChange
  6. ExChange 接管到音讯后,就依据音讯的 key 和曾经设置的 bingding,进行音讯路由,将音讯投递到一个或多个队列里。

部署 RabbitMQ

应用 Docker Compose 部署

创立 docker-compose.yml

version: ‘3.1’
services:
rabbitmq:
restart: always
image: rabbitmq:management
container_name: rabbitmq
ports:

  • 5672:5672
  • 15672:15672

environment:
TZ: Asia/Shanghai
RABBITMQ_DEFAULT_USER: rabbit
RABBITMQ_DEFAULT_PASS: 123456
volumes:

  • ./data:/var/lib/rabbitmq

RabbitMQ WebUI 界面

  • 拜访地址:http://{ip}:15672
  • 首页

  • Global counts

    .png)

  • 交换机页

    .png)

  • 队列页

    .png)

    • Name:音讯队列的名称,这里是通过程序创立的
    • Features:音讯队列的类型,durable:true 为会长久化音讯
    • Ready:筹备好的音讯
    • Unacked:未确认的音讯
    • Total:全副音讯

      如果都为 0 则阐明全副音讯解决实现

应用 RabbitMQ

创立生产者

创立一个名为 spring-boot-amqp-provider 的生产者我的项目。

相干配置

  • 创立 application.yml 文件

    spring:
    application:
    name: spring-boot-amqp
    rabbitmq:
    host: 192.168.75.133
    port: 5672
    username: rabbit
    password: 123456

  • 创立队列

    import org.springframework.amqp.core.Queue;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;

    /**
    * 队列配置
    */
    @Configuration
    public class RabbitMQConfiguration {

    @Bean
    public Queue queue() {
    return new Queue(“helloRabbitMQ”);
    }
    }

  • 创立音讯提供者

    import org.springframework.amqp.core.AmqpTemplate;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;

    import java.util.Date;

    /**
    * 音讯提供者
    */
    @Component
    public class RabbitMQProvider {

    @Autowired
    private AmqpTemplate amqpTemplate;

    public void send() {
    String context = “hello” + new Date();
    System.out.println(“Provider: ” + context);
    amqpTemplate.convertAndSend(“helloRabbitMQ”, context);
    }
    }

发送音讯

创立测试用例

import com.lusifer.spring.boot.amqp.Application;
import com.lusifer.spring.boot.amqp.provider.HelloRabbitProvider;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class AmqpTest {

@Autowired
private HelloRabbitProvider helloRabbitProvider;

@Test
public void testSender() {
for (int i = 0; i < 10; i++) {
RabbitMQProvider.send();
}
}
}

创立消费者

创立一个名为 spring-boot-amqp-consumer 的消费者我的项目。

相干配置

创立 application.yml 文件

spring:
application:
name: spring-boot-amqp-consumer
rabbitmq:
host: 192.168.75.133
port: 5672
username: rabbit
password: 123456

接管音讯

创立音讯的生产监听组件

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@RabbitListener(queues = “helloRabbitMQ”)
public class HelloRabbitConsumer {

@RabbitHandler
public void process(String message) {
System.out.println(“Consumer: ” + message);
}
}

  • 文章作者:彭超
  • 本文首发于集体博客:https://antoniopeng.com/2020/07/18/mq/%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BA%20RabbitMQ/
  • 版权申明:本博客所有文章除特地申明外,均采纳 CC BY-NC-SA 4.0 许可协定。转载请注明来自 彭超 | Blog!
正文完
 0