RabbitMQ入门

同步调用和异步调用

1.同步调用(类似视频通话,只能接一个的视频通话)

优点:时效性较强,可以立即得到结果

微服务间基于Feign的调用属于同步方式

存在问题

  • 耦合度高(每次加入新的需求,都要修改原来的代码)
  • 性能下降(调用者需要等待服务提供者响应)
  • 资源浪费(调用链中每个服务在等待响应过程中,不能释放请求占用的资源)
  • 级联失败(如果服务提供者出现问题,所以调用方都会跟着出问题)

2.异步调用(类似微信聊天,可以接收多个人发的消息)

常见的实现:事件驱动模式

在这里插入图片描述

优点:

  • 耦合度低
  • 性能提升,吞吐量提高
  • 服务没有强依赖,不担心级联失败问题
  • 流量削峰

缺点:

  • 依赖于Broker的可靠性、安全性、吞吐能力
  • 架构复杂了,业务没有明显的流程线,不好追踪管理

MQ

一.了解MQ

存放消息的队列,也就是事件驱动架构中的Broker

RabbitMQActiveMQRocketMQKafka
公司/社区RabbitApache阿里Apache
开发语言ErlangJavaJavaScala&Java
协议支持AMQP,XMPP,SMTP,STOMPOpenWire,STOMP,
REST,XMPP,AMOP
自定义协议自定义协议
可用性一般
单机吞吐量一般非常高
消息延迟微秒级毫秒级毫秒级毫米以内
消息可靠性一般一般

二.RabbitMQ快速入门

1.单机部署RabbitMQ

Centos7虚拟机中使用Docker来安装

1.1下载镜像

开启Centos7虚拟机,使用XShell连接

#启动docker
sudo systemctl start docker
#在线拉取RabbitMQ
sudo docker pull rabbitmq:3-management

在这里插入图片描述

1.2安装MQ

执行下面命令来运行MQ容器:

sudo docker run -d \
-e RABBITMQ_DEFAULT_USER=itcast \
-e RABBITMQ_DEFAULT_PASS=123321 \
--name mq \
--hostname mql \
-p 15672:15672 \
-p 5672:5672 \
rabbitmq:3-management

注意:若出现如下报错

[roo@localhost ~]$ sudo systemctl start docker
[sudo] roo 的密码:
[roo@localhost ~]$ sudo docker run -d \
> -e RABBITMQ_DEFAULT_USER=itcast \
> -e RABBITMQ_DEFAULT_PASS=123321 \
> --name mq \
> --hostname mql \
> -p 15672:15672 \
> -p 5672:5672 \
> rabbitmq:3-management
docker: Error response from daemon: Conflict. The container name "/mq" is already in use by container "741a06aa779f2589174a5d5da7de026b6af9a922c00d53610c9868b2e507e58c". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.

是因为一个名为mq的容器在运行了,则执行一下命令后,再执行RabbitMQ容器启动命令:

sudo docker stop mq
sudo docker rm mq

在这里插入图片描述

访问虚拟机对外IP:15672,我的是【http://192.168.174.129:15672/】

账号:itcast

密码:123321

在这里插入图片描述

三.常见消息模型

  • 基本消息队列(BasicQueue
  • 工作消息队列(BasicQueue

在这里插入图片描述

  • 发布订阅(PublishSubscribe),又根据交换机类型不同分为三种:
    • Fanout Exchange:广播
    • Direct Exchange:路由
    • Topic Exchange:主题

在这里插入图片描述

1HelloWord:代码方式

只包括三个角色:

在这里插入图片描述

//发布者
public class PublisherTest {
    @Test
    public void testSendMessage() throws IOException, TimeoutException {
        // 1.建立连接
        ConnectionFactory factory = new ConnectionFactory();
        // 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码
        factory.setHost("192.168.174.129");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("itcast");
        factory.setPassword("123321");
        // 1.2.建立连接
        Connection connection = factory.newConnection();

        // 2.创建通道Channel
        Channel channel = connection.createChannel();

        // 3.创建队列
        String queueName = "simple.queue";
        channel.queueDeclare(queueName, false, false, false, null);

        // 4.发送消息
        String message = "hello, rabbitmq!";
        channel.basicPublish("", queueName, null, message.getBytes());
        System.out.println("发送消息成功:【" + message + "】");

        // 5.关闭通道和连接
        channel.close();
        connection.close();

    }
}

先运行发布者的代码,hello,rabbitmq!缓存在消息队列中

在这里插入图片描述

在这里插入图片描述

//消费者
public class ConsumerTest {

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.建立连接
        ConnectionFactory factory = new ConnectionFactory();
        // 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码
        factory.setHost("192.168.174.129");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("itcast");
        factory.setPassword("123321");
        // 1.2.建立连接
        Connection connection = factory.newConnection();

        // 2.创建通道Channel
        Channel channel = connection.createChannel();

        // 3.创建队列
        String queueName = "simple.queue";
        channel.queueDeclare(queueName, false, false, false, null);

        // 4.订阅消息
        channel.basicConsume(queueName, true, new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope,
                                       AMQP.BasicProperties properties, byte[] body) throws IOException {
                // 5.处理消息
                String message = new String(body);
                System.out.println("接收到消息:【" + message + "】");
            }
        });
        System.out.println("等待接收消息。。。。");
    }
}

再运行消费者的代码后,消息队列中的hello,rabbitmq!就消失了(异步)

在这里插入图片描述

2HelloWordRabbitMQ控制台

2.1:创建一个新的消息队列hello.queue

在这里插入图片描述

2.2:进入默认的amp.fanout交换机

在这里插入图片描述

2.3:交换机绑定消息队列

在这里插入图片描述

2.4:发送消息

在这里插入图片描述

2.5:查看缓存在队列中的消息

在这里插入图片描述

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RabbitMQ是一款使用Erlang语言开发的开源消息中间件,实现了AMQP(高级消息队列协议)。它具有以下特点: 1. 可靠性:支持持久化、传输确认、发布确认等机制,保证了消息的可靠性。 2. 灵活的消息分发策略:消息在进入RabbitMQ之前由交换机进行路由,可以根据不同的分发策略进行消息的分发,包括简单模式、工作队列模式、发布订阅模式、路由模式、通配符模式等。 3. 支持集群:多台RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker,提高了可用性和扩展性。 4. 支持多种协议和语言客户端:RabbitMQ支持多种消息队列协议,如STOMP、MQTT等,同时也支持多种编程语言的客户端。 5. 可视化管理界面:RabbitMQ提供了一个易用的用户界面,方便用户监控和管理消息Broker。 6. 插件机制:RabbitMQ提供了许多插件,可以通过插件进行扩展,也可以编写自己的插件。 要开始使用RabbitMQ,首先需要安装RabbitMQ并配置相关信息。在Windows系统中,可以按照官方文档的指引进行安装。在配置文件中,需要指定RabbitMQ的主机、端口、用户名和密码等信息。 参考资料: \[1\] RabbitMQ官网 \[2\] application.yml配置文件 \[3\] RabbitMQ入门指南文章 希望这些信息对你有帮助! #### 引用[.reference_title] - *1* *2* *3* [超详细的RabbitMQ入门](https://blog.csdn.net/Rok728/article/details/123106242)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值