簡單易用的.NET免費開源RabbitMQ操作組件EasyNetQ解析

來源:互聯網
上載者:User

標籤:containe   highlight   處理   nbsp   使用   nginx   logs   介面   郵件   

對於目前大多的.NET項目,其實使用的技術棧都是差不多,估計現在很少用控制項開發項目的了,畢竟一大堆問題。對.NET的項目,目前比較適合的架構ASP.NET MVC,ASP.NET WebAPI,ORM(較多Dapper.NET或者其擴充,稍大一些的項目用EF等等),為了提高速度也會採用緩衝(.NET內建的Memcache,或者Redis),請求較多的項目,使用Nginx做負載平衡和使用隊列等等。

   上面簡單的介紹一下.NET的項目的技術架構,具體的技術根據具體的需求做出選擇。介紹到隊列,很多人都會很熟悉,例如MSMQ,RabbitMQ等等隊列。既然需要使用隊列,那就要考慮如何使用C#更好的操作隊列。

一.RabbitMQ概述

   在現在的項目中,訊息佇列的使用比較的頻繁,訊息佇列的種類也較多,如:ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等。訊息佇列中介軟體是分布式系統中重要的組件,主要解決應用耦合,非同步訊息,流量削鋒等問題。實現高效能,高可用,可伸縮和最終一致性架構。是大型分布式系統不可缺少的中介軟體。

   在這裡主要介紹RabbitMQ訊息佇列,支援開放的進階訊息佇列協議 (AMQP)。RabbitMQ的特點:強大的應用程式訊息傳遞;使用方便;運行在所有主要作業系統上;支援大量開發人員平台;開源和商業支援。訊息佇列的模式有兩種模式:P2P(Point to Point),P2P模式包含三個角色:訊息佇列(Queue),寄件者(Sender),接收者(Receiver)。每個訊息都被發送到一個特定的隊列,接收者從隊列中擷取訊息。隊列保留著訊息,直到他們被消費或逾時。Publish/Subscribe(Pub/Sub),包含三個角色主題(Topic),發行者(Publisher),訂閱者(Subscriber) 。多個發行者將訊息發送到Topic,系統將這些訊息傳遞給多個訂閱者。

   上面介紹了RabbitMQ的相關特點和模式,更多的知識就不再介紹,需要瞭解安裝和配置,可以進入官網進行細緻的瞭解。

二.EasyNetQ組件概述

    上面介紹了RabbitMQ的應用情境和使用的模式,在.NET的項目開發中,較多的使用MSMQ作為訊息佇列,很多人對於MSMQ的操作比較熟悉,也屬於輕量級的訊息佇列。對於RabbitMQ是較為重量級的訊息佇列,有多個語言的版本,作為.NET開發人員對於RabbitMQ的操作可能就比較少。在.NET項目中如何更方便的使用RabbitMQ,在這裡就介紹一個.NET操作RabbitMQ的組件EasyNetQ。

    EasyNetQ的目標是提供一個使.NET中的RabbitMQ儘可能簡單的庫。在EasyNetQ中訊息應由.NET類型表示,訊息應通過其.NET類型進行路由。EasyNetQ按訊息類型進行路由。發布訊息時,EasyNetQ會檢查其類型,並根據類型名稱,命名空間和裝配體給出一個路由密鑰。在消費方面,使用者訂閱類型。訂閱類型後,該類型的訊息將路由到訂戶。預設情況下,EasyNetQ使用Newtonsoft.Json庫將.NET類型序列化為JSON。這具有訊息是人類可讀的優點,因此您可以使用RabbitMQ管理應用程式等工具來調試訊息問題。

   EasyNetQ是在RabbitMQ.Client庫之上提供服務的組件集合。這些操作可以像序列化,錯誤處理,線程編組,串連管理等。它們由mini-IoC容器組成。您可以輕鬆地用自己的實現替換任何組件。因此,如果您希望XML序列化而不是內建的JSON,只需編寫一個ISerializer的實現並將其註冊到容器。

   以下是官方提供的一個結構圖,這個結構圖可以很好的解析該組件的結構:

 

三.EasyNetQ組件使用方式

   介紹完畢EasyNetQ組件的相關背景,現在就要介紹一下該組件的使用方式。EasyNetQ組件的使用方式比較簡單,跟很多組件都類似,例如:建立串連,進行操作做等等,對於EasyNetQ組件也是如此。

   1.建立串連:

var bus = RabbitHutch.CreateBus(“host=myServer;virtualHost=myVirtualHost;username=mike;password=topsecret”);

    與RabbitMQ伺服器的延遲串連由IBus介面表示,建立串連的方式連接字串由格式為key = value的鍵/值對組成,每一個用分號(;)分隔。host:主機地址;virtualHost:預設是預設的虛擬機器主機‘/‘;username:使用者名稱,預設為‘guest‘;password:密碼,預設是‘guest‘;

   2.關閉串連:

bus.Dispose();

   要關閉串連,只需簡單地處理匯流排,這將關閉EasyNetQ使用的串連,渠道,消費者和所有其他資源。

   3.發布訊息:

var message = new MyMessage { Text = "Hello Rabbit" };bus.Publish(message);

   4.訂閱郵件:

bus.Subscribe<MyMessage>("my_subscription_id", msg => Console.WriteLine(msg.Text));

   5.遠端程序呼叫:

var request = new TestRequestMessage {Text = "Hello from the client! "};bus.Request<TestRequestMessage, TestResponseMessage>(request, response =>     Console.WriteLine("Got response: ‘{0}‘", response.Text));

   6.RPC伺服器:

bus.Respond<TestRequestMessage, TestResponseMessage>(request =>     new TestResponseMessage{ Text = request.Text + " all done!" });

   7.記錄器:

var logger = new MyLogger() ;var bus = RabbitHutch.CreateBus(“my connection string”, x => x.Register<IEasyNetQLogger>(_ => logger));

   8.路由:

bus.Subscribe("my_id", handler, x => x.WithTopic("X.*"));

    RabbitMQ具有非常好的功能,基於主題的路由,允許訂閱者基於多個標準過濾訊息。*(星號)匹配一個字。#(雜湊)匹配為零個或多個單詞。

四.EasyNetQ組件核心對象解析

    上面簡單的介紹了一下該組件的應用方式,還有比較多的方式沒有做介紹,又需要的可以做深入的瞭解。在這裡介紹一下該組件的一些核心的對象。

  1.RabbitHutch.CreateBus():

 public static IBus CreateBus(ConnectionConfiguration connectionConfiguration, AdvancedBusEventHandlers advancedBusEventHandlers, 
Action<IServiceRegister> registerServices) { Preconditions.CheckNotNull(connectionConfiguration, "connectionConfiguration"); Preconditions.CheckNotNull(advancedBusEventHandlers, "advancedBusEventHandlers"); Preconditions.CheckNotNull(registerServices, "registerServices"); var container = createContainerInternal(); if (container == null) { throw new EasyNetQException("Could not create container. " + "Have you called SetContainerFactory(...) with a function that returns null?"); } connectionConfiguration.Validate(); container.Register(_ => connectionConfiguration); container.Register(_ => advancedBusEventHandlers); registerServices(container); ComponentRegistration.RegisterServices(container); return container.Resolve<IBus>(); }

   在RabbitHutch類中主要包含的方法是CreateBus()方法,具有12個重載。該方法主要根據使用者的串連配置資訊,串連服務端。該方法接收三個參數,connectionConfiguration表示串連執行個體,advancedBusEventHandlers用於添加處理常式的AdvancedBusEventHandlers執行個體到新建立的IBus.Advanced”的事件。registerServices覆蓋預設服務。 ComponentRegistration.RegisterServices(container);在我們內部的超簡單IoC容器中註冊預設的EasyNetQ組件。container.Resolve<IBus>()擷取所請求的服務的執行個體。 注意所有服務都是單例的,多次通話Resolve將返回相同的執行個體。

   2.IBus.Publish():

  public virtual void Publish<T>(T message, Action<IPublishConfiguration> configure) where T : class        {            Preconditions.CheckNotNull(message, "message");            Preconditions.CheckNotNull(configure, "configure");            var configuration = new PublishConfiguration(conventions.TopicNamingConvention(typeof(T)));            configure(configuration);            var messageType = typeof(T);            var easyNetQMessage = new Message<T>(message)            {                Properties =                {                    DeliveryMode = messageDeliveryModeStrategy.GetDeliveryMode(messageType)                }            };            if (configuration.Priority != null)                easyNetQMessage.Properties.Priority = configuration.Priority.Value;            if (configuration.Expires != null)                easyNetQMessage.Properties.Expiration = configuration.Expires.ToString();            var exchange = publishExchangeDeclareStrategy.DeclareExchange(advancedBus, messageType, ExchangeType.Topic);            advancedBus.Publish(exchange, configuration.Topic, false, easyNetQMessage);        }

     該方法用於發布訊息,該方法是一個虛方法,在子類中可以被重寫。 var configuration = new PublishConfiguration(conventions.TopicNamingConvention(typeof(T)))用於定義發布資訊的配置,Message定義郵件內文內容。

五.總結

   以上是對該組件的簡單的介紹,如果需要瞭解更多的內容可以自己去深入的學習和研究。知識在於自己的勤奮,他人只是一個簡單的引導。

 

原文連結:http://www.cnblogs.com/pengze0902/p/6654296.html

簡單易用的.NET免費開源RabbitMQ操作組件EasyNetQ解析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.