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

對於目前大多的.NET項目,其實使用的技術棧都是差很少,估計如今不多用控件開發項目的了,畢竟一大堆問題。對.NET的項目,目前比較適合的架構ASP.NET MVC,ASP.NET WebAPI,ORM(較多Dapper.NET或者其擴展,稍大一些的項目用EF等等),爲了提升速度也會採用緩存(.NET自帶的Memcache,或者Redis),請求較多的項目,使用Nginx作負載均衡和使用隊列等等。html

   上面簡單的介紹一下.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的相關特色和模式,更多的知識就再也不介紹,須要瞭解安裝和配置,能夠進入官網進行細緻的瞭解。app

二.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

相關文章
相關標籤/搜索