(精华)2020年8月6日 RabbitMQ 环境搭建和初步使用(.net core版本)

举报
愚公搬代码 发表于 2021/10/19 01:12:43 2021/10/19
【摘要】 上篇已经安装完Erlang,继续安装RabbitMQ 1. RabbitMQ是啥 RabbitMQ是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, ST...

上篇已经安装完Erlang,继续安装RabbitMQ

1. RabbitMQ是啥

RabbitMQ是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正因如此,它非常重量级,更适合于企业级的开发。同时实现了Broker构架,这意味着消息在发送给客户端时先在中心队列排队。对路由,负载均衡或者数据持久化都有很好的支持。

它支持开放的高级消息队列协议 (AMQP,Advanced Message Queuing Protocol),从根本上避免了生产厂商的封闭,使用任何语言的各种客户都可以从中受益。这种协议提供了相当复杂的消息传输模式,所以基本上不需要MassTransit或NServiceBus的配合。它还具有“企业级”的适应性和稳定性。这些东西对我的客户来说十分的有吸引力。

RabbitMQ的整体架构
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2. 为什么要用RabbitMQ消息队列

消息队列是啥:消息队列(Message Queue),一种先进先出的队列结构,用于处理Message。
消息队列解决的问题:在处理大量并发请求时,同步处理往往会发生阻塞,特别是在更新数据库或者调用其他组件时。消息队列能够实现请求的异步处理、应用解耦、流量削锋和消息通讯,同时能够有效防止阻塞导致的消息丢失。
消息队列系统,一般都包含3个角色:队列服务端,队列的生产者,队列的消费者。这种架构与当下流行的分布式架构极为契合。

3. 如何安装RabbitMQ

1:安装RabbitMQ(下载地址:https://www.rabbitmq.com/install-windows.html)
2:安装完RabbitMQ-------将安装目录sbin添加到环境目录中的Path中
3:在Powershell中执行:rabbitmq-plugins list
4:安装RabbitMQ可视化管理端:rabbitmq-plugins enable rabbitmq_management
5:启动服务后访问http://localhost:15672默认的账户密码都是guest
6:修改或者删除该用户(建议先修改密码,然后添加用户,添加之后再删除guest用户,或者直接改一个密码吗保留guest用户)
7:添加一个Admin用户,名称随便,密码随便,角色选择Admin
8:添加完之后刷新Users列表会看到该用户,接下来配置hosts
9:新建一个testhost,然后点击testhost,进入host配置页面,在Permissions选项中添加admin 的访问权限
10:回到Users页面可以看到如上的列表,至此RabbitMQ配置完成

4:上述的操作可以通过以下命令完成

查看所有用户

rabbitmqctl list_users

  
 
  • 1

配置权限

rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"

  
 
  • 1

查看用户权限

rabbitmqctl list_user_permissions admin

  
 
  • 1

设置tag

rabbitmqctl set_user_tags admin administrator

  
 
  • 1

删除用户(安全起见,删除默认用户)

rabbitmqctl delete_user guest

  
 
  • 1

5. RabbitMQ的队列形式

在使用RabbitMQ之前,咱们先捋一捋RabbitMQ一共有几种使用方式,常用的5中队列

  1. 第一种:简单队列(一对一模式)耦合性高,生产消费一一对应。
  2. 第二种:WorkQueues(工作队列),一个生产,多个消费者共同处理消息。
  3. 第三种:订阅模式,1一个生产者多个消费者,每一个消费者有自己的一个队列,生产者直接将消息发送给交换机,交换机将消息发送给队列,每一个队列都需要绑定到交换机。这种模式可以满足消费者发布一个消息,多个消费者消费同一信息的需求,但C1、C2消费的都是相同的数据,有时我们需要C1和C2消费的信息只有部分差异,比如我们需求:C1消费增加的数据,C2消费编辑、增加和删除的数据。
  4. 第四种:路由模式,路由模式是在订阅模式基础上的完善,可以在生产消息的时候,加入Key值,与key值匹配的消费者消费信息。但路由模式中,就如三中提到的C1、C2、如果C2对应的类型更多,就需要写很多key值。但其实它只与C1有一点差别。
  5. 第五种:通配符模式是在路由模式的升级,他允许key模糊匹配。*代表一个词,#代表一个或多个词。通过通配符模式我们就可以将C1对应的一个key准确定为item.add。而C2我们就不需要一一写出key值,而是用item.#代替即可。

6. .net Core3.1使用RabbitMQ

创建生产者

using RabbitMQ.Client;
using System;
using System.Text;

namespace RabbitMQTest
{
    /// <summary>
    /// 生产者
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            //创建连接工厂
            ConnectionFactory factory = new ConnectionFactory
            {
                UserName = "admin",//用户名
                Password = "lmt456123",//密码
                HostName = "localhost"//rabbitmq ip
            };

            //创建连接
            var connection = factory.CreateConnection();
            //创建通道
            var channel = connection.CreateModel();
            //声明一个队列
            channel.QueueDeclare("hello", false, false, false, null);
            Console.WriteLine("\nRabbitMQ连接成功,请输入消息,输入exit退出!");
            string input;
            do
            {
                input = Console.ReadLine();
                var sendBytes = Encoding.UTF8.GetBytes(input);
                //发布消息
                channel.BasicPublish("", "hello", null, sendBytes);
            }
            while (input.Trim().ToLower() != "exit");
            channel.Close();
            connection.Close();
        }
    }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

创建一对一消费者

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;

namespace RabbitMQConsumer
{
    /// <summary>
    /// 消费者
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            //创建连接工厂
            ConnectionFactory factory = new ConnectionFactory
            {
                UserName = "admin",//用户名
                Password = "lmt456123",//密码
                HostName = "localhost"//rabbitmq ip
            };
            //创建连接
            var connection = factory.CreateConnection();
            //创建通道
            var channel = connection.CreateModel();
            //事件基本消费者
            EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
            //接收到消息事件
            consumer.Received += (ch, ea) =>
            {
                string message = Encoding.Default.GetString(ea.Body.ToArray());

                Console.WriteLine($"收到消息: {message}");

                // Console.WriteLine($"收到该消息[{ea.DeliveryTag}] 延迟10s发送回执");
                // Thread.Sleep(10000);
                //确认该消息已被消费
                channel.BasicAck(ea.DeliveryTag, false);
                // Console.WriteLine($"已发送回执[{ea.DeliveryTag}]");
            };
            //启动消费者 设置为手动应答消息
            channel.BasicConsume("hello", false, consumer);
            Console.WriteLine("消费者已启动");
            Console.ReadKey();
            channel.Dispose();
            connection.Close();
        }
    }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

一对一的消费队列咱们就此创建完成,下一节开始RabbitMQ的高级用法

文章来源: codeboy.blog.csdn.net,作者:愚公搬代码,版权归原作者所有,如需转载,请联系作者。

原文链接:codeboy.blog.csdn.net/article/details/107831610

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。