详解AMQP协议

news2024/11/18 17:40:13

目录

1.概述

1.1.简介

1.2.抽象模型

2.spring中的amqp

2.1.spring amqp

2.2.spring boot amqp


1.概述

1.1.简介

AMQP,Advanced Message Queuing Protocol,高级消息队列协议。

百度百科上的介绍:

一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户中间件不同产品,不同的开发语言等条件的限制。

将上面的话翻译成人话,AMQP就是一个协议,核心内容就是为消息中间件提出了一个抽象模型,规定了消息中间件应该有哪些实体组成。当前市面上的消息中间件五花八门,其架构也是五花八门,AMQP其实就是希望能为消息中间件提供一个统一的标准。使用统一标准的消息中间件更便于管理,就算大型的系统中有多种消息中间件,因为其架构中实体是一样的,都能抽象出一套统一的API来操作。

1.2.抽象模型

AMQP定义的抽象模型如下:

  • Broker(消息代理)

  • Producer(生产者)

  • Consumer(消费者)

  • Exchange(交换器)

  • Queue(队列)

  • Binding(绑定)

  • Connection(连接)

  • Channel(信道)

Broker(消息代理)

可以理解为一个MQ节点即可。AMQP 中的消息代理是消息传递的核心组件。它负责接收、存储和传递消息,并将消息路由到正确的目的地。消息代理可以有多个,形成一个消息代理集群,用于分布式和高可用的消息传递。

Producer(生产者)

生产者是消息的发送者,它负责创建并发送消息到消息代理。生产者不需要关心消息的具体路由,只需将消息发送到指定的交换器即可。

Consumer(消费者)

消费者是消息的接收者,它订阅感兴趣的消息,从消息代理中接收并处理消息。消费者可以订阅一个或多个队列,接收符合条件的消息。

Exchange(交换器)

交换器是消息的路由器,它接收从生产者发送的消息,并根据消息的路由键将消息路由到一个或多个队列中。交换器根据不同的路由策略将消息发送到不同的队列。

Queue(队列)

队列是消息的存储位置,它保存待被消费的消息。消息代理将消息发送到队列后,等待消费者从队列中取出消息进行处理。

Binding(绑定)

绑定是交换器和队列之间的关联关系。通过绑定,交换器将消息路由到队列中,使得生产者发送的消息能够被消费者接收。

Connection(连接)

连接是客户端和消息代理之间的物理连接。客户端使用连接与消息代理进行通信,发送和接收消息。

Channel(信道)

信道是 AMQP 连接内的一个虚拟连接,用于在客户端和消息代理之间进行通信。通过信道,客户端可以创建和使用交换器、队列、绑定,发送和接收消息,而无需在每次通信时都创建新的 TCP 连接。

2.spring中的amqp

2.1.spring amqp

spring作为一个java后端的一个”粘合剂“其对各个JAVA EE场景都提供了自己的支持,如访问数据库的Spring Data,用于安全保障的Spring Security等等,当然也有用来访问MQ的spring amqp,顾名思义spring amqp就是用来操作满足amqp协议标准的MQ的Spring提供的默认支持。

Spring AMQP 提供了一个简单而强大的抽象层,使得在 Spring 应用程序中使用消息队列变得更加容易。它的主要目标是提供统一的 API,让开发者可以轻松地与不同消息队列系统交互,而无需关注底层实现细节。

主要特点和功能:

  1. 连接管理和资源抽象:Spring AMQP 管理与消息代理的连接,并提供了一组抽象类和接口来管理消息传递的资源,如交换器、队列、绑定等。

  2. 消息监听容器:Spring AMQP 提供消息监听容器,用于在应用程序中注册消息监听器,并处理从消息队列接收到的消息。

  3. 消息转换:Spring AMQP 支持消息转换,使得将消息从 Java 对象转换为消息队列所需的格式(如 JSON 或字节)变得更加简单。

  4. 事务支持:Spring AMQP 允许将消息传递操作与 Spring 的声明式事务管理结合使用,确保消息的可靠传递和处理。

  5. 消息发送和接收:Spring AMQP 提供发送和接收消息的 API,使得在应用程序中进行消息的发送和接收变得简单而灵活。

  6. 异步处理:Spring AMQP 支持异步消息处理,使得应用程序能够更高效地处理大量消息。

  7. 与 Spring 生态系统集成:Spring AMQP 与其他 Spring 项目紧密集成,例如 Spring Boot 和 Spring Integration,使得在 Spring 生态系统中构建分布式和消息驱动的应用程序更加容易。

spring amqp的使用在官网上有详细的官方文档的说明,此处不展开讲解。

需要注意的是,Spring AMQP 是专门用于支持符合 AMQP 协议的消息队列系统,如 RabbitMQ。如果要与不符合 AMQP 协议的消息队列系统(如 Kafka、RocketMQ)进行交互,则要用他们官方或者社区提供的自己实现的Spring集成库。

2.2.spring boot amqp

现在开发,我们用的更多的当然是spring boot,其实其底层封装的就是spring amqp,这里给出一个用spring-boot-starter-amqp去操作rabbitmq的示例感受一下。关于更详细的内容,有兴趣可以移步博主的另一片文章其中有详细介绍:

SpringBoot RabbitMq 六大模式_springboot整合rabbitmq六种模式__BugMan的博客-CSDN博客

这里我们以RabbitMQ的路由模式为例:

RabbitMQ的路由模式就是发布订阅模式,通过routing key将不同的消息投递到不同的队列中去,消费者根据想要订阅的routing key去找不同的队列即可。

依赖:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

RabbitMQ的配置:

spring:
  rabbitmq:
    host: 192.168.31.10
    port: 5672 #通过控制台可以查看
    username: guest
    password: guest
    virtual-host: /vhost_sys_logs #可以不配置,会使用的是默认virtual-host

配置类:

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class RabbitMQConfig {
    @Bean
    public Queue queue_01() {
        //durable,是否开启持久化
        return new Queue("queue_01",false);
    }
    @Bean
    public Queue queue_02(){
        return new Queue("queue_02",false);
    }
 
    //路由模式的交换机
    @Bean
    public DirectExchange directExchange(){
        return new DirectExchange("direct_exchange",false,false);
    }
 
    //将队列绑定到交换机上
    @Bean
    public Binding bindingSmsQueue_01(@Qualifier("queue_01") Queue logsAccess, DirectExchange directExchange) {
        return BindingBuilder.bind(logsAccess).to(directExchange).with("routing_key_01");
    }
    @Bean
    public Binding bindingSmsQueue_02(@Qualifier("queue_02") Queue logsError, DirectExchange directExchange) {
        return BindingBuilder.bind(logsError).to(directExchange).with("routing_key_02");
    }
}

生产者:

@SpringBootTest(classes=PrivilegeSystemMain.class)
public class RabbitMQTest {
    @Autowired
    private RabbitTemplate rabbitTemplate;
 
    @Test
    public void simpleTest() {
        rabbitTemplate.convertAndSend("direct_exchange","routing_key_01","helo world!");
    }
}

消费者:

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
 
@Component
@Slf4j
public class ConsumeBean {
    @RabbitListener(queues={"queue_01"})
    public void consumer_01(String message){
        log.info("consumer_01 get message "+message);
    }
    @RabbitListener(queues={"queue_02"})
    public void consumer_02(String message){
        log.info("consumer_02 get message "+message);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/836906.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

爬虫---练习源码

选取的是网上对一些球员的评价&#xff0c;来评选谁更加伟大一点 import csv import requests import re import timedef main(page):url fhttps://tieba.baidu.com/p/7882177660?pn{page}headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/53…

Python:判断一个数是否为质数或者输出100以内的质数

质数 质数又称素数。一个大于1的自然数&#xff0c;除了1和它自身外&#xff0c;不能被其他自然数整除的数叫做质数。 如&#xff1a;2&#xff0c;3&#xff0c;5&#xff0c;7。。。 判断一个数是否为质数 range(2, n)&#xff1a;范围在2~n&#xff08;不包括n&#xff09;之…

Mock.js的基本使用方法

官网网址&#xff1a;Mock.js (mockjs.com) 当前端工程师需要独立于后端并行开发时&#xff0c;后端接口还没有完成&#xff0c;那么前端怎么获取数据&#xff1f; 这时可以考虑前端搭建web server自己模拟假数据&#xff0c;这里我们选第三方库mockjs用来生成随机数据&#xf…

Java阶段五Day16

Java阶段五Day16 文章目录 Java阶段五Day16问题解析启动servlet冲突问题nacos注册中心用户信息验证失败前端效果不对前端请求到后台服务的流转过程 远程dubbo调用业务需求dubbo配置xml配置domain层代码 补充远程调用 师傅详情接口抽象开发WorkderServerControllerWorkerServerS…

一百四十二、Linux——查看Linux服务器架构的版本类型

一、目的 查看已经安装好的Linux服务器架构的版本类型&#xff0c;看服务器版本是32位还是64位 而且可以区分出是kettle的文件x86或x86_64&#xff0c;x86是32位&#xff0c;而x86_64是64位 注意&#xff1a; 32位的查询结果为i386、i686 64位的查询结果为x86_64 二、Linu…

idea配置docker部署

安装docker插件 setting -> plugins 配置docker远程连接 参考&#xff1a;docker配置远程连接端口 https://blog.csdn.net/jinying_51eqhappy/article/details/132103423?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%221…

探索CSS计数器:优雅管理网页元素的计数与序号

113. 探索CSS计数器&#xff1a;优雅管理网页元素的计数与序号 在前端开发中&#xff0c;我们经常需要对网页元素进行计数与序号&#xff0c;如有序列表、表格行号、步骤指示等。为了优雅地管理这些计数与序号&#xff0c;CSS提供了一种强大的功能&#xff1a;CSS计数器&#…

PHP实现首字母头像

<?php $name"哈哈"; $logoletter_avatar($name);echo <img src".$logo." style" border-radius: 50%;">;function letter_avatar($text) {$total unpack(L, hash(adler32, $text, true))[1];$hue $total % 360;list($r, $g, $b) hs…

【2023】Git版本控制-远程仓库详解

目录 创建远程仓库向远程仓库推送数据文件从第二台主机本地拉取远程仓库数据第一台主机同步远程仓库数据tag标签git忽略文件 Git远程仓库是Git版本控制系统的一个概念&#xff0c;它是一个存储Git代码的远程服务器。 你可以将本地Git仓库上传到远程仓库&#xff0c;以便与其他…

WSL1升级为WSL2

首先需要启用组件 使用管理员打开Powershell并运行 Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform启用后会要求重启计算机 从https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi获取WSL2 Linux内核更新包&#xff0c;…

实力肯定!Coremail入选中国信通院“铸基计划”2023全景图

近日&#xff0c;由中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;主办的“2023数字生态发展大会”暨中国信通院“铸基计划”年中会议在京召开。 会上发布了《高质量数字化转型产品及服务全景图&#xff08;2023&#xff09;》&#xff0c;Coremail凭借着优…

【设计模式——学习笔记】23种设计模式——观察者模式Observer(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入原始方案实现实现问题分析 介绍基础介绍登场角色 案例实现案例一类图实现分析 案例二类图实现 观察者模式在JDK源码的应用总结文章说明 案例引入 有一个天气预报项目&#xff0c;需求如下&#xff1a; 气象站可以将每天测量到的温度、湿度、气压等等以公告的…

修改状态栏The application could not be installed: INSTALL_FAILED_ABORTEDList

打开theme修改状态栏为可见。 <resources xmlns:tools"http://schemas.android.com/tools"><!-- Base application theme. --><style name"Base.Theme.MyApplication" parent"Theme.AppCompat.DayNight"><!-- Customize yo…

从入门到精通:Postman调试微信支付接口的绝佳方法

前期准备 在使用 Postman 调试微信支付接口之前&#xff0c;你需要做好以下准备&#xff1a; 安装 Postman 客户端应用&#xff0c;或使用网页版&#xff1b;成为 微信支付商户&#xff1b;已申请 商户API私钥。 当你已经具备这三个条件&#xff0c;就可以进入微信支付接口调…

【C语言学习】整数范围、整数越界、无符号数

1.整数范围 对于一个字节&#xff08;8位&#xff09;&#xff0c;可以表达的范围是00000000 ~ 11111111 其中00000000 ——> 0 11111111 ~ 10000000 ——> -1 ~ -128&#xff08;从大到小&#xff09; 00000001 ~ 01111111 ——> 1~127&#xff08;从小到大&#xff…

Yolov8新版本解读(二):优化点如何加入新版本,通过加入轻量级网络Ghostnetv2对比说明

本文目的: 最近yolov8进行了一次较大的更新,对一些优化点加在哪个位置上有些变动,因此本文主要通过具体案列进行对比和说明,以便在新版本上能够轻松上手。 老版本 ultralytics/nn 新版本更新为: modules文件夹下内容如下: 解读: 将modules.py拆分为 1.__init__.…

服务器中了malox勒索病毒后怎么办怎么解决,malox勒索病毒解密数据恢复

服务器遭受Malox勒索病毒攻击后&#xff0c;快速解密并恢复数据至关重要&#xff0c;以便减少更大的经济损失。近期&#xff0c;新的一波malox勒索病毒正在肆虐&#xff0c;我们收到很多企业的求助&#xff0c;企业的服务器数据库遭到了malox勒索病毒攻击&#xff0c;导致系统内…

四数之和——力扣18

文章目录 题目描述双指针法 题目描述 双指针法 class Solution { public:vector<vector<int>> fourSum(vector<int>& nums, int target){int nnums.size();vector<vector<int>> res;sort(nums.begin(), nums.end());for(int a0;a<n;a){if…

AI介绍——chat gpt/文心一言/claude/bard/星火大模型/bing AI

AI体验 1. AI 介绍&#xff08;注册和使用&#xff09;1.1 Chat GPT1.2 文心一言1.3 Slack 上的 Claude1.3.1 Claude 介绍1.3.2 Claude 使用 1.4 Google的Bard1.4.1 Bard 介绍1.4.2 Bard 使用 1.5 科大讯飞的星火大模型1.5.1 星火大模型 介绍1.5.2 星火大模型 使用 1.6 new bin…

偶然看到DeepFaceLab(DeepFake)在2023年的新动向

DeepFaceLab相关文章 一&#xff1a;《简单介绍DeepFaceLab&#xff08;DeepFake&#xff09;的使用以及容易被忽略的事项》 二&#xff1a;《继续聊聊DeepFaceLab&#xff08;DeepFake&#xff09;不断演进的2.0版本》 三&#xff1a;《如何翻译DeepFaceLab&#xff08;DeepF…