Follow Us on Twitter

Mule, een open source Enterprise Service Bus

Inleiding

Een van de belangrijkste componenten binnen een service-georiënteerde architectuur is de Enterprise Service Bus, kortweg ESB. Belangrijke taken van een ESB zijn o.a. ontkoppeling van services d.m.v. service virtualisatie en transformatie van berichten van en naar een canoniek datamodel.

De grote middleware spelers als Oracle, IBM en Microsoft bieden elk hun eigen ESB oplossing: Oracle Service Bus, Websphere ESB en Microsoft Biztalk. Naast deze proprietary oplossingen, bestaan er ook diverse open source alternatieven. Een van de meest gebruikte is Mule. Dit Whitebook geeft een overzicht van de eigenschappen en toepassingen van deze veelzijdige en volwassen service bus.

Op het moment van dit schrijven is Mule versie 3 beschikbaar. Belangrijke wijzigingen t.o.v. versie 2 zijn o.a. cloud integratie en een versimpelde configuratie. Mule is beschikbaar als community edition (gratis) en als enterprise edition. De enterprise edition biedt als extra’s o.a. formeel support, een service registry, een management console en de Mule Data Integrator, een grafische tool voor datatransformaties.

Mule integratie

Mule biedt out-of-the-box ondersteuning voor de integratie tussen een groot aantal veel gebruikte transport protocollen en berichtformaten. Zo worden o.a. JMS, HTTP, JDBC, SMTP, POP3 en XMPP ondersteund. Berichtformaten die ondersteund worden zijn o.a. XML/SOAP en Java objecten. Daarnaast biedt Mule ondersteuning voor integratie met REST services, SAP en Amazon Web Services.

M.b.v. Mule is het mogelijk om andere topologiën dan een ESB te realiseren zoals Hub & Spoke, PTP, en ESN (Enterprise Service Network). Bij Hub & Spoke valt te denken aan een Mule instantie (hub) die diverse bronnen (spokes) pollt voor nieuwe data en deze, al dan niet getransformeerd, doorstuurt naar verschillende applicaties (spokes). Een voorbeeld van een ESN is bv. een WAN van diverse Mule instanties waarbij elke instantie intelligent genoeg is om berichten door te routeren naar de dichtsbijzijnde service. Geclusterde configuraties zijn ook mogelijk.

Indien voor een specifiek protocol of berichtformaat geen standaard Mule component voorhanden is, dan is er nog geen man overboord. Mule heeft een levendige community, MuleForge genaamd, en de kans is groot dat deze de benodigde component al ontwikkeld heeft. Uiteraard is het ook mogelijk om een eigen Mule component te onwikkelen.

Mule configuratie

Een Mule project bestaat uit een of meerdere zgn. Mule configuratie files. Dit zijn XML bestanden waarbinnen op declaratieve wijze de benodigde integratie componenten worden opgenomen. Een groot voordeel hierbij is dat je je puur kan richten op het integratievraagstuk en niet allerlei “plumbing” code hoeft te schrijven, welke niet direct iets met het vraagstuk te maken heeft (bv. de java code voor het opzetten van een JDBC connectie, indien je met een database wilt integreren).

Veel van de Mule componenten kunnen zowel globaal als lokaal (binnen een ander component) gedefinieerd worden binnen een configuratie. Daarnaast is het ook mogelijk om parent-child relaties tussen Mule configuratiefiles te definiëren. Dit geeft je veel vrijheid voor het modulair opzetten van complexere configuraties.

Een Mule configuratie file maakt onder water gebruik van Spring en de file zelf is eigenlijk niets meer dan een Spring configuratie file. Spring is een Java framework voor het ontwikkelen van enterprise applicaties. Het gaat voor dit Whitebook te ver om dieper op Spring in te gaan. Op internet is genoeg informatie over Spring beschikbaar voor de geïnteresseerden. Het belangrijkste voordeel is dat Mule gebruik kan maken van funtionaliteit die Spring out-of-the-box aanbiedt. Dit betekent o.a. dat er gebruik kan worden gemaakt van Dependency Injection. Een Mule custom component (zie verderop) kan bv. als een Spring Bean geïnjecteerd worden in een Mule configuratie. Ook kan gebruik worden gemaakt van Spring Security voor het beveiligen van endpoints (zie verderop).

Bovenstaande afbeelding geeft een voorbeeld van de belangrijkste componenten binnen een Mule configuratie. De model component is het topelement binnen een Mule configuratie en bevat alle benodigde configuratie voor het oplossen van een compleet integratievraagstuk.

Binnen een model component worden een of meerdere service componenten gedefinieerd. Een service is grofweg verantwoordelijk voor het oplossen van een specifiek integratievraagstuk binnen een groter geheel (bv. de integratie van een SOAP bericht over HTTP naar een RDBMS tabel).
De overige componenten, de zgn. core components worden hieronder verder uitgewerkt.

Mule core componenten

De core componenten van Mule maken het o.a. mogelijk om inkomende berichten door te routeren naar een uitgaande bestemming, berichten te filteren, te transformeren naar een ander formaat, berichtinformatie te loggen en wat dies meer zij.

Connectors/Endpoints

Een endpoint is de logische plek waar een bericht binnenkomt (inbound), dan wel naar toe wordt gestuurd (outbound). In het geval van een HTTP endpoint is dit bv. een REST url of een SOAP endpoint, bij JMS is dit een queue of een topic.

Een endpoint kan lokaal binnen een router (zie verder) gedefinieerd worden, of globaal binnen een configuratie, waardoor er door meerdere routers naar gerefereerd kan worden.

De connector is een transportspecifiek component die gekoppeld is aan een of meerdere endpoints die gebruik maken van hetzelfde transportprotocol. In de connector definitie van een HTTP connector kunnen bv. proxy instellingen (url, username, password) worden vastgelegd.

Routers/Filters

Routers zijn de componenten binnen Mule die in het simpelste geval berichten doorsturen van een inbound endpoint naar een outbound endpoint. De Mule pass-through router is hier een voorbeeld van. Daarnaast is ook geavanceerdere routing mogelijk. Voorbeelden hiervan zijn de chaining router, die een bericht sequentieel door meerdere endpoints stuurt, de multicasting router, die een bericht parallel naar meerdere endpoints stuurt en de collection-aggregation router die berichten van meerdere inbound endpoints kan aggregeren.

Net als bij endpoints, wordt er bij routers ook onderscheid gemaakt tussen inbound en outbound. Inbound routers luisteren naar inbound endpoints en sturen de inkomende berichten door naar components (zie verder) of outbound routers. Outbound routers sturen berichten naar outbound endpoints.

Sommige routers kunnen daarnaast als een berichten filter worden toegepast. Dit geldt zowel voor inbound als voor outbound routers. Zo kan een selective-consumer router gebruikt worden om berichten te filteren en alleen de gefilterde berichten door te sturen. Filtering kan o.a. plaatsvinden op berichttype en berichtinhoud. Berichtinhoud kan o.a. gefilterd worden via een reguliere expressie check, een wildcard check, een xpath expressie check (voor xml berichten) of een jxpath check (voor een java object bericht). Filters kunnen logisch (AND/OR) genest worden waarmee vrij complexe filtering bewerkstelligd kan worden.

Een synchronous inbound endpoint kan optioneel een response bericht retourneren aan de aanroepende service. Daarnaast kan m.b.v. een async-reply router een replybericht asynchroon naar een endpoint worden gestuurd.

Transformers

Transformers binnen een Mule configuratie bevinden zich tussen endpoints en components. Mule transformers zijn veelzijdige componenten. Naast transformatie van de payload van de berichten, zijn er ook transformers waarmee het type bericht omgezet kan worden. Tot slot zijn er ook transformers die de metadata van een bericht (de zgn. properties) kunnen aanpassen.

Een aantal concrete transformers zijn bv.:

  • byte-array-to-object transformer voor het omzetten van berichttypen (van Byte[] naar Object);
  • gzip-(un)compress-transformer voor (de-)compressie van berichten;
  • xslt-transformer voor het transformeren van xml berichten m.b.v. een XSL stylesheet;
  • jms-message-to-object-transformer voor het omzetten van een JMS object naar een standaard java object (bv. een javax.jms.MapMessage naar een java.util.Map).

Components

Met behulp van de eerder genoemde componenten zijn het gros van de integratievraagstukken al op te lossen. Indien deze componenten echter niet toereikend zijn, kan gebruik worden gemaakt van zgn. components. Een component wordt binnen een Mule configuratie geplaatst tussen een inbound en een outbound router. Impliciet is al een bridge component aanwezig, die niets meer doet dan het bericht doorsturen.

Mule biedt daarnaast standaard components voor o.a. het loggen van berichten, het samenstellen van berichten voor een synchrone response en het uitvoeren van remote business logic via bv. een SOAP of REST service. Ook voor components geldt dat Mule de mogelijkheid biedt om er zelf een te bouwen. Een van de mogelijkheden hierbij is om bestaande Spring Beans als componenten te configureren.

Indien het instantiëren van zo’n component een dure operatie is, biedt Mule de mogelijkheid om gebruik te maken van component pooling.

Tot slot kunnen components samengevoegd worden tot een nieuwe component, waarmee ook dit onderdeel van een Mule configuratie een behoorlijke flexibiliteit biedt.

Voorbeeld

Hoe ziet zo’n configuratie er nu precies uit. Onderstaand voorbeeld toont een Mule configuratie waarin een gedeelte van de verschillende genoemde core componenten opgenomen zijn (N.B de xml declaraties zijn weggelaten).

 

<spring:beans>
  <spring:import resource="jms-config.xml"/>
</spring:beans>
<object-to-byte-array-transformer name="ObjectToByteArray" />
<object-to-string-transformer name="ObjectToString" />
<xm:xslt-transformer name="DocbookToFO"
    xsl-file="docbook-xsl/fo/docbook.xsl" />

<model name="publicationModel">
  <service name="publicationService">
    <inbound>
      <http:inbound-endpoint host="localhost" port="8080">
        <transformers>
          <transformer ref="ObjectToByteArray" />
          <transformer ref="DocbookToFO" />
          <transformer ref="ObjectToString" />
        </transformers>
      </http:inbound-endpoint>
    </inbound>
    <log-component>
    <outbound>
      <pass-through-router>
        <jms:outbound-endpoint queue="publicationQueue"
            connector-ref="publicationJmsConnector" />
      </pass-through-router>
    </outbound>
  </service>
</model>

 

Bovenstaande configuratie transformeert een stream die binnenkomt via http (inbound endpoint) en conformeert aan een DocBook formaat, naar een XSL-FO string. Deze string wordt vervolgens middels een component gelogd en tenslotte door een outbound router onveranderd doorgerouteerd naar een JMS queue. Alle transformers zijn globaal gedeclareerd en de JMS configuratie is opgenomen in een aparte configuratie file die via een spring:import wordt opgenomen in de Mule configuratie.

Mule key features

Naast het feit dat er nauwelijks integratie vraagstukken bestaan die niet door Mule kunnen worden opgelost, komt Mule met een groot aantal features die het werk voor o.a. ontwikkelaars en beheerders kunnen vergemakkelijken. Hieronder volgt een opsomming van een aantal belangrijke:

  • Naast een configuratie waarbij een standalone Mule server wordt ingezet, bestaat ook de mogelijkheid om de Mule configuratie te embedden in een java of web applicatie of als JCA resource te deployen;
  • De embedded configuraties waar een Servlet container of JEE server voor nodig is, zijn server onafhankelijk;
  • Er zijn Maven en Eclipse plugins beschikbaar voor Mule;
  • Zoals reeds vermeldt, is Mule op Spring gebaseerd en kan het daarmee gebruik maken van functionaliteit die Spring standaard al biedt, zoals Spring Security;
  • Configuraties zijn makkelijk te unit testen m.b.v. standaard frameworks als JUnit;
  • Omdat zowel de kracht van unit testing als Maven beschikbaar is, kan ook vrij gemakkelijk een build server worden opgetuigd;
  • Er is inmiddels een beta van een op Eclipse gebaseerde grafische ontwikkeltool beschikbaar, genaamd Maven Studio. Deze tool maakt het mogelijk dat configuraties “in elkaar worden geklikt”;
  • Mule biedt JMX ondersteuning, waardoor o.a. monitoring en runtime configuratie mogelijk is;
  • Voor beheerders is er o.a. Mule Galaxy. Mule Galaxy is een governance tool waarmee alle Mule componenten binnen een enterprise beheerd kunnen worden.

Conclusie

In dit Whitebook hebben we een groot aantal onderdelen en eigenschappen van Mule de revue laten passeren.
We hebben gezien dat Mule configuraties declaratief worden opgezet, waarbij het niet nodig is om allerlei “plumbing” code te schrijven. Hiermee kun je je als ontwikkelaar focussen op het integratievraagstuk. Dat configuraties bovendien modulair kunnen worden opgezet, maakt het werken met Mule heel flexibel. Het ondersteunt daarnaast het DRY (Don’t Repeat Yourself) principe van ontwikkeling. Mule configuraties zijn xml files die momenteel nog rechtstreeks door een ontwikkelaar moeten worden samengesteld (iets waar Mule Studio verandering in gaat brengen). Zeker als configuraties groter en complexer worden kan dit de onderhoudbaarheid negatief beïnvloeden. Dit kan als een minpunt worden opgevat.

We hebben onderstreept dat Mule meer is dan een service bus alleen en er ook andere integratie topologiëen mee kunnen worden gerealiseerd.

De vele online resources van Mule maken het tot een goed inzetbaar produkt. De levendige community is reeds aangestipt. Daarnaast is er een forum beschikbaar en (voor subscribers) een mailadres voor vragen en hulp. Daarnaast is ook de vele aanwezige documentatie (zowel in boekvorm als op de online website) een groot pluspunt van Mule.

Ontwikkelaars van Mule instanties kunnen gebruikmaken van de vele hulpmiddelen die ook bij JEE ontwikkeling worden toegepast, zoals unit testing en Maven plugins. Dit maakt het o.a. bijzonder eenvoudig om Mule te integreren in een JEE of Spring gebaseerd ontwikkellandschap. Mule biedt voor diezelfde ontwikkelaars ondertussen ook de nodige grafische ondersteuning in de vorm van Mule Studio (voorlopig nog in beta stadium) en de Mule Data Integrator (alleen voor de Enterprise Edition), hetgeen ontwikkeling aanzienlijk kan vergemakkelijken.

Al met al is Mule is een erg volwassen ESB. De meeste Integration Patterns worden ondersteund, waardoor bijna elk integratievraagstuk kan worden opgelost. De vele hulpmiddelen voor ontwikkelaars en beheerders alsmede de uitstekende hoeveelheid beschikbare documentatie en online ondersteuning maken van Mule een serieus alternatief voor proprietary Service Bussen.

Referenties

Waardering:
 
Tags:

Reacties

Leuk artikel; echter de 'save to PDF'-functie werkt niet...

Hi Rogier,

Sorry dat het niet werkt. Bedankt voor je tip. We gaan er direct naar kijken.

Groet,

Frank

Nog niet naar gekeken zeker? Het werkt namelijk nog niet.

Wel naar gekeken. Nog niet gefixed.

Beste Rogier,

We hebben het probleem verholpen en je kan dus weer een PDF genereren. Ik ben nog niet helemaal tevreden over het resultaat, maar dat pakken we later op.

Groet,

Frank

Nieuwe reactie inzenden

De inhoud van dit veld is privé en zal niet openbaar worden gemaakt.

Meer informatie over formaatmogelijkheden

CAPTCHA
Deze vraag is om te testen of u een persoon bent en om spam te voorkomen
Image CAPTCHA
Enter the characters shown in the image.