【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列

这篇具有很好参考价值的文章主要介绍了【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


消息队列

概述

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

两大种类

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

RabbitMQ

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

安装及基操

Docker中安装

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

下载镜像:docker pull rabbitmq:management

创建实例并启动:

docker run -d --name rabbitmq --publish 5671:5671 \
--publish 5672:5672 --publish 4369:4369 --publish 25672:25672 --publish 15671:15671 --publish 15672:15672 \
rabbitmq:management
  • 4369 – erlang发现口
  • 5672 --client端通信口
  • 15672 – 管理界面ui端口
  • 25672 – server间内部通信口

在web浏览器中输入地址:http://服务器ip:15672/

输入默认账号: guest : guest

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

overview:概览

connections:无论生产者还是消费者,都需要与RabbitMQ建立连接后才可以完成消息的生产和消费,在这里可以查看连接情况

channels:通道,建立连接后,会形成通道,消息的投递获取依赖通道。

Exchanges:交换机,用来实现消息的路由

Queues:队列,即消息队列,消息存放在队列中,等待消费,消费后被移除队列。

端口

5672: rabbitMq的编程语言客户端连接端口

15672:rabbitMq管理界面端口

25672:rabbitMq集群的端口

添加用户

如果不使用guest,我们也可以自己创建一个用户:

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

1、 超级管理员(administrator)

可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。

2、 监控者(monitoring)

可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)

3、 策略制定者(policymaker)

可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。

4、 普通管理者(management)

仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。

5、 其他

无法登陆管理控制台,通常就是普通的生产者和消费者。

创建Virtual Hosts

虚拟主机:类似于mysql中的database。他们都是以“/”开头

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

设置权限

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

添加交换机

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

创建队列

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

交换机绑定队列

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

绑定成功

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

五种消息模型

RabbitMQ提供了6种消息模型,但是第6种其实是RPC,并不是MQ,因此不予学习。那么也就剩下5种。

但是其实3、4、5这三种都属于订阅模型,只不过进行路由的方式不同。

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

  1. 点对点
  2. 多人监听
  3. 主题模式
  4. 字符串精确匹配传输消息的广播
  5. 字符串支持通配符匹配传输消息的广播

SpringBoot整合MQ

引入依赖

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

properties配置

# ip
spring.rabbitmq.host=192.168.11.130
# 端口
spring.rabbitmq.port=5672
# virtualHost
spring.rabbitmq.virtual-host=/
# 开启发送端消息抵达Broker确认
spring.rabbitmq.publisher-confirms=true
# 开启发送端消息抵达Queue确认
spring.rabbitmq.publisher-returns=true
# 只要消息抵达Queue,就会异步发送优先回调returnfirm
spring.rabbitmq.template.mandatory=true
# 手动ack消息,不使用默认的消费端确认
spring.rabbitmq.listener.simple.acknowledge-mode=manual

开启RabbitMQ

// 开启RabbitMQ支持
@EnableRabbit
@SpringBootApplication
public class Application {
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}

API使用

创建交换机

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

创建队列

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

交换机绑定队列

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

发送消息

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

用JSON发送含有对象的消息,需要自定义配置类

@Configuration
public class MyRabbitConfig {
    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }
}

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

接收消息

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

消息确认机制

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

RabbitMQ配置类

@Configuration
public class MyRabbitConfig {

    private RabbitTemplate rabbitTemplate;

    @Primary
    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        this.rabbitTemplate = rabbitTemplate;
        rabbitTemplate.setMessageConverter(messageConverter());
        initRabbitTemplate();
        return rabbitTemplate;
    }

    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }

    /**
     * 定制RabbitTemplate
     * 1、服务收到消息就会回调
     *      1、spring.rabbitmq.publisher-confirms: true
     *      2、设置确认回调
     * 2、消息正确抵达队列就会进行回调
     *      1、spring.rabbitmq.publisher-returns: true
     *         spring.rabbitmq.template.mandatory: true
     *      2、设置确认回调ReturnCallback
     *
     * 3、消费端确认(保证每个消息都被正确消费,此时才可以broker删除这个消息)
     *
     */
    // @PostConstruct  //MyRabbitConfig对象创建完成以后,执行这个方法
    public void initRabbitTemplate() {

        /**
         * 1、只要消息抵达Broker就ack=true
         * correlationData:当前消息的唯一关联数据(这个是消息的唯一id)
         * ack:消息是否成功收到
         * cause:失败的原因
         */
        //设置确认回调
        rabbitTemplate.setConfirmCallback((correlationData,ack,cause) -> {
            System.out.println("confirm...correlationData["+correlationData+"]==>ack:["+ack+"]==>cause:["+cause+"]");
        });


        /**
         * 只要消息没有投递给指定的队列,就触发这个失败回调
         * message:投递失败的消息详细信息
         * replyCode:回复的状态码
         * replyText:回复的文本内容
         * exchange:当时这个消息发给哪个交换机
         * routingKey:当时这个消息用哪个路邮键
         */
        rabbitTemplate.setReturnCallback((message,replyCode,replyText,exchange,routingKey) -> {
            System.out.println("Fail Message["+message+"]==>replyCode["+replyCode+"]" +
                    "==>replyText["+replyText+"]==>exchange["+exchange+"]==>routingKey["+routingKey+"]");
        });
    }
}

延时队列

相当于定时任务

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列,系统开发,笔记,rabbitmq,消息队列,尚硅谷,谷粒商城,java文章来源地址https://www.toymoban.com/news/detail-521038.html

@Configuration
@Slf4j
public class MyMqConfig {
    /* 容器中的Queue、Exchange、Binding 会自动创建(在RabbitMQ)不存在的情况下 */
	/* RabbitMq里面如果有,即使属性发生变化,也不会覆盖
    /*
     * @Description 延时消息队列-死信队列
     * @Author WSKH
     */
    @Bean
    public Queue orderDelayQueue() {
        /*
            Queue(String name,  队列名字
            boolean durable,  是否持久化
            boolean exclusive,  是否排他
            boolean autoDelete, 是否自动删除
            Map<String, Object> arguments) 属性
         */
        HashMap<String, Object> arguments = new HashMap<>();
        arguments.put("x-dead-letter-exchange", "order-event-exchange");
        arguments.put("x-dead-letter-routing-key", "order.release.order");
        // 消息过期时间 1分钟
        arguments.put("x-message-ttl", 60000);

        return new Queue(MqConstants.ORDER_DELAY_QUEUE, true, false, false, arguments);
    }

    /**
     * @Description 普通队列-延时队列死亡后,消息经过exchange送给普通队列,接收者负责删除订单
     * @Author WSKH
     */
    @Bean
    public Queue orderReleaseQueue() {
        return new Queue(MqConstants.ORDER_RELEASE_ORDER_QUEUE, true, false, false);
    }

   /**
    * @Description 创建order交换机
    * @Author WSKH
    */
    @Bean
    public Exchange orderEventExchange() {
        /*
         *   String name,
         *   boolean durable,
         *   boolean autoDelete,
         *   Map<String, Object> arguments
         * */
        return new TopicExchange(MqConstants.ORDER_EVENT_EXCHANGE, true, false);
    }

    /**
     * @Description 延时队列和order交换机的绑定(创建订单)
     * @Author WSKH
     */
    @Bean
    public Binding orderCreateBinding() {
        /*
         * String destination, 目的地(队列名或者交换机名字)
         * DestinationType destinationType, 目的地类型(Queue、Exhcange)
         * String exchange,
         * String routingKey,
         * Map<String, Object> arguments
         * */
        return new Binding(MqConstants.ORDER_DELAY_QUEUE,
                Binding.DestinationType.QUEUE,
                MqConstants.ORDER_EVENT_EXCHANGE,
                "order.create.order",
                null);
    }

    /**
     * @Description 普通队列和order交换机的绑定(负责释放到时间还没有支付的订单)
     * @Author WSKH
     */
    @Bean
    public Binding orderReleaseBinding() {
        return new Binding(MqConstants.ORDER_RELEASE_ORDER_QUEUE,
                Binding.DestinationType.QUEUE,
                MqConstants.ORDER_EVENT_EXCHANGE,
                "order.release.order",
                null);
    }
}

到了这里,关于【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【笔记】谷粒商城高级篇

    全文检索工具:快速储存、搜索和分析海量数据。 Index (索引) → Mysql的库 动词,相当于MySQL中的insert; 名词,相当于MySQL中的Database。 Type (类型) → Mysql的表(过时) 在Index中,可以定义一个或多个类型。类似于MySQL中的Table;每一种类型的数据放在一起。 Document (文档) →

    2023年04月21日
    浏览(46)
  • 【笔记/后端】谷粒商城高级篇

    全文检索工具:快速储存、搜索和分析海量数据。 Index (索引) → Mysql的库 动词,相当于MySQL中的insert; 名词,相当于MySQL中的Database。 Type (类型) → Mysql的表(过时) 在Index中,可以定义一个或多个类型。类似于MySQL中的Table;每一种类型的数据放在一起。 Document (文档) →

    2024年02月02日
    浏览(42)
  • 谷粒商城学习笔记

    1)、电商模式 2)、谷粒商城 谷粒商城是一个 B2C 模式的电商平台,销售自营商品给客户。 1、项目微服务架构图 2、微服务划分图 3、项目技术特色 4、项目前置要求 分布式是指将不同的业务分布在不同的地方。 集群指的是将几台服务器集中在一起,实现同一业务。 例如:

    2024年01月16日
    浏览(59)
  • 谷粒商城第一天-项目概述、架构、Linux环境搭建

    目录 一、学习的内容 一、常见的商城模式 二、谷粒商城项目的微服务架构 三、谷粒商城项目的微服务划分 四、谷粒商城项目的亮点 五、微服务的基本的概念 二、完成的进度 三、学到的东西 四、总结 6月9日正式下决心开始学习谷粒商城项目,之前早就听说谷粒商城项目的

    2024年02月10日
    浏览(48)
  • 谷粒商城项目|es的应用场景及常见问题

    es是什么 es多被用于搜索聚合分析引擎 是分布式的可以高性能查询的引擎 es应用场景 为什么不用MYSQL而用es es将数据存在内存中且可以分布式的存储数据 商品上架 商品在es中的保存 1.在es中建立索引 spu sku spu sku保存在一起防止分布查询 为了防止对象数组扁平化,商品属性字段

    2024年01月17日
    浏览(63)
  • 谷粒商城笔记(详细版) IDEA2021 高级篇1(2022/11/9)

    谷粒商城笔记(详细版) IDEA2021 基础篇(1/3). 谷粒商城笔记(详细版) IDEA2021 基础篇(2/3). ES6 VUE 基础篇前端笔记 谷粒商城笔记(详细版) IDEA2021 基础篇(3/3). [谷粒商城笔记(详细版) IDEA2021 高级篇(第1篇) 索引对应mysql中的库 类型对应Mysql中的数据表 文档对应mysql中的一条条数据 在我们

    2023年04月09日
    浏览(40)
  • 谷粒商城笔记+踩坑(9)——上架商品spu到ES索引库

    导航: 谷粒商城笔记+踩坑汇总篇 目录 1、ES回顾 2、ES整合商品上架  2.1、分析 2.2、创建sku的es索引库 2.2.1、两种索引库设计方案分析 2.2.2、最终选用的索引库方案,nested类型 2.3、SkuEsModel模型类 2.4、【库存模块】库存量查询 2.5、【查询模块】保存ES文档 2.5.1、常量类 2.5.2、

    2024年02月05日
    浏览(52)
  • 2023最新谷粒商城笔记之支付服务篇(全文总共13万字,超详细)

    这里我们是使用的支付宝进行支付,所以需要调用支付宝的相关API,下面来了解一下怎样使用支付宝进行线上支付。 支付宝开放平台传送门: 支付宝开放平台 网站支付DEMO传送门: 手机网站支付 DEMO | 网页移动应用 RSA、加密加签、密钥等 对称加密 对称加密 :发送方和接收

    2024年02月09日
    浏览(55)
  • 2023最新谷粒商城笔记之Sentinel概述篇(全文总共13万字,超详细)

    什么是 熔断 当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,**进而熔断该节点微服务的调用,快速返回错误的响应信息。**检测到该节点微服务调用响应正常后恢复调用链路。 A服务调用B服务的某个功能,由于网络不稳定问题,或者B服务卡机,导致

    2024年02月16日
    浏览(58)
  • 尚硅谷大数据项目《在线教育之采集系统》笔记002

    视频地址:尚硅谷大数据项目《在线教育之采集系统》_哔哩哔哩_bilibili 目录 P032 P033 P033 P034 P035 P036 P032 P033 P033 2023-07-26 11:13:42,136 (kafka-producer-network-thread | producer-1) [WARN - org.apache.kafka.clients.NetworkClient.processDisconnection(NetworkClient.java:671)] [Producer clientId=producer-1] Connection to node -

    2024年02月15日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包