RabbitMQ学习总结-基础篇

1..RabbitMQ 本身是一个消息中间件,在服务应用中,可解决高性能,高并发,高应用的问题,极大程度上解决了应用的性能问题。

2.MQ的使用分为生产者和消费者,生产者生产消息,消费者去消费消息。

3.MQ的主要组成部分,交换机/队列/路由键,生产者生产消息可以直接到队列,然后消费者消费,也可以通过交换机再到队列。在真正的生产应用中,基本都是通过交换机再到队列,根据路由键准确的到达消费者。

4.交换机/队列/路由键是独立的三部分,是需要互相绑定的,交换机需要绑定队列,队列绑定路由键,如图:

5.在实际应用中,不可能一个MQ服务只支持一个队列或者应用,但是又要实现一个MQ应用可以支持多个服务消息,这样,就要使用不同的虚拟主机,实现数据隔离,配置文件中配置的虚拟主机实例,决定了向哪里发消息(如:virtual-host: /hmall),配置如下:

XML 复制代码
logging:
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
  level:
    com.itheima: debug
spring:
  rabbitmq:
    host: 192.168.***.****
    port: 5672
    virtual-host: /hmall
    username: hmall
    password: 123
    connection-timeout: 1s #超时时间
    template:
      retry:
        enabled: true #开启重试机制
        initial-interval: 1000ms #失败后初始等待时间
        multiplier: 1 #失败后下次等待时常=1*1000ms
        max-attempts: 3 #最大等待次数
    publisher-confirm-type: correlated #生产者确认模式,异步回执
    publisher-returns: true #开启生产者return机制

6.MQ发送消息的方式有四种,但是实际应用的时候大部分只用了三种:

Fanout:广播,将消息交给所有绑定到交换机的队列。我们最早在控制台使用的正是Fanout交换机

Direct:订阅,基于RoutingKey(路由key)发送给订阅了消息的队列

Topic:通配符订阅,与Direct类似,只不过RoutingKey可以使用通配符

  • #:匹配一个或多个词

  • *:匹配不多不少恰好1个词

Headers:头匹配,基于MQ的消息头匹配,用的较少。

7.MQ也有自己的Template,mq的消息发送基于RabbitTemplate,使用方法如下:

java 复制代码
  rabbitTemplate.convertAndSend("交换机", "路由键", msg);

8.基于注解,注册交换机/队列/路由键,省去在控制台添加的麻烦,代码如下:

java 复制代码
@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "direct.queue1"),
    exchange = @Exchange(name = "hmall.direct", type = ExchangeTypes.DIRECT),
    key = {"red", "blue"}
))

9.MQ发送的消息,要经过转换器转换下,不然会出现人识别不了的乱码,所以要配置一个JSON的转换器,

依赖如下:

注:如果项目中引入了spring-boot-starter-web依赖,则无需再次引入Jackson依赖

XML 复制代码
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.9.10</version>
</dependency>

代码如下:

在配置类中直接注入这个bean就可以,或者自己定义一个配置类,服务启动就加载

java 复制代码
@Bean
public MessageConverter messageConverter(){
    // 1.定义消息转换器
    Jackson2JsonMessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter();
    // 2.配置自动创建消息id,用于识别不同消息,也可以在业务中基于ID判断是否是重复消息
    jackson2JsonMessageConverter.setCreateMessageIds(true);
    return jackson2JsonMessageConverter;
}
相关推荐
道爷我悟了1 分钟前
Vue入门-指令学习-v-on
javascript·vue.js·学习
-$_$-6 分钟前
【黑马点评】 使用RabbitMQ实现消息队列——1.Docker与RabbitMQ环境安装
分布式·docker·rabbitmq
人工智能技术咨询.31 分钟前
张雪峰谈人工智能技术应用专业的就业前景!
人工智能·学习·计算机视觉·语言模型
s_little_monster33 分钟前
【QT】QT入门
数据库·c++·经验分享·笔记·qt·学习·mfc
weixin_453965001 小时前
master节点k8s部署]33.ceph分布式存储(四)
分布式·ceph·kubernetes
alfiy1 小时前
Elasticsearch学习笔记(六)使用集群令牌将新加点加入集群
笔记·学习·elasticsearch
北极无雪1 小时前
Spring源码学习:SpringMVC(4)DispatcherServlet请求入口分析
java·开发语言·后端·学习·spring
望森FPGA2 小时前
HDLBits中文版,标准参考答案 |3.1.1 Basic Gates | 基本门电路
学习·fpga开发
JavaGPT2 小时前
prometheus学习笔记之PromQL
笔记·学习·prometheus
纪伊路上盛名在2 小时前
如何初步部署自己的服务器,达到生信分析的及格线
linux·运维·服务器·python·学习·r语言·github