Skip to main content
Parentix Blog

Parentix Blog

Search
Home
  
Parentix Blog > Posts > WCF is de basis voor ServiceBus  

There are no items in this list.
November 08
WCF is de basis voor ServiceBus

In een eerdere blog hebben we al gemeld dat we bezig zijn met het opbouwen van een ServiceBus structuur.

De komende tijd zullen we regelmatig verslag doen van de ontwikkelingen, de pijnpunten en onze oplossingen. Deze post is de eerste post in deze reeks.

De gehele ServiceBus en alle aanverwante onderdelen worden ontwikkeld op het Microsoft .NET 4.0 platform.

WCF

Als basis voor onze ServiceBus hebben we gekozen voor WCF services. Deze services worden gehost in een eigen Windows Service of in Internet Information Services (IIS).

Aangezien de infrastructuur bestaat uit meerdere netwerken en domeinen die gescheiden zijn door firewalls, kunnen niet alle machines direct met elkaar communiceren. WCF heeft hier een mooie oplossing voor: Routing Services. Hiermee kunnen verbindingen overgezet worden naar andere types (net.tcp –> http), maar ook kan de beveiliging aangepast worden.
In ons geval was deze optie een oplossing om toch over netwerken en domeinen heen berichten uit te wisselen.

Beveiliging

Aan de beveiliging en veiligheid worden door Parentix hoge eisen gesteld. En dus ook aan onze implementatie van de ServiceBus.
De communicatie tussen WCF services kan op vele manieren worden beveiligd. Wij hebben gekozen voor een beveiliging op basis van certificaten. De diverse client- en serveronderdelen gebruiken hun eigen type certificaat, waardoor je niet zomaar een applicatie kan toevoegen aan de ServiceBus. Zonder certificaat zal geen enkel onderdeel je berichten accepteren.
Naast deze ‘signing’ functionaliteit maken we ook gebruik van encryptie. De totale inhoud van het bericht is dus ook niet meer leesbaar op het netwerk. WCF kent hier ook een aantal technieken voor, maar aangezien we toch al certificaten hebben wordt de encryptie geregeld met certificaten.

Host en Agents

Een ServiceBus kan in diverse vormen worden opgebouwd. In de post over de haalbaarheid voor Parentix is hier al over geschreven. De uiteindelijke vorm die wij aan het realiseren zijn is hierover weergegeven.

image

Er is een centrale Host waar alle berichten terecht komen. Deze regelt de distributie. De Agent wordt op iedere server in het netwerk geïnstalleerd. Om de communicatie over netwerkgrenzen en firewalls mogelijk te maken wordt op een aantal gateway servers ook de Routing Service geïnstalleerd.

Afnemers (andere applicaties die gebruik willen maken van functionaliteit) sturen een bericht naar de Host. Deze Host kijkt aan de hand van instellingen welke Agents (aanbieders) het bericht kunnen verwerken en welke dan ook werkelijk beschikbaar zijn. De Host stuurt het bericht vervolgens door en als de Agent klaar is met de verwerking gaat het antwoord via de omgekeerde weg weer terug naar de Afnemer.

Echter zijn er vele functionaliteiten te bedenken welke niet aan een server/agent gebonden zijn. Misschien wil je functionaliteit wel op iedere server in het netwerk uitvoeren. Of op alle servers binnen een domein. Die functionaliteit wordt ook door de Host geregeld. Een afnemer kan zelf aangeven of het bericht naar 1 server, naar een heel domein of naar alle servers gestuurd moet worden.

Plug-ins

De functionaliteit die wordt aangeboden door de Agents bestaat uit lossen .NET assemblies. Bij het starten kijkt een Agent welke assemblies er allemaal beschikbaar zijn en of deze functionaliteit bevatten die uitgevoerd mag worden.
Deze controle wordt gedaan aan de hand van een aantal criteria:

  1. Is de assemblies gesigned met onze plug-in key
  2. Is de functionaliteit van onze base class

Ook hier dus weer een stukje ingebouwde veiligheid om te voorkomen dat er ongecontroleerd functionaliteit kan worden toegevoegd.

In code ziet de controle er als volgt uit:

For Each dllFile As String In Directory.GetFiles(privateFileFolder, "*.dll")     Dim name As AssemblyName = AssemblyName.GetAssemblyName(dllFile)     Dim pk() As Byte = name.GetPublicKey()     If (pk Is Nothing) Then         Continue For     End If     If (pluginPublicKey <> Convert.ToBase64String(pk)) Then         Continue For     End If     Dim assembly As Assembly = assembly.LoadFrom(dllFile)     Try         GetPluginObjects(assembly)     Catch ex As Exception         Log(Logging.LOG_SEVERITY.LogWarning, "Error on loading plugin”)     End Try
Next

Op dit moment hebben we ervoor gekozen om alle plug-ins op iedere Agent neer te zetten. In theorie kan dus iedere Agent alle functionaliteiten uitvoeren. Omdat er soms afhankelijkheden zijn met andere software die op de server geïnstalleerd moet zijn kan dit echter niet. Om dit op te lossen gebruikt de Host een aantal configuratie instellingen om berichten bij de juiste Agents af te leveren.

Vervolg

De volgende post zal ingaan op onze Enterprise Services. Deze services zijn centraal beschikbaar binnen alle netwerken en bieden onder andere logging en configuratie services.

Comments

There are no comments for this post.