NServiceBus翻譯之Hosting(一):The NServiceBus Host

小弟季義欽發表於2013-08-27

Last Updated: Apr 03, 2013 08:46AM IDT

假如你已經寫了太多次同樣的config程式碼(譯者注:應該是指NServiceBus的那些初始化程式碼),假如你想要將你的終結點寄宿(host)到windows服務中,那麼NServiceBus.Host.exe能夠為你做這些事情,並且作為控制檯程式執行。
要使開發者去改變沒有程式碼的技術,管理員需要友好地設定許可權和賬戶,host精簡服務開發以及部署。
下面是NServiceBus host能夠為你帶來的一些特性:


Overview

如果你正在實現一些後端的訊息處理,那麼你就不需要去寫自己的宿主程式了。 只需要引用NServiceBus.Host.exe,以及寫一個繼承自IConfigureThisEndpoint 的類,明確是否想要server或者client行為(下面會介紹),這就夠了。

為了F5以及debug你的終結點,確保你已經改變了這個編譯設定,右擊選擇屬性就可以設定:


選擇啟動行為設定好'NServiceBus.Host.exe' 在你的工程中的 /bin/debug 中的路徑,這個設定只針對單個使用者,如果想要這個設定作用於所有開發者,可以參考官網。

下面開始介紹NServiceBus.Host.exe如何讀取配置:


Configuration

Host如何知道應該使用哪個配置檔案呢?下面來說說這個過程:

NServiceBus.Host.exe首先掃描執行時路徑,載入DLLs到記憶體中,然後在這些程式集中搜尋一個實現了介面IConfigureThisEndpoint的類, 然後持有這個類的程式集的名稱就會被用於建立assembly.dll.config ,這個檔案就是用於配置的。

你可以通過包含一個名為'NServiceBus.Host.exe.config'的檔案去告訴host使用哪個類這種方式來跳過這個掃描過程,在這個檔案中你可以明確實現了IConfigureThisEndpoint 這個介面的類,就像下面這樣:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<appSettings>

<add key="EndpointConfigurationType" value="YourNamespace.YourTypeName,YourAssembly"/>

</appSettings>

</configuration>


File Scanning

預設地NServiceBus會掃描檔案以找到實現了它的介面的類,這個過程是獨立於host的檔案掃描行為的,發生在l 'NServiceBus.Configure.With()'呼叫的內部。

如果你想要明確NServiceBus使用哪個程式集,你也需要去設定container。通過實現下面Container部分描述的IWantCustomInitialization介面可以做到這點。 在它的初始化方法中你可以利用正確的方法過載:

Configure.With(string probeDirectory)

Configure.With(params Assembly[] assemblies)

Configure.With(IEnumerable<Type> typesToScan)

記住NServiceBus程式集總是在掃描過程中被包含進來,因為它們對於NServiceBus的正確執行時必要的。


Logging

假如你想要改變host使用的日誌記錄基礎設施,那就實現IWantCustomLogging 這個介面,並且在它的初始化方法中做一些特定的設定。 為了讓NServiceBus使用你的日誌記錄方式,你需要使用描在loggingdocumentation中的NServiceBus.SetLoggingLibrary.Log4Net API ,如下所示:

class MyEndpointConfig :IConfigureThisEndpoint, IWantCustomLogging

{

public void Init()

{

// setup your logging infrastructure then call

NServiceBus.SetLoggingLibrary.Log4Net(null, yourLogger);

}

}

有可能你想要明確不同的日誌級別,或者不同的目標,Host提供了一種機制去改變這些排列,而不需要任何程式碼或者配置檔案的修改,可以通過profiles來實現,這裡page有描述。


Custom Initialization and Startup

在標準的NServiceBus的初始化過程的開始,你有可能想要初始化你自己的元件。NServiceBus使得你可以這樣去做,直到所有初始化完成才開始處理訊息。

在上面所描述的掃描的檔案之外,Host會尋找實現了INeedInitialization的類,呼叫它的Init()方法,最好的做法是對於每一個組建都有一個獨立的初始化類,想要多少類都可以,但是你不要做任何關於他們的呼叫順序的假設。

如果要改變一些核心的設定,比如程式集掃描,容器,序列化格式等,你需要在EndPoint的配置類(the same class which implements IConfigureThisEndpoint)裡面實現IWantCustomInitialization ,這樣做要求你編寫Configure.With()...這樣的配置表示式。

確保不要再你的初始化方法中進行任何啟動行為。

啟動行為應該在初始化完成之後再開始做,對於這樣,NServiceBus將會呼叫實現了介面IWantToRunWhenTheBusStarts的類。

適合在IWantToRunWhenTheBusStarts 實現類中啟動的例子是開啟Windows Form應用程式的主視窗。在Windows服務的後端,像Web爬蟲,資料探勘,批量處理等都應該在IWantToRunWhenTheBusStarts 的實現類中拉開序幕。

Containers and Dependency Injection

預設Host將會利用Autofac 作為它內建的容器(依賴注入框架)。 假如你想要使用一個不同的容器,你需要在實現了IConfigureThisEndpoint介面的類中實現介面IWantCustomInitialization,然後提供給NServiceBus一個介面卡物件,正如這裡page所描述。 下面是一個設定Castle Windsor作為容器的例子:

class EndpointConfig : IConfigureThisEndpoint,AsA_Server, IWantCustomInitialization

{

public void Init()

{

NServiceBus.Configure.With()

.CastleWindsorBuilder()

.XmlSerializer(); // or BinarySerializer()

}

}

If you omit the serialization configuration XML will beused by default. The rest of the code specifying transport, subscriptionstorage, and other technologies isn't here. This is due to the AsA_Serverbuilt-in configuration described below.(譯者注:這段翻譯待深入之後補充)


Built-in Configurations

儘管NServiceBus允許你選擇使用哪種技術,以及怎麼樣去配置它們,但是Host已經把這些選擇打包成為了三個內建的選項:

AsA_Client, AsA_Server, and AsA_Publisher

所有這幾個選項都利用了XmlSerializer,the MsmqTransport, 以及 the UnicastBus. 不同的地方在於每個選項是怎麼配置它們的:

AsA_Client設定MsmqTransport為非事務性,啟動的時候會清除訊息佇列。 這就意味著每次啟動都是完全重新整理,不會記住崩潰之前的任何事情。此外,它會使用自己的許可權來處理訊息,而不是訊息傳送者的許可權。

AsA_Server設定MsmqTransport為事務性的,啟動的時候不會清楚佇列中的訊息,這使得它具備容錯性。 此外,它會在訊息處理者的許可權之下處理訊息,這樣可以防止許可權攻擊。

AsA_Publisher繼承自AsA_Server,而且還指示用於儲存subscription request的基礎設施,更多細節描述詳見theprofiles page.

Installation

為了將你的程式安裝為一個windows服務,你需要在命令列傳遞/install到host,預設地服務的名字就是你的終結點的名稱,預設地終結點的名稱是你的終結點配置類的名稱空間。傳遞/install 將會引起host去呼叫installers. 你可以像下面這樣覆蓋這個特性,以及明確額外的安裝細節::

USAGE:

NServiceBus.Host.exe [/install [/serviceName]

[/displayName]

[/description]

[/endpointConfigurationType]

[/endpointName]

[/installInfrastructure]

[/scannedAssemblies]

[/dependsOn]

[/sideBySide]

[/startManually]

[/username]

[/password]]

[/uninstall [/serviceName]

[/sidebyside]

[/instance:Instance Name ]

通過執行下面的命令列可以獲取這個列表:
> NServiceBus.Host.exe /?

Specifying/serviceName: 你的服務咋登錄檔中的真實的名稱,與顯示在Windows服務管理器中的名稱不同。

Specifying/displayName: 顯示在Windows服務管理器中的服務名稱。 假如你不設定這個,而是設定了/serviceName,,那麼顯示名稱將不會使用/serviceName ,而是使用上面的預設描述。

Specifying/description: 描述你的服務,顯示在Windows 服務管理器中。

‘Instance’標誌允許你安裝多個同一個服務的多個例項,但是要提供給每個例項不同的例項名稱,例如:: /instance:Instance5.

預設地,Windows服務會在系統啟動的時候自動啟動,假如你想要你的服務這樣,你需要增加/startManually到/install命令。

為了明確你希望你的服務執行在哪個賬戶之下,需要床底使用者名稱和密碼到這個賬戶。

下面是一個使用/install安裝命令的例子:

NServiceBus.Host.exe /install /serviceName:"MyPublisher"

/displayName:"MyPublisher Service"

/description:"Servicefor publishing event messages"

/endpointConfigurationType:"YourEndpointConfigType.YourNameSpace,YourAssembly"

/username:"corp\serviceuser"

/password:"p@ssw0rd!" NServiceBus.Production

解除安裝的話呼叫NServiceBus.Host.exe /uninstall:

NServiceBus.Host.exe [/uninstall[/serviceName] [/instance]]

下面是一個解除安裝的例子:

NServiceBus.Host.exe /uninstall/serviceName:YourServiceName /instance:YourInstanceName

呼叫infrastructure installers,你需要使用/installInfrastructure switch來執行你的host,Learn aboutinstallers

相關文章