石小疯 发表于 2024-12-2 13:34:00

【02根本】- RabbitMQ根本

2- RabbitMQ

2-1 介绍和安装

RabbitMQ 的团体架构以及焦点概念


[*]publisher:消息发送者
[*]cunsumer:消息消费者
[*]queue:队列
[*]exchange:互换机,负责路由消息
[*]virtual-host :捏造主机,起到数据隔离的作用;一个 MQ 中可以创建多个 virtual-host
数据流转的模子:①生产者将数据发送给互换机 ——> ②互换机将消息路由给队列 ——> ③消费者监听队列拿到消息
https://img-blog.csdnimg.cn/img_convert/523d9e4f6c0961a9fb6098d6c505503d.png
安装


[*]上传镜像文件 mq.tar 到 Linux 系统中
[*]执行下令
docker load -i mq.tar

[*]复制以下代码执行


[*]其中 15672 ,是控制台端口
[*]其中 5672 ,是收发消息的端口
docker run \
-e RABBITMQ_DEFAULT_USER=itheima \
-e RABBITMQ_DEFAULT_PASS=123321 \
-v mq-plugins:/plugins \
--name mq \
--hostname mq \
-p 15672:15672 \
-p 5672:5672 \
--network hmall \
-d \
rabbitmq:3.8-management
2-2 RabbitMQ 快速入门

需求


[*]在 rabbitmq 的控制台完成下列操作:
[*]新建队列 hello.queue1 和 hello.queue2
[*]向默认的 amp.fanout 互换机发送一条消息
[*]查看消息是否到达 hello.queue1 和 hello.queue2
实现


[*]必要创建队列,同时在互换机中必要绑定队列才能实现消息的路由。
总结规律
①如果互换机和队列没有绑定能否收到消息?


[*]互换机:是负责路由和转发消息的。互换机通过绑定队列,之后可以将消息转发到队列中。
②如果绑定了所有队列是不是所有队列都可以收到消息?


[*]是的,如果一个互换机绑定了多个队列,那类似于广播的效果所有队列都能收到消息。
2-3 RabbitMQ 数据隔离



[*]在 RabbitMQ 中有捏造主机的概念,对于互换机和队列而言都有二者自己的捏造主机。
需求


[*]在 RabbitMQ 的控制台下完成下列操作

[*]新建一个用户 hmall
[*]为 hmall 用户创建一个 vitual host
[*]测试不同的 vitual host 之间的数据隔离征象

实现


[*]① 起首在 Admin ——> Users 中创建用户
[*]② 在 Admin ——> Users 中创建捏造主机
总结


[*]各个捏造主机下都是相互隔离的。
3- Java客户端

3-1 快速入门

AMQP

https://img-blog.csdnimg.cn/img_convert/8fab774fe6ec651fa49b9a1191b778b1.png
什么是 AMQP?


[*]Advanced Message Queuing Protocol,是一种高级的消息队列协议,是用于在应用步伐之间传递业务消息的开放标准。该协议与语言和平台无关,更符合微服务中独立性的要求。
Spring AMQP


[*]Spring AMQP是基于 AMQP 协议界说的一套 API 规范,提供了模板来发送和吸收消息。包罗两部分,其中Spring AMQP 是根本抽象,spring-rabbit 是底层的默认实现
快速入门

需求


[*]利用控制台创建队列 simple.queue
[*]在 publisher 服务中,利用 SpringAMQP 直接向 simple.queue 发送消息
[*]在 consumer 服务中,利用 SpringAMQP 编写消费者监听 simple.queue 队列
https://img-blog.csdnimg.cn/img_convert/06611c8c91b730a6254ce8012ea3bd6d.png
实现


[*]① 引入 spring-amqp依靠,在父工程中引入 spring-amqp 依靠,这样 publisher 和 consumer 服务都可以使用
<!-- AMQP依赖,包含RabbitMQ -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>


[*]② 在每个微服务中引入 MQ 服务端信息,这样微服务才能毗连到 RabbitMQ
https://img-blog.csdnimg.cn/img_convert/76a3e7a480ef51ec59335815c59cde0e.png


[*]③ 发送消息: SpringAMQP 提供了 RabbitTemplate 工具类,方便我们发送消息,发送消息的代码如下
@Autowired
private RabbitTemplate rabbitTemplate;

@Test
public void testSimpleQueue() {
    // 队列名称
    String queueName = "simple.queue";
    // 消息
    String message = "hello, spring amqp!";
    // 发送消息
    rabbitTemplate.convertAndSend(queueName, message);
}



[*]④ 吸收消息:
[*]SpringAMQP 提供声明式的消息监听,我们只必要通过 注解 在方法上声明要监听的队列名称,未来 SpringAMQP 就会把消息传递给当前方法。
@Slf4j
@Component
public class SpringRabbitListener {

    @RabbitListener(queues = "simple.queue")
    public void listenSimpleQueueMessage(String msg) throws InterruptedException {
      log.info("spring 消息接收到消息: [" + msg + "]");
      if (true) {
            throw new MessageConversionException("故意的");
      }
      log.info("消息处理完毕");
    }
}
页: [1]
查看完整版本: 【02根本】- RabbitMQ根本