(精華2020年6月24日更新)asp.net core3.1實戰篇 RabbitMQ的使用二(環境搭建和初步使用)

上篇已經安裝完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

配置權限

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

查看用戶權限

rabbitmqctl list_user_permissions admin

設置tag

rabbitmqctl set_user_tags admin administrator

刪除用戶(安全起見,刪除默認用戶)

rabbitmqctl delete_user guest

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();
        }
    }
}

創建一對一消費者

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();
        }
    }
}

一對一的消費隊列咱們就此創建完成,下一節開始RabbitMQ的高級用法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章