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

目錄:html

  1、什麼是RabbitMQdocker

  2、RabbitMQ運用場景瀏覽器

  3、RabbitMQ優點及特色安全

  4、Centos7中Docker安裝RabbitMQ異步

  5、.Net Core 中使用RabbitMQ性能


 

1、什麼是RabbitMQspa

RabbitMQ是什麼? --"RabbitMQ是基於AMQP協議的隊列服務",.設計

什麼是AMQP?-- Advanced Message Queue,高級消息隊列協議。它是應用層協議的一個開放標準,爲面向消息的中間件設計,基於此協議的客戶端與消息中間件可傳遞消息,並不受產品、開發語言等條件的限制。代理

能夠理解RabbitMQ是實現了高級消息隊列協議(AMQP)的開源消息代理軟件(也能夠叫面向消息的中間件)code

2、RabbitMQ運用場景

消息通信—由於其自己就是基於AMQP協議的隊列服務,也就能夠用於單純的消息通信,實現點對點的消息通信或者聊天。

提速提性能—異步處理,不須要及時同步處理而且比較耗時,減小請求響應時間

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

3、RabbitMQ優點及特色

可靠—RabbitMQ具備持久化,傳輸確認,發佈確認等機制。保證了消息的安全性,一旦發送了消息,就算接收者接收不到,它也會保存信息,一直到接收者接收消息爲止

複用性—RabbitMQ能夠發送多種類型消息

異步處理(提速)—把消息傳給中間件,中間件後續慢慢處理,同時也可達到削峯的效果

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


 

4、Centos7中Docker安裝RabbitMQ

 如何在Linux中安裝能夠看前段時間的一篇文章--https://www.cnblogs.com/hulizhong/p/10702367.html

先拉取鏡像(選擇帶有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.


 

5、.Net Core 中使用RabbitMQ

RabbitMQ使用的話能夠分爲三個步驟

一、 建立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;
        }
    }

 

二、 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()是能夠進行重寫的,本身定義如何去鏈接 

三、 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,還有一些其餘的屬性必要之時均可以加入進來的。能夠高度擴展的。

相關文章
相關標籤/搜索