EasyNetQ使用(二)【連接RabbitMQ,SSL連接,Logging】


 

如果你連接過關系數據庫,例如SQL Server。你會發現EasyNetQ處理connections有點奇怪。和關系數據庫通訊一直都是通過client開始的。Client 打開一個連接, 發出一個SQL命令,如有必要時,處理結果,然后關閉連接。一般建議是你維持一個打開的連接,時間要盡可能短,通過API斷開連接池。

諸如與RabbitMQ這樣的消息代理會話,是有些不同的,因為連接傾向於在應用的整個生命周期內保持連接狀態。通常你打開一個連接,創建一個訂閱,然后打開連接后,等待消息到來。EasyNetQ不能保證代理在所有的時間都是可用的。相反它使用了延遲連接的方法,在后台線程輪詢終結點,直到連接成功。假如服務器出於任何原因連接斷開了(可能是網絡故障,或許是RabbitMQ Server自身的原因斷開了),EasyNetQ將恢復輪詢終結點直到重新連接成功。

標准的做法是在你應用的生命周期內只創建一個IBus實例.當你的應用關閉后Dispose掉它。
延遲連接到RabbitMQ服務器是通過IBus接口表示的。大部分EasyNetQ操作都是IBus上的方法。創建一個IBus實例如下:

var bus = RabbitHutch.CreateBus("host=myServer;virtualHost=myVirtualHost;username=mike;password=topsecret")
  • 1

這個連接字符串是由鍵值對組成,格式如下 key=value, 通過分號;分隔。只有一個必選的字段是host.可能的連接字符串值是:

host(例如 host=localhost 或 host=192.168.2.56 或 host=myhost.mydomain.com)這個字段是必選的。如要具體指定你要連接服務器端口,你用標准格式 host:port(例如:host=myhost.com:5673)。假如你省略了端口號,AMQP默認端口是5672.連接到RabbitMQ集群,需要指定每一個集群節點用逗號分隔(例如:host:myhost1.com,myhost2.com,myhost3.com).更多詳情請參考Cluster Support

virtualhost(例如:virtualHost=myVirturalHost)默認虛擬主機是’/’

username(例如:username=mike)默認是’guest’(對於非’localhost’主機你需要使用其他用戶名)

password (例如:password=mysecret)默認為’guest’

requestedHearbeat(例如:requestHearbeat=10)默認為10秒鍾。沒有心跳設置為0

prefetchcount(例如:prefetchcount=1) 默認為50.這個值是在EasyNetQ發送ack之前發送給RabbitMQ的消息數。不限制設置為0(不推薦). 為了在消費者之間保持公平和平衡設置為1.

publisherConfirms(例如:publisherconfirms=true)默認是false。 如何開啟Publisher Confirms?

persistentMessages(例如:persistentMessages=false)默認為true。這個決定了在發送消息時采用什么樣的delivery_mode。 false=1,true=2. 設置為trueRabbitMQ將會把消息持久化到磁盤,並且在服務器重啟后仍會存在。設置為false可以提高性能收益。

product(例如:product=我的現實中重要的服務)在EasyNetQ 0.27.3中被引進。默認值是Bus的實例名。
此處輸入的值將顯示在RabbitMQ的后台管理界面中。

platform(例如:platform=my.fully.qualified.domain.name)在EasyNetQ 0.27.3中被引進。默認值是運行着客戶端處理Bus的實例的機器的主機名。此處輸入的值將會線上在RabbitMQ管理端界面中。

timeout(例如:timeout=60)模式值為10秒。在EasyNet 0.17中被引進。可解析類型為System.UInt16從0到65535范圍內的值。不限制超時時間設置為0.當超時事時拋出System.TimeoutException.

關閉連接,只要簡單的dispose,如下:

bus.Dispose();

 

這樣就關閉了EasyNetQ使用過的連接、管道、消費者和所有其他資源。


EasyNetQ可以通過SSL進行連接。這篇指南的作者Gordon Coulter最初為回應一個提問寫的。

首先,你必須仔細依據https://www.rabbitmq.com/ssl.html文章中的步驟。我花費了很多時間嘗試讓openssl這部分能運作起來,然后為了讓他按我的需要去運作而不僅僅只是一個demo,我又花費了很多時間。

第一次通過SSLEasyNetQ運作時,在他們為了測試而做的可以運行的頁面上的那點DotNet代碼給我提供了很大幫助。我有一個簡單的控制台程序,包涵了RabbitEasyNetQ代碼,會在下面展示。此外使用了Rabbit logs

當你連接上后,管理界面的connection頁面會顯示一個小的SSL協議標簽。你也在Overview 選項卡的端口監聽表里看到443端口。
這里寫圖片描述
代碼如下:

var connection = new ConnectionConfiguration(); connection.Port = 443; connection.UserName = "user"; connection.Password = "pass"; connection.Product = "SSLTest"; var host1 = new HostConfiguration(); host1.Host = "rmq1.contoso.com"; host1.Port = 443; host1.Ssl.Enabled = true; host1.Ssl.ServerName = "rmq1.contoso.com"; host1.Ssl.CertPath = "c:\\tmp\\myclient.p12"; host1.Ssl.CertPassphrase = "secret"; var host2 = new HostConfiguration(); host2.Host = "rmq2.contoso.com"; host2.Port = 443; host2.Ssl.Enabled = true; host2.Ssl.ServerName = "rmq2.contoso.com"; host2.Ssl.CertPath = "c:\\tmp\\myclient.p12"; host2.Ssl.CertPassphrase = "secret"; connection.Hosts = new List<HostConfiguration> { host1, host2 }; connection.Validate(); //VERY IMPORTANT - DOES CONFIG AS WELL AS VALIDATION! var Bus = RabbitHutch.CreateBus(connection, services => services.Register<IEasyNetQLogger>(logger => new DoNothingLogger()));

 

 

盡管在ConnectionConfiguration上有一個Ssl選項屬性,但在HostConfiguration對象上設置Ssl選項屬性是一個合適的地方。HostConfiguration對象上設置SSL選項可以支持集群的場景。注意,在上面代碼中我們指定了兩個HostConfiguration對象。假如一個掛了,EasyNetQ的持續連接功能將自動連接到下一個可用的主機。在這個主機上配置SSL在連接時就不會出現任何錯誤。

假如你僅僅指定一個主機,你可以選擇通過HostConfiguration對象去設置SSL選項,也可以直接用ConnectionConfiguration對象去設置。

不要忘記調用Validate()方法。我最初跳過那兒(基本上我寫的都是硬編碼,因此可能沒有什么錯誤需要驗證)。但是,這個方法調用實際上回去應用一系列設置,為了確保連接運行是必要的。

SslOption詳情參見文檔SslOption Class

你可以嘗試用官方的RabbitMQ .NET client去配置和測試,嘗試去運行示例。首先要闡明,在你的項目做任何修改前,所有這些設置都被正確的描述在Official RabbitMQ SSL documentation for .NET.


EasyNetQ提供了一個Logger接口 IEasyNetQLogger

public interface IEasyNetQLogger { void DebugWrite(string format,params object[] args); void InfoWrite(string format, params object[] args); void ErrorWrite(string format, params object[] args); void ErrorWrite(Exception exception); }

 

Logging 默認是關閉的,NullLogger作為IEasyNetQLogger的具體實現被注冊進去。

有一個控制台Logger(ConsoleLogger)可以用來做測試或調試。但是,它或許不能在生產環境系統中使用。調試級別的Logging是非常詳細的,記錄了所有信息,會對你的應用有性能上的影響。並且,這可能對於那些在AMQPEasyNetQ方面沒有深入了解的人來說沒有多大意義。

你應該提供自己的基於IEasyNetQLogger實現,記錄日志信息和錯誤信息到自己的應用日志中。RabbitHutch.CreateBus方法提供了overloads方法,允許你替換成自己的日志組件。參看Replacing EasyNetQ Components.你可以使用這個方法注冊自己的LoggerBus中。示例如下:

var logger = new MyLogger();// IEasyNetQLogger實現。 var bus = RabbitHutch.CreateBus(“我的連接字符串”,x => x.Register<IEasyNetQLooger>(_ => looger));

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM