RabbitMQ入门概述

一**.MQ介绍**

**1.MQ概念:**MQ是对不同类型的消息队列的统称

不同类型的消息队列常见的有:

①:RabbitMQ

②:RocketMQ

③:Kafka ...等

**2.用途:**MQ常用于系统通信(数据传输),可分两类

①:同步通信: 系统A---接口调用--->系统B

②:异步通信: 系统A---消息传递--->|消息队列|---消息传递--->系统B

3.MQ作用:MQ 基础作用是接收、存储、转发消息,并借此实现异步、解耦、削峰等核心作用.

可借MQ实现以下操作:

①:异步解耦

②:流量削峰

③:消息分发

④:延迟通知

⑤:异步通信

4.AMQP:

是什么:AMQP是一种高级消息队列协议

5.RabbitMQ快速入门(以下代码均采用 SpringBoot + RabbitMQ)

<1>引入依赖

java 复制代码
<dependencies>
    <!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
    <dependency>
        <groupId>com.rabbitmq</groupId>
        <artifactId>amqp-client</artifactId>
        <version>5.20.0</version>
    </dependency>
</dependencies>

<2>配置(根据自己设置的账号密码,以及交换机进行配置)

建议:不直接将服务器上的 5672、15672 等端口暴露在公网,可通过设置 SSH 隧道,在本地使用自定义端口访问服务器上的 RabbitMQ。相比直接开放端口,这种方式能有效避免被恶意扫描和攻击,安全性更高!

java 复制代码
spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

<3>生产者代码编写,例如:

java 复制代码
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/mq") // 类上统一前缀
@RestController
public class ProducerController {

    // RabbitTemplate 是 Spring 提供的发消息工具
    @Autowired
    private RabbitTemplate rabbitTemplate;

    // 浏览器访问这个接口就发消息
    @GetMapping("/send")
    public String sendMsg() {
        String message = "这是一条测试消息";
        // 发送到队列 test_queue
        rabbitTemplate.convertAndSend("test_queue", message);
        return "消息发送成功:" + message;
    }
}

<4>消费者代码编写:

java 复制代码
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class ConsumerListener {

    // 和生产者发的队列名一致:test_queue
    @RabbitListener(queues = "test_queue")
    public void receive(String message) {
        System.out.println("消费者收到消息:" + message);
    }
}

二.RabbitMQ的应用:

1.工作模式的介绍:

<1>简单模式:

producer--->|Queue|--->consumer

<2>工作队列模式:

producer--->|Queue| --->consumer1

--->consumer2

<3>发布订阅模式(交换机类型为Fanout广播模式):

producer--->|Exchange| --->|Queue1|--->consumer1

--->|Queue2|--->consumer2

Exchange交换机介绍:

RabbitMQ支持的交换机类型有4种:

**①:Fanout:**广播交换机,将消息交给所有与交换机绑定的队列

②:Direct: 定向交换机,把消息交给符合指定routingKey的队列**(精确匹配)**

③:Topic: 通配符交换机,把消息交给符合routing pattern的队列**(模糊匹配)**

**④:Headers:**头部交换机,生产环境中不常用,这里仅了解

介绍一下RoutingKey和BindingKey:

tips:本质上,它们就是同一个东西,在代码里全都叫 routingKey!

二者为同一个字符串,只是场景不同,名字不一样!为了好区分

<4>路由模式(交换机类型为Direct定向模式):

producer--->|Exchange| ①:--a-->|Queue1|--->consumer1

②:--a-->|Queue2|--->consumer2

--b-->|Queue2|--->consumer2

--c-->|Queue2|--->consumer2

<5>通配符模式:

producer--->|Exchange| ---> ①:--*.a.*-->|Queue1|--->consumer1

②:--*.*.b-->|Queue2|--->consumer2

--c.#-->|Queue2|--->consumer2

扩展:

*与#的区别:①*:一个段,如: a.* ---> a.b/a.c

②#:0~多个段,如a.#--->a/a.b/a.b.c

<6>RPC模式(RPC通信,了解为主)

Client---request--->|RPC|--->|Service|--->Reply---reply--->Client

<7>发布确认模式:(等价于发送方确认特性)是RabbitMQ消息可靠性保证的机制之一

producer--->|Queue|--->consumer---ACK--->producer

三种实现方式(效率有高到低):

①:异步确认

②:批量确认

③:单独确认

共7中工作模式.

2.介绍@RabbitListener

1.是什么:@RabbitListener是Spring框架中消费者用于监听RabbitMQ队列的注解,用它可自定义一个方法,消费者可以用它从RabbitMQ队列中接收消息 .

2.常用参数类型:

①:String:返回消息的内容

②:Message:返回原始的消息体及属性

③:Channel:RabbitMQ通道对象,可用于进行跟高级的操作,如手动确认消息.

注:默认为自动确认,若要改成手动确认,步骤如下:

1`配置(yml,properties)改成manual

2`@RabbitListener方法参数加Channel channel

3`配套写basicAck手动确认方法和basicNack消息处理失败方法

及时复盘,继续努力,加油!

相关推荐
朦胧之10 小时前
AI 编程-老项目改造篇
java·前端·后端
程序猿大帅14 小时前
别再只当调包侠了:用 Spring AI 落地 Function Calling,我被大模型硬生生砸出了三个大坑
java
程序员晓琪15 小时前
约定大于配置:基于 Java 包名自动生成 API 版本路由的最佳实践
java·spring boot·后端
Flittly16 小时前
【AgentScope Java新手村系列】(11)中断与恢复
java·spring boot·spring
众少成多积小致巨16 小时前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
东坡白菜16 小时前
破局全栈:前端开发的Java入门实战记录—JPA(2)
java·后端
SimonKing1 天前
艹,维护AI写的代码,我心态崩了......
java·后端·程序员
用户298698530141 天前
Java Word 文档样式进阶:段落与文本背景色设置完全指南
java·后端
小bo波2 天前
从"任意文件复制"深挖Java I/O:字符流与字节流的本质抉择
java·nio·io流·后端开发·文件复制
nanxun8863 天前
记一次诡异的 Docker 容器"串包"故障排查
java