標籤: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解析