首頁 > 軟體

RabbitMQ的介紹及使用進階(Docker+.Net Core)

2020-06-16 16:34:39

一、什麼是RabbitMQ

RabbitMQ是什麼? --"RabbitMQ是基於AMQP協定的佇列服務"。

什麼是AMQP?-- Advanced Message Queue,高階訊息佇列協定。它是應用層協定的一個開放標準,為訊息導向中介層設計,基於此協定的用戶端與訊息中介軟體可傳遞訊息,並不受產品、開發語言等條件的限制。

可以理解RabbitMQ是實現了高階訊息佇列協定(AMQP)的開源訊息代理軟體(也可以叫訊息導向中介層)

二、RabbitMQ運用場景

訊息通訊—因為其本身就是基於AMQP協定的佇列服務,也就可以用於單純的訊息通訊,實現對等的訊息通訊或者聊天。

提速提效能—非同步處理,不需要及時同步處理並且比較耗時,減少請求響應時間

流量削峰—流量過大,應用容易掛掉,可使用佇列來處理。

三、RabbitMQ優勢及特點

可靠—RabbitMQ具有持久化,傳輸確認,發布確認等機制。保證了訊息的安全性,一旦傳送了訊息,就算接收者接收不到,它也會儲存資訊,一直到接收者接收訊息為止

復用性—RabbitMQ可以傳送多種型別訊息

非同步處理(提速)—把訊息傳給中介軟體,中介軟體後續慢慢處理,同時也可達到削峰的效果

解耦--防止引入過多的API給系統的穩定性帶來風險;呼叫方使用不當會給被呼叫方系統造成壓力,被呼叫方處理不當會降低呼叫方系統的響應能力。

四、CentOS 7中Docker安裝RabbitMQ

 如何在Linux中安裝可以參考 https://www.linuxidc.com/Linux/2019-07/159426.htm

先拉取映象(選擇帶有mangement的版本)

docker pull rabbitmq:management

然後檢視映象拉取情況

docker images

啟動容器同時設定賬號密碼

docker run  --name=rabbit  -p 15672:15672 -p 5672:5672  -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin  -d  rabbitmq:management

檢視容器執行情況 

docker ps

執行成功,然後我們就去瀏覽器看看能否存取ip:15672

然後輸入剛剛輸入的賬號密碼登入進去就可以檢視訊息佇列的整體情況,到這裡RabbitMQ已經安裝好了,接下來我們看看如何在.Net Core中使用RabbitMQ.

--------------------------------------------------------------------------------

五、.Net Core 中使用RabbitMQ

RabbitMQ使用的話可以分為三個步驟

1、 建立RabbitMQ的連線

  public class ConnectionMQ
    {
        /// <summary>
        /// 建立MQ連線
        /// </summary>
        /// <returns></returns>
        public static IConnection Connection()
        {
            //建立連線工廠 
            ConnectionFactory factory = new ConnectionFactory
            {
                UserName =  “admin”,//使用者名稱
                Password =” admin”,//密碼
                HostName = “127.0.0.1”//rabbitmq ip
            };
            //建立連線
            var connection = factory.CreateConnection();
            return connection;
        }
    }

2、 RabbitMQ傳送訊息

   public class PushMQ
      {
    /// <summary>
    /// 傳送MQ訊息
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="item"></param>
    /// <param name="queueName"></param>
        public static void SendMQ<T>(T item,string queueName)
        {
            string input = Newtonsoft.Json.JsonConvert.SerializeObject(item);
            using (var channel = ConnectionMQ.Connection().CreateModel())
            {
                //宣告一個佇列
                channel.QueueDeclare(
                  queue: queueName,//佇列名稱
                  durable: true,//佇列是否持久化
                  exclusive: false,//是否排外的
                  autoDelete: false,//是否自動刪除
                  arguments: null//訊息什麼時候自動
                );                                 
                    var sendBytes=Encoding.UTF8.GetBytes(input);
                    var properties = new BasicProperties();
                    properties.DeliveryMode = 2;// 設定訊息是否持久化,1: 非持久化 2:持久化
                    //發布訊息
                    channel.BasicPublish(
                      exchange: "",
                      routingKey: queueName,
                      mandatory: true,
                      basicProperties: properties,
                      body: sendBytes);
            }
        }
    }

在這裡連線的ConnectionMQ.Connection().CreateModel()是可以進行重寫的,自己定義如何去連線

3、 RabbitMQ接收訊息 

  public class ReceiveMQ
      {
        /// <summary>
        /// 接收MQ訊息
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="func"></param>
        /// <param name="queueName"></param>
        public static void GetMQ<T>(Func<T,bool> func,string queueName)
        {
            //建立連線
            var connection = ConnectionMQ.Connection();
            //建立通道
            var channel = connection.CreateModel();
            //事件基本消費者
            EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
                //接收到訊息事件
                consumer.Received += (ch, ea) =>
                {
                    var message = Encoding.UTF8.GetString(ea.Body);
                    try
                    {
                        var item = JsonConvert.DeserializeObject<T>(message);
                        func(item);
                    }
                    catch (Exception ex)
                    {
                        LogHelp.Error(ex);
                    }
                    //確認該訊息已被消費
                    channel.BasicAck(ea.DeliveryTag, false);
                };
                //啟動消費者 設定為手動應答訊息
                channel.BasicConsum、e(queueName, false, consumer);
        }
    }

4、檢視訊息

在這裡我們傳送訊息,然後我們去ip+15672看看是否有未消費的訊息。

發現有一條未消費的資訊,佇列名稱是Test,正好是我們剛剛傳送的訊息。

然後我們去消費這一條資訊,再次進入ip+15672看看

剛剛的一條訊息的確被消費掉了。其中GetInfo方法可以穿插自己的很多的業務邏輯的處理。到這裡也就簡單的介紹了下如何在.Net Core中使用RabbitMQ,還有一些其他的屬性必要之時都可以加入進來的。可以高度擴充套件的。

RabbitMQ二進位制和RPM安裝部署與常用命令  https://www.linuxidc.com/Linux/2019-03/157355.htm


IT145.com E-mail:sddin#qq.com