1.RabbitMQ简介

因为RabbitMQ是基于开源的AMQP协议来实现的,所以在了解MQ时候,首先我们来了解下AMQP协议。AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端或者中间件不同产品、不同的开发语言等条件的限制,也就是说消息生产者无需知道消费者如何处理消息结果,反之亦然,解耦了组件跟组件依赖。RabbitMQ服务器端用Erlang语言编写,同时也支持多种客户端来开发跨语言消息传递,例如:Java,.NET,PHP,Python,JavaScript,Ruby,Go等。RabbitMQ
还支持多种消息传递协议、消息排队、传递确认、队列的灵活路由、多种交换类型。还支持分布式集群以实现高可用性和吞吐量。适用于排队算法、秒杀活动、消息分发、异步处理、数据同步、处理耗时任务、CQRS等应用场景。还可以通过HTTP-API命令行工具和用于管理和监视RabbitMQ的UI。

2.RabbitMQ在CentOS 7安装

因为我对Linux运维知识面比较薄弱,所以在Linux上部署RabbitMQ这块暂时不想耗太多时间在这上面去(后续有时间再深入了解),这里我完全是跟着园区Net大神晓晨大佬这篇文章(https://www.cnblogs.com/stulzq/p/7551819.html)去部署的。网上也有很多RabbitMQ在Linux部署文章参考,大家也可以自行度娘。

//安装服务端erlang语言
rpm -Uvh https://www.rabbitmq.com/releases/erlang/erlang-19.0.4-1.el7.centos.x86_64.rpm
//安装socat
yum install socat
//安装服务端RabbitMQ
rpm -Uvh https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.12/rabbitmq-server-3.6.12-1.el7.noarch.rpm

3.RabbitMQ服务端常用命令

//启用Web管理平台
rabbitmq-plugins enable rabbitmq_management
//开启服务
systemctl start rabbitmq-server.service
//停止服务
systemctl stop rabbitmq-server.service
//查看服务状态
systemctl status rabbitmq-server.service
//查看RabbitMQ状态
rabbitmqctl status
//添加用户赋予管理员权限
rabbitmqctl add_user tom
rabbitmqctl set_user_tags tom administrator
//查看用户列表
rabbitmqctl list_users
//删除用户
rabbitmqctl delete_user username
//修改用户密码
rabbitmqctl oldPassword Username newPassword

4.访问RabbitMQ Web管理平台

当启用RabbitMQ Web管理平台,我们根据部署CentOS 7系统的IP在浏览器上打开http://IP:15672,如果新增了用户,一定要设置新增用户的VirtualHost的权限,不然客户端调用RabbitMQ时候会报错!具体处理方法如下截图:
//未设置权限时


点解设置权限即可。
如果访问显示404,则是防火墙把通讯给过滤掉了,请执行命令把防火墙关闭掉再打开,以下我列出所有CentOS 7关于防火墙命令:

//查看防火状态
systemctl status firewalld
//暂时关闭防火墙
systemctl stop firewalld
//永久关闭防火墙
systemctl disable firewalld
//重启防火墙
systemctl enable firewalld
//永久关闭后重启
chkconfig iptables on 

关闭防火墙之后,在浏览器上就会看到下面管理平台界面:

5.NET Core使用RabbitMQ

通过nuget安装:https://www.nuget.org/packages/RabbitMQ.Client/

5.1定义生产者

class Program
{
static void Main(string[] args)
{
string queueName = "DirectExchangeQueueName";
string routeKey = "DirectExchangeQueueName";
//创建连接工厂
var factory = new ConnectionFactory
{
UserName = "dengwu",//用户名
Password = "",//密码
HostName = "192.168.112.133",//rabbitmq ip
}; //创建连接
var connection = factory.CreateConnection();
//创建通道
var channel = connection.CreateModel();
//声明一个队列
channel.QueueDeclare(queueName, false, false, false, null); Console.WriteLine("\nRabbitMQ连接成功,请输入消息,输入exit退出!"); string input;
do
{
input = Console.ReadLine(); var sendBytes = Encoding.UTF8.GetBytes(input);
//发布消息
channel.BasicPublish("", routeKey, null, sendBytes); } while (input.Trim().ToLower() != "exit");
channel.Close();
connection.Close();
}
}

5.2定义消费者

class Program
{
static void Main(string[] args)
{
string queueName = "DirectExchangeQueueName";
//创建连接工厂
var factory = new ConnectionFactory
{
UserName = "dengwu",//用户名
Password = "",//密码
HostName = "192.168.112.133",//rabbitmq ip
}; //创建连接
var connection = factory.CreateConnection();
//创建通道
var channel = connection.CreateModel();
//事件基本消费者
var consumer = new EventingBasicConsumer(channel); //接收到消息事件
consumer.Received += (ch, ea) =>
{
var boby = ea.Body;
var message = Encoding.UTF8.GetString(boby.ToArray()); Console.WriteLine($"收到消息: {message}");
//确认该消息已被消费
channel.BasicAck(ea.DeliveryTag, false);
//Console.WriteLine($"收到该消息[{ea.DeliveryTag}] 延迟10s发送回执");
//Thread.Sleep(10000);
//Console.WriteLine($"已发送回执[{ea.DeliveryTag}]");
};
//启动消费者 设置为手动应答消息
channel.BasicConsume(queueName, false, consumer);
Console.WriteLine("消费者已启动");
Console.ReadKey();
channel.Dispose();
connection.Close();
}
}

运行:

通过启动一个生产者,一个消费者,我们可以看到,生产者通过RabbitMQ决定投递消息给对应消费者。

5.3RabbitMQ消费失败的处理

RabbitMQ采用消息应答机制,即消费者收到一个消息之后,需要发送一个应答,然后RabbitMQ才会将这个消息从队列中删除,如果消费者在消费过程中出现异常,断开连接没有发送应答,那么RabbitMQ会将这个消息重新投递,下面我们将消费者接收到消息事件代码修改如下:

//接收到消息事件
consumer.Received += (ch, ea) =>
{
var boby = ea.Body;
var message = Encoding.UTF8.GetString(boby.ToArray()); Console.WriteLine($"收到该消息[{ea.DeliveryTag}] 延迟10s发送回执");
Thread.Sleep();
Console.WriteLine($"已发送回执[{ea.DeliveryTag}]");
};

先在生产者里面预先传递三个消息:


如果我们设置了消息应答延迟10s,如果在这10s中,该消费者断开了连接,那么消息会被RabbitMQ重新投递的。具体大家可以自行测试。

6.总结

该章节主要简单介绍RabbitMQ概念在Linux上简单部署,接下来章节,我会陆续介绍AMQP Messaging中的基本概念跟Exchange(交换机)。

参考文献:
RabbitMQ官网
.NET Core 使用RabbitMQ

(1)RabbitMQ简介与安装的更多相关文章

  1. RabbitMQ简介及安装

    AMQP简介 AMQP AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是进程之间传递异步消息的网络协议. AMQP工作过程 发布者(Publisher ...

  2. RabbitMQ学习笔记(1)----RabbitMQ简介与安装

    ·1. 什么是RabbitMQ? RabbitMQ是流行的开源消息队列系统,用erlang语言开发.RabbitMQ是AMQP(高级消息队列协议)的标准实现. 而AMQP协议则是指:即Advanced ...

  3. RabbitMQ简介、安装、基本特性API--Java测试

    新的阅读体验地址:http://www.zhouhong.icu/post/141 本篇文章所有的代码:https://github.com/Tom-shushu/Distributed-system ...

  4. RabbitMQ详解(一)------简介与安装(Docker)

    RABBITMQ详解(一)------简介与安装(DOCKER) 刚刚进入实习,在学习过程中没有接触过MQ,RabbitMQ 这个消息中间件,正好公司最近的项目中有用到,学习了解一下. 首先什么是MQ ...

  5. RabbitMQ 入门 (Go) - 1. 简介和安装

    Message Broker(消息代理) 维基百科对 Message Broker 的定义是:Message broker 是一种中介程序模块,它把消息从发送方的正式消息传递协议转化为接收方的正式消息 ...

  6. RabbitMQ简介

    AMQP简介 在了解RabbitMQ之前,首先要了解AMQP协议.AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消 ...

  7. Redis 小白指南(一)- 简介、安装、GUI 和 C# 驱动介绍

    Redis 小白指南(一)- 简介.安装.GUI 和 C# 驱动介绍 目录 简介 安装 入门指令 GUI 工具 C# 驱动介绍 简介 ANSI C 编写,开源,基于内存,可持久化,一个键值对的数据库, ...

  8. RabbitMQ消息队列之一:RabbitMQ的环境安装及配置

    RabbitMQ简介: MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们 ...

  9. Springboot 1.5.x 集成基于Centos7的RabbitMQ集群安装及配置

    RabbitMQ简介 RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件). RabbitMQ是一套开源(MPL)的消息队列服务软件,是由LShift提供的一 ...

随机推荐

  1. Java实现 LeetCode 809 情感丰富的文字 (暴力)

    809. 情感丰富的文字 有时候人们会用重复写一些字母来表示额外的感受,比如 "hello" -> "heeellooo", "hi" ...

  2. Java实现 LeetCode 390 消除游戏

    390. 消除游戏 给定一个从1 到 n 排序的整数列表. 首先,从左到右,从第一个数字开始,每隔一个数字进行删除,直到列表的末尾. 第二步,在剩下的数字中,从右到左,从倒数第一个数字开始,每隔一个数 ...

  3. Java实现 LeetCode 389 找不同

    389. 找不同 给定两个字符串 s 和 t,它们只包含小写字母. 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母. 请找出在 t 中被添加的字母. 示例: 输入: s = " ...

  4. Java实现 LeetCode 316 去除重复字母

    316. 去除重复字母 给定一个仅包含小写字母的字符串,去除字符串中重复的字母,使得每个字母只出现一次.需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置). 示例 1: 输入: " ...

  5. SQL Server实现 LeetCode 176 第二高的薪水

    176. 第二高的薪水 SQL架构 编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) . +----+--------+ | Id | Salary | +----+- ...

  6. springboot实现定时任务,异步操作,统一结果返回,全局异常处理,拦截器及事务处理

    本文是作者原创,版权归作者所有.若要转载,请注明出处. 本文都是springboot的常用和实用功能,话不多说开始吧 定时任务 1.启动类开启注解 @EnableScheduling //开启基于注解 ...

  7. String 的格式化

    使用场景 用于生成redis等key-value 结构的key的格式化,方便管理 eg: String.format(RedisKeys.PURCHASE_ADD_BABY_LOCK,form.get ...

  8. Jmeter环境部署

    一.安装jdk 下载jdk 双击jdk-8u211-windows-x64.exe,默认下一步安装 我的电脑-属性-高级系统设置-环境变量 在“系统变量”出,新建”JAVA_HOME”,配置jdk的安 ...

  9. 总结:PgSql备份pg_dump与还原pg_restore

    备份还原方法:pg_dump和pg_restore,先仔细说明这两个命令,再记录我的操作方法. 远程复制scp: #which scp  /usr/bin/scp #rpm -qf /usr/bin/ ...

  10. electron-vue报错:Webpack ReferenceError: process is not defined

    electron-vue报错:Webpack ReferenceError: process is not defined 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总 ...