[小白学微服务]消息队列RabbitMQ 的安装和基础使用

这篇具有很好参考价值的文章主要介绍了[小白学微服务]消息队列RabbitMQ 的安装和基础使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 前言

我们为什么要用消息队列技术?

有些复杂的业务系统,一次用户请求可能会同步调用N个系统的接口,需要等待所有的接口都返回了,才能真正的获取执行结果。

这样就导致了:

1.系统之间耦合性太高,如果调用的任何一个子系统出现异常,整个请求都会异常,对系统的稳定性非常不利

2.这种同步接口调用的方式总耗时比较长,非常影响用户的体验,特别是在网络不稳定的情况下,极容易出现接口超时问题

3.果用户突增,一时间所有的请求都到数据库,可能会导致数据库无法承受这么大的压力,响应变慢或者直接挂掉。


一、都有什么消息队列,各有什么特色?

1.ActiveMQ:它是一个完全支持JMS规范的的消息中间件。丰富的API,多种集群架构模式让ActiveMQ在业界成为老牌的消息中间件,在中小型企业颇受欢迎!
2.Kafka:主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务。
3.RocketMQ:RocketMQ是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。
4.RabbitMQ:RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠、安全。AMQP协议更多用在企业系统内对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。

二、安装RabbitMQ(Linux环境)

官方教程,由此进入

1.使用docker引入RabbitMQ镜像

docker pull rabbitmq:3-management

:3-management 是指定的版本,如果不写默认引入最新版

[小白学微服务]消息队列RabbitMQ 的安装和基础使用,rabbitmq,分布式,微服务,spring cloud

我们已经成功引入了镜像

2.启动rabbitmq容器,

镜像只是相当于硬盘上的应用文件,容器则是相当于运行的应用程序

执行如下代码:

docker run \
 -e RABBITMQ_DEFAULT_USER=whr \
 -e RABBITMQ_DEFAULT_PASS=123456 \
 --name mq \
 --hostname mq1 \
 -p 15672:15672 \
 -p 5672:5672 \
 -d \
 rabbitmq:3-management

解释下各项配置参数:

RABBITMQ_DEFAULT_USER=whr   是设置rabbitmq的默认用户名为whr

RABBITMQ_DEFAULT_PASS=123456  是设置abbitmq的默认用户密码为123456

--name mq   容器名字

--hostname mq1   主机名,集群部署要用

 -p 15672:15672         UI界面端口
 -p 5672:5672         连接端口   这两个都是开放端口

-d 后台运行

(ps:  /  是换行符)

3.访问UI界面 

上面我们完成了启动,可以去UI界面看看 访问方式就是  ip:端口号

[小白学微服务]消息队列RabbitMQ 的安装和基础使用,rabbitmq,分布式,微服务,spring cloud

输入上面配置的用户名,密码 即可登录

[小白学微服务]消息队列RabbitMQ 的安装和基础使用,rabbitmq,分布式,微服务,spring cloud

原版网页是英文的,我这里翻译为了中文 

这样我们的Rabbit就已经完成安装和启动了

三、springbot整合RabbitMq 

1. 引入所需依赖

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

2.编写配置文件

在application.yml配置文件中 载入如下配置:

spring:
  rabbitmq:
    host: 47.96.73.173 #ip
    port: 5672 #连接端口
    username: whr #用户名
    password: 123456 #密码
    virtual-host: / #虚拟主机默认是 '/'
    listener:
      simple:
        prefetch: 1 #设置预取消息上限

这样整合就完成了,在正式开始使用之前我们先来了解下rabbitmq的组件和模式 


 四、RabbitMq的组成

        1.Queue

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

        2.Exchange

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

        3.channels

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

        4.connections 

无论生产者还是消费者,都需要与RabbitMQ建立连接后才可以完成消息的生产和消费

五、RabbitMq常用模式

1.简单模式

1个生产者 + 1个队列 + 1个消费者;

生产者代码:

    @Autowired
    private RabbitTemplate rabbitTemplate;
    //simple
    @Test
    public void sendMsg_1(){
        String queueName = "simple.queue";
        String msg = "spring amqp 666";
        rabbitTemplate.convertAndSend(queueName, msg);
    }

消费者代码:

@Component
@Slf4j
public class SoringRabbitListener {
//simple
    @RabbitListener(queues = "simple.queue")
    public void listenSimpleQueue (String msg){
        log.info("收到消息:{}", msg);
    }
}

运行结果:

 [小白学微服务]消息队列RabbitMQ 的安装和基础使用,rabbitmq,分布式,微服务,spring cloud

2.工作者模式

1个生产者 + 1个队列 + 多个消费者,一条消息只能被消费一次;

生产者代码:

    @Test
    public void sendMsg_2() throws InterruptedException {
        String queueName = "simple.queue";
        String msg = "spring amqp 666 ";
        int i = 0;
        while (i < 50){
            rabbitTemplate.convertAndSend(queueName, "", msg + i);
            Thread.sleep(20);
            i++;
        }
    }

消费者代码:

//    work
@Component
@Slf4j
public class SoringRabbitListener {
    @RabbitListener(queues = "simple.queue")
    public void listenSimpleQueue_1 (String msg) throws InterruptedException {
        log.info("消费者1收到消息:{} 时间是:{}", msg, LocalDateTime.now());
        Thread.sleep(20);
    }
    @RabbitListener(queues = "simple.queue")
    public void listenSimpleQueue_2 (String msg) throws InterruptedException {
        log.error("消费者2收到消息:{} 时间是:{}", msg, LocalDateTime.now());
        Thread.sleep(100);
    }
}

运行结果: 

[小白学微服务]消息队列RabbitMQ 的安装和基础使用,rabbitmq,分布式,微服务,spring cloud

3.订阅消息模型之 fanout

个生产者 + 1个交换机 + 多个队列 + 多个消费者,一条消息可以被多个消费者消费;

生产者:

    @Test
    public void sendToFanoutExchange(){
        String fanoutExchangeName = "itcast.fanout";
        String msg = "spring amqp 666";
        rabbitTemplate.convertAndSend(fanoutExchangeName,"", msg);
    }

消费者:

@Component
@Slf4j
public class SoringRabbitListener {
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "fanout.queue1"),
            exchange = @Exchange(name = "whr.fanout", type = ExchangeTypes.FANOUT)
    ))
    public void listenFanoutQueue1 (String msg){
      log.info("消费者1收到消息:{} 时间是:{}", msg, LocalDateTime.now());
    }
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "fanout.queue2"),
            exchange = @Exchange(name = "whr.fanout", type = ExchangeTypes.FANOUT)
    ))
    public void listenFanoutQueue2 (String msg){
        log.info("消费者2收到消息:{} 时间是:{}", msg, LocalDateTime.now());
    }
}

运行结果: 

[小白学微服务]消息队列RabbitMQ 的安装和基础使用,rabbitmq,分布式,微服务,spring cloud

4.订阅消息模型之durect

1个生产者 + 1个交换机 + 多个队列 + 多个消费者 ,routingKey ,一条消息发送给符合 routingKey 的队列

生产者:

    @Test
    public void sendToDirectExchange(){
        String fanoutExchangeName = "whr.direct";
        String msg1 = "此消息发给category";
        String msg2 = "此消息发给goods";
        String msg3 = "此消息发给flavor";
        rabbitTemplate.convertAndSend(fanoutExchangeName,"category", msg1);
        rabbitTemplate.convertAndSend(fanoutExchangeName,"goods", msg2);
        rabbitTemplate.convertAndSend(fanoutExchangeName,"flavor", msg3);
    }

消费者:

@Component
@Slf4j
public class SoringRabbitListener { 
    //路由 direct
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "direct.queue1"),
            exchange = @Exchange(name = "whr.direct"),
            key = {"goods", "category"}
    ))
    public void listenDirectQueue1 (String msg){
        log.info("消费者1收到消息:{} 时间是:{}", msg, LocalDateTime.now());
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "direct.queue2"),
            exchange = @Exchange(name = "whr.direct"),
            key = {"flavor", "category"}
    ))
    public void listenDirectQueue2 (String msg){
        log.info("消费者2收到消息:{} 时间是:{}", msg, LocalDateTime.now());
    }
}

结果:

[小白学微服务]消息队列RabbitMQ 的安装和基础使用,rabbitmq,分布式,微服务,spring cloud

5.订阅消息模型之topic

通配符,#:匹配一个或者多个 *:一个词;

生产者:

    @Test
    public void sendToTopicExchange(){
        String fanoutExchangeName = "whr.topic";
        String msg1 = "此消息发给至:com.kk";
        rabbitTemplate.convertAndSend(fanoutExchangeName,"com.kk", msg1);
    }

消费者:

@Component
@Slf4j
public class SoringRabbitListener { 
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "topic.queue1"),
            exchange = @Exchange(name = "whr.topic", type = ExchangeTypes.TOPIC),
            key = "com.#"
    ))
    public void listenTopicQueue1 (String msg){
        log.info("消费者1收到消息:{} 时间是:{}", msg, LocalDateTime.now());
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "topic.queue2"),
            exchange = @Exchange(name = "whr.topic", type = ExchangeTypes.TOPIC),
            key = "#.kk"
    ))
    public void listenTopicQueue2 (String msg){
        log.info("消费者2收到消息:{} 时间是:{}", msg, LocalDateTime.now());
    }
}

结果:

[小白学微服务]消息队列RabbitMQ 的安装和基础使用,rabbitmq,分布式,微服务,spring cloud

结束语

以上就是RabbbitMq的基本使用了,新人作者,还有不足,欢迎大佬多多补充,多多关照哈~拜拜↑拜拜↓拜拜↑文章来源地址https://www.toymoban.com/news/detail-840245.html

到了这里,关于[小白学微服务]消息队列RabbitMQ 的安装和基础使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Message queue 消息队列--RabbitMQ 【基础入门】

                                🎉🎉欢迎来到我的CSDN主页!🎉🎉                     🏅我是平顶山大师,一个在CSDN分享笔记的博主。📚📚     🌟推荐给大家我的博客专栏《Message queue 消息队列--RabbitMQ 【基础入门】》。🎯🎯                     🎁如果感觉还

    2024年01月20日
    浏览(59)
  • 消息队列-------Rabbitmq介绍和安装

    消息队列就是基础数据结构中的“先进先出”的一种数据机构。想一下,生活中买东西,需要排队,先排的人先买消费,就是典型的“先进先出” MQ是一直存在,不过随着微服务架构的流行,成了解决微服务之间问题的常用工具。  1.应用解耦  单体应用---》分布式应用  

    2024年02月10日
    浏览(38)
  • RabbitMQ实现延迟消息,RabbitMQ使用死信队列实现延迟消息,RabbitMQ延时队列插件

    假设有一个业务场景:超过30分钟未付款的订单自动关闭,这个功能应该怎么实现? RabbitMQ使用死信队列,可以实现消息的延迟接收。 队列有一个消息过期属性。就像丰巢超过24小时就收费一样,通过设置这个属性,超过了指定事件的消息将会被丢弃。 这个属性交:x-message

    2024年02月13日
    浏览(74)
  • 消息队列之RabbitMQ的安装配置

    RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。点击跳转RabbitMQ官方地址 简单模式,work模式 ,Publish/Subscribe发布与订阅模式,Routing路由模式,

    2024年04月25日
    浏览(38)
  • rabbitmq基础7——队列和消息过期时间设置、死信队列、延迟队列、优先级队列、回调队列、惰性队列

    这里过一个知识点——过期时间,即对消息或队列设置过期时间(TTL)。一旦消息过期,消费就无法接收到这条消息,这种情况是绝不允许存在的,所以官方就出了一个对策——死信队列,死信队列最初出现的意义就是为了应对消息过期丢失情况的手段之一。 那么过期时间具

    2024年02月03日
    浏览(71)
  • 【Java】微服务——RabbitMQ消息队列(SpringAMQP实现五种消息模型)

    微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应。 异步通讯:就像发邮件,不需要马上回复。 两种方式各有优劣,打电话可以立即得到响应,但是你却不能跟多个人同时通话。发送邮件可以同时与多个人收发邮件,但是往往响应会有延迟。 1.

    2024年02月08日
    浏览(60)
  • RabbitMQ-网页使用消息队列

    几种模式 从最简单的开始 添加完新的虚拟机可以看到,当前admin用户的主机访问权限中新增的刚添加的环境 1.1查看交换机 交换机列表中自动新增了刚创建好的虚拟主机相关的预设交换机。一共7个。前面两个 direct类型的交换机,一个是(AMQP default)还有一个是amq.direct,它们

    2024年02月07日
    浏览(40)
  • RabbitMQ 消息队列使用

    同步调用优点: 时效性强,立即得到结果 缺点: 耦合度高 新业务新需求到来时,需要修改代码 性能和吞吐能力下降 调用服务的响应时间为所有服务的时间之和 资源浪费 调用链中的服务在等待时不会释放请求占用的资源 级联失败 一个服务执行失败会导致调用链后续所有服务失

    2024年01月21日
    浏览(46)
  • 前端小白也能懂!实时消息小红点学会使用 RabbitMQ 推送消息

    在Web应用程序中使用实时消息推送可以为用户提供更好的体验。例如,在聊天室或社交媒体上,用户会看到其他用户发送的消息的实时更新,这提高了用户参与感,并为用户提供了方便。实时消息推送技术在许多场景中都是必不可少的,比如在线游戏,实时股票报价等。 实时

    2024年02月08日
    浏览(37)
  • Hyperf使用RabbitMQ消息队列

    Hyperf连接使用RabbitMQ消息中间件 使用Docker部署RabbitMQ,-传送门 使用Docker部署Hyperf,-传送门- 安装amqp扩展 安装command命令行扩展 配置参数 假设已经在rabbitmq设置了交换机exchange_test和队列queue_test 新建 /config/autoload/amp.php配置文件,修改地址和用户名密码 创建生产者中间件 exch

    2024年02月13日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包