RabbitMQ部署指南及入门demo
Posted 这人有丶厉害呀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RabbitMQ部署指南及入门demo相关的知识,希望对你有一定的参考价值。
初识MQ
同步调用与异步调用的优缺点
同步调用会出现的问题:
- 耦合度高(每次加入新的需求,都要修改原来的代码)
- 性能下降(调用者需要等待服务提供者的响应,如果调用链过长则响应时间等于每次调用的时间之和)
- 资源浪费(调用链中的每个服务在等待响应的过程中,不能释放请求占用的资源,高并发发场景下会极度浪费系统资源)
- 级联失败(如果服务提供者出现了问题,所有调用方都会跟着出问题,导致整个微服务故障)
异步通讯则解决了大部分问题
其优点有耦合度低、吞吐量提升、故障隔离、流量削封等
但是缺点是:
- 依赖与Broker的可靠性、安全性、吞吐能力
- 架构复杂,业务没有明确的流程线,不好追踪管理
什么是MQ
MQ(Message Queue),中文时消息队列,字面上来看就是存放消息的队列。也就是事件驱动架构中的Broker
下面时比较常见的MQ具体实现
单机部署
我们在Centos7虚拟机中使用Docker来安装。
###下载镜像
docker pull rabbitmq:3-management
安装MQ
执行下面的命令来运行MQ容器:
docker run \\
-e RABBITMQ_DEFAULT_USER=root \\
-e RABBITMQ_DEFAULT_PASS=123456 \\
--name mq \\
--hostname mq1 \\
-p 15672:15672 \\
-p 5672:5672 \\
-d \\
rabbitmq:3-management
完成后在浏览器运行可以看到这样就说明部署成功了(这里用的时docker部署不会的还得去学一下)
用户密码时你刚刚在部署时的那两个 -e 自定义的,下面是登录成功后的界面
RabbitMQ中的几个概念:
- channel:操作MQ的工具
- exchange:路由消息到队列中
- queue: 缓存消息
- virtual host: 虚拟主机,是对queue、exchange等资源的逻辑分组
常见消息模型
MQ的官方中文文档中给出了5个MQ的Demo示例,对应了几种不同的在用法:
-
基本消息队列(BasicQueue)
-
工作消息队列 (WorkQueue)
-
发布订阅(Publish、Subscribe),有根据交换机类型不同分为三组:
- Fanout Exchange:广播
- Direct Exchange: 路由
- Topic Exchange: 主题
Hello World 案例
官方的HelloWorld是基于最基础的消息队列模型来实现的,只包括三个角色:
- publisher: 消息发布者,将消息发送到队列queue
- queue: 消息队列,负责接收并缓存消息
- consumer: 订阅队列,出列队列中的消息
我们通过黑马提供的案例来学习一下(这是完整的项目结构,就是一个springboot的父工程里包含两个子工程)
这是publisher的test中的完整测试代码(可以带断点debug,在每次创建之后返回MQ查看是否创建成功)
package cn.itcast.mq.helloworld;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.junit.Test;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class PublisherTest
@Test
public void testSendMessage() throws IOException, TimeoutException
// 1.建立连接
ConnectionFactory factory = new ConnectionFactory();
// 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码
factory.setHost("0.0.0.0"); //这里写你的ip
factory.setPort(5672);
factory.setVirtualHost("/");
factory.setUsername("root");
factory.setPassword("123456");
// 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();
消息发送成功:
idea中控制台
MQ中消息条数为一
点击消息每次进入后点击Get Message 可以查看消息
这是consumer的test中的完整测试代码(可以带断点debug,在每次创建之后返回MQ查看是否创建成功)
package cn.itcast.mq.helloworld;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class ConsumerTest
public static void main(String[] args) throws IOException, TimeoutException
// 1.建立连接
ConnectionFactory factory = new ConnectionFactory();
// 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码
factory.setHost("47.109.80.212");
factory.setPort(5672);
factory.setVirtualHost("/");
factory.setUsername("hyq");
factory.setPassword("123456");
// 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("等待接收消息。。。。");
消息发送成功:
idea中控制台
MQ中消息条数为零,可见消息以及被消费者消费了。
以上是关于RabbitMQ部署指南及入门demo的主要内容,如果未能解决你的问题,请参考以下文章