1. 程式人生 > >簡單易用的.NET免費開源RabbitMQ操作組件EasyNetQ解析

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

return 虛擬 void del exceptio 簡單的 ont activemq function

對於目前大多的.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解析