Kom godt i gang med Mule ESB

1. Oversigt

Mule ESB er en letvægts Java-baseret Enterprise Service Bus. Det giver udviklere mulighed for at forbinde flere applikationer sammen ved at udveksle data i forskellige formater. Den bærer data i form af en besked.

ESB'er tilbyder stærke muligheder ved at levere en række tjenester, såsom:

  • Oprettelse og hosting af tjenester
  • Tjenestemægling
  • Routing af beskeder
  • Datatransformation

Vi finder ESB'er nyttige, hvis vi har brug for at integrere flere applikationer sammen, eller hvis vi har forestillingen om at tilføje flere applikationer i fremtiden.

ESB bruges også til at håndtere mere end en type kommunikationsprotokol, og når der kræves funktioner til meddelelsesrute.

Lad os oprette et prøveprojekt i afsnit 5 ved hjælp af AnyPoint Studio som kan downloades her.

2. Mule-meddelelsesstruktur

Kort sagt, det primære formål med en ESB er at formidle mellem tjenester og rute meddelelser til forskellige slutpunkter. Så det skal håndtere forskellige typer indhold eller nyttelast.

Beskedstrukturen er opdelt i to dele:

  • Overskriften, somindeholder meddelelsesmetadata
  • Nyttelasten, som indeholder forretningsspecifikke data

Meddelelsen er indlejret i et meddelelsesobjekt. Vi kan hente beskedobjektet fra konteksten. Vi kan ændre dens egenskaber og nyttelast ved hjælp af brugerdefinerede Java-komponenter og transformere inde i et Mule-flow.

Hver applikation består af en eller flere strømme.

I et flow kan vi bruge komponenter til at få adgang til, filtrere eller ændre en besked og dens forskellige egenskaber.

For eksempel kan vi få en forekomst af en besked ved hjælp af Java-komponent. Denne komponentklasse implementerer a Kan kaldes interface fra org.mule.api.lifecycle pakke:

public Object onCall (MuleEventContext eventContext) kaster Undtagelse {MuleMessage-meddelelse = eventContext.getMessage (); message.setPayload ("Beskedens nyttelast ændres her."); returnere besked; }

3. Egenskaber og variabler

Beskedmetadata består af egenskaber. Variabler repræsenterer data om en besked. Hvordan egenskaber og variabler anvendes på tværs af meddelelsens livscyklus er defineret af deres rækkevidde. Egenskaber kan være af to typer baseret på deres omfang: indgående og udgående.

Indgående egenskaber indeholder metadata, der forhindrer beskeder i at blive krypteret, mens de krydser strømme. Indgående egenskaber er uforanderlige og kan ikke ændres af brugeren. De er kun til stede i løbet af strømmen - når meddelelsen forlader strømmen, er indgående egenskaber ikke længere der.

Udgående egenskaber kan indstilles automatisk af Mule, eller en bruger kan indstille dem gennem flowkonfiguration. Disse egenskaber kan ændres. De bliver indgående egenskaber, når en besked kommer ind i en anden strøm efter at have krydset transportbarrierer.

Vi kan indstille og få henholdsvis udgående og indgående egenskaber ved at kalde tilknyttede setter- og gettermetoder i deres respektive omfang:

message.setProperty ("outboundKey", "outboundpropertyvalue", PropertyScope.OUTBOUND); String inboundProp = (String) message.getInboundProperty ("outboundKey");

Der er to typer variabler tilgængelige til at erklære i applikationer.

Den ene er flowvariabel, som er lokal for en muldyrstrøm og tilgængelig på tværs af strømmen, delstrømme og private strømme.

Sessionsvariabler, når de er erklæret, bliver tilgængelige i hele applikationen.

4. Transportbarrierer og flow-ref

Transportbarrierer er HTTP-stik, VM'er, JMS eller lignende stik, der kræver stier eller slutpunkter for, at meddelelser kan dirigeres. Flowvariabler er ikke tilgængelige på tværs af transportbarrierer, men sessionsvariabler er tilgængelige på tværs af projektet i alle strømme.

Når vi har brug for at oprette delstrøm eller privat flow, kan vi henvise til strømmen fra en forælder eller en anden strøm ved hjælp af flow-ref komponent. Både flowvariabler og sessionsvariabler er tilgængelige i understrømme og private strømme, der henvises til ved hjælp af flow-ref.

5. Eksempel på projekt

Lad os oprette et program i Anypoint Studio, der indeholder flere strømme, der kommunikerer indbyrdes gennem indgående og udgående stik.

Lad os se på det første flow:

Vi kan konfigurere en HTTP-lytter som:

Strømningskomponenter skal være inde i en tag. Så et eksempel på flow med flere komponenter er:

Inde i strømmen giver vi en reference til en konfigureret HTTP-lytter. Derefter holder vi en logger for at logge den nyttelast, som HTTP-lytter modtager via POST-metoden.

Derefter placeres en brugerdefineret Java-transformerklasse, der omdanner nyttelasten efter modtagelse af meddelelsen:

public Object transformMessage (MuleMessage message, String outputEncoding) kaster TransformerException {message.setPayload ("Nyttelast overføres her."); message.setProperty ("outboundKey", "outboundpropertyvalue", PropertyScope.OUTBOUND); returnere besked; }

Transformerklassen skal strække sig AbstractMessageTransformer. Vi sætter også en udgående ejendom inde i klassen.

Nu har vi allerede konverteret nyttelast inde i meddelelsesobjektet og har logget det i konsollen ved hjælp af logger. Vi indstiller en flowvariabel og en sessionsvariabel.

Endelig sender vi vores nyttelast gennem udgående VM-stik. Stien i VM-stik bestemmer det modtagende slutpunkt:

Den meddelelse, der bæres og transformeres af den oprindelige strømning når Flow1 gennem et indgående VM-slutpunkt.

Java-komponenten henter udgående egenskaber, der er indstillet af det første flow, og returnerer det objekt, der bliver beskednyttelasten.

Det transformMessage () metode til denne opgave:

public Object transformMessage (MuleMessage message, String outputEncoding) kaster TransformerException {return (String) message.getInboundProperty ("outboundKey"); }

Derefter indstilles flow- og sessionsvariabler til det andet flow. Derefter har vi en henvisning til Flow2 ved brug af flow-ref komponent.

I Flow2, Vi har transformeret meddelelsen ved hjælp af Java-komponentklasse og logget den i konsollen. Vi har også indstillet en flowvariabel F3.

Efter at have ringet Flow2 ved brug af flow-ref, Flow1 venter på, at beskeden behandles Flow2.

Enhver flowvariabel, der er indstillet Flow1 og Flow2 vil være tilgængelig i begge strømme, da disse strømme ikke adskilles af nogen transportbarrierer.

Endelig sendes beskeden tilbage til HTTP-anmoderen via VM'er. Vi konfigurerede alle virtuelle computere som anmodning-svar.

Vi kan påberåbe sig denne applikation fra enhver REST-klient ved at sende JSON-data i kroppen. URL'en vil være lokal vært: 8081 som konfigureret i HTTP-lytter.

6. Maven Archetype

Vi kan bygge et Mule ESB-projekt ved hjælp af Mulesofts Maven-arketype.

I Maven's settings.xml fil, skal vi først tilføje org.mule.tools plugin-gruppe:

 org.mule.tools 

Derefter skal vi tilføje en profil tag, der siger, hvor Maven skal se efter Mulesoft-artefakter:

 Mule Org sand mulesoft frigiver MuleSoft Repository //repository-master.mulesoft.org/releases/ standard 

Endelig kan vi oprette projektet ved hjælp af muldyr-projekt-arketype: Opret:

mvn muldyr-projekt-arketype: Opret -DartifactId = muleesb -DmuleVersion = 3.9.0

Efter konfiguration af vores projekt kan vi oprette et implementerbart arkiv ved hjælp af mvn-pakke.

Derefter distribuerede vi arkivet i apps mappe på enhver standalone Mule-server.

7. En uafhængig muldyrserver via MuleSofts Maven Repository

Som netop nævnt kræver det projekt, vi lige har oprettet, en uafhængig Mule-server.

Hvis vi ikke allerede har en, kan vi redigere vores pom.xml at trække en fra MuleSofts Maven-arkiv:

 org.mule.tools.maven mule-maven-plugin 2.2.1 standalone 3.9.0 deploy deploy deploy 

8. Konklusion

I denne artikel har vi gennemgået forskellige nødvendige koncepter for bygning som ESB-applikation i Mule. Vi har oprettet et eksempel på et projekt, der illustrerer alle de beskrevne koncepter.

Vi kan nu begynde at oprette ESB-applikationer ved hjælp af Anypoint Studio for at imødekomme vores forskellige behov.

Som sædvanligt kan det komplette projekt findes på GitHub.

1. Oversigt

Mule ESB er en letvægts Java-baseret Enterprise Service Bus. Det giver udviklere mulighed for at forbinde flere applikationer sammen ved at udveksle data i forskellige formater. Den bærer data i form af en besked.

ESB'er tilbyder stærke muligheder ved at levere en række tjenester, såsom:

  • Oprettelse og hosting af tjenester
  • Tjenestemægling
  • Routing af beskeder
  • Datatransformation

Vi finder ESB'er nyttige, hvis vi har brug for at integrere flere applikationer sammen, eller hvis vi har forestillingen om at tilføje flere applikationer i fremtiden.

ESB bruges også til at håndtere mere end en type kommunikationsprotokol, og når der kræves funktioner til meddelelsesrute.

Lad os oprette et prøveprojekt i afsnit 5 ved hjælp af AnyPoint Studio som kan downloades her.

2. Mule-meddelelsesstruktur

Kort sagt, det primære formål med en ESB er at formidle mellem tjenester og rute meddelelser til forskellige slutpunkter. Så det skal håndtere forskellige typer indhold eller nyttelast.

Beskedstrukturen er opdelt i to dele:

  • Overskriften, somindeholder meddelelsesmetadata
  • Nyttelasten, som indeholder forretningsspecifikke data

Meddelelsen er indlejret i et meddelelsesobjekt. Vi kan hente beskedobjektet fra konteksten. Vi kan ændre dens egenskaber og nyttelast ved hjælp af brugerdefinerede Java-komponenter og transformere inde i et Mule-flow.

Hver applikation består af en eller flere strømme.

I et flow kan vi bruge komponenter til at få adgang til, filtrere eller ændre en besked og dens forskellige egenskaber.

For eksempel kan vi få en forekomst af en besked ved hjælp af Java-komponent. Denne komponentklasse implementerer a Kan kaldes interface fra org.mule.api.lifecycle pakke:

public Object onCall (MuleEventContext eventContext) kaster undtagelse {MuleMessage-meddelelse = eventContext.getMessage (); message.setPayload ("Beskedens nyttelast ændres her."); returnere besked; }

3. Egenskaber og variabler

Beskedmetadata består af egenskaber. Variabler repræsenterer data om en besked. Hvordan egenskaber og variabler anvendes på tværs af meddelelsens livscyklus er defineret af deres rækkevidde. Egenskaber kan være af to typer, baseret på deres omfang: indgående og udgående.

Indgående egenskaber indeholder metadata, der forhindrer beskeder i at krypteres, mens de krydser strømme. Indgående egenskaber er uforanderlige og kan ikke ændres af brugeren. De er kun til stede i løbet af strømmen - når meddelelsen forlader strømmen, er indgående egenskaber ikke længere der.

Udgående egenskaber kan indstilles automatisk af Mule, eller en bruger kan indstille dem gennem flowkonfiguration. Disse egenskaber kan ændres. De bliver indgående egenskaber, når en besked kommer ind i en anden strøm efter at have krydset transportbarrierer.

Vi kan indstille og få henholdsvis udgående og indgående egenskaber ved at kalde tilknyttede setter- og gettermetoder i deres respektive omfang:

message.setProperty ("outboundKey", "outboundpropertyvalue", PropertyScope.OUTBOUND); String inboundProp = (String) message.getInboundProperty ("outboundKey");

Der er to typer variabler tilgængelige til at erklære i applikationer.

Den ene er flowvariabel, som er lokal for en muldyrstrøm og tilgængelig på tværs af strømmen, delstrømme og private strømme.

Sessionsvariabler, når de er erklæret, bliver tilgængelige i hele applikationen.

4. Transportbarrierer og flow-ref

Transportbarrierer er HTTP-stik, VM'er, JMS eller lignende stik, der kræver stier eller slutpunkter for, at meddelelser kan dirigeres. Flowvariabler er ikke tilgængelige på tværs af transportbarrierer, men sessionsvariabler er tilgængelige på tværs af projektet i alle strømme.

Når vi har brug for at oprette delstrøm eller privat flow, kan vi henvise til strømmen fra en forælder eller en anden strøm ved hjælp af flow-ref komponent. Både flowvariabler og sessionsvariabler er tilgængelige i understrømme og private strømme, der henvises til ved hjælp af flow-ref.

5. Eksempel på projekt

Lad os oprette et program i Anypoint Studio, der indeholder flere strømme, der kommunikerer indbyrdes gennem indgående og udgående stik.

Lad os se på det første flow:

Vi kan konfigurere en HTTP-lytter som:

Strømningskomponenter skal være inde i en tag. Så et eksempel på flow med flere komponenter er:

Inde i strømmen giver vi en reference til en konfigureret HTTP-lytter. Derefter holder vi en logger for at logge den nyttelast, som HTTP-lytteren modtager via POST-metoden.

Derefter placeres en brugerdefineret Java-transformerklasse, der transformerer nyttelasten efter modtagelse af meddelelsen:

public Object transformMessage (MuleMessage message, String outputEncoding) kaster TransformerException {message.setPayload ("Nyttelast overføres her."); message.setProperty ("outboundKey", "outboundpropertyvalue", PropertyScope.OUTBOUND); returnere besked; }

Transformerklassen skal strække sig AbstractMessageTransformer. Vi sætter også en udgående ejendom inde i klassen.

Nu har vi allerede konverteret nyttelast inde i meddelelsesobjektet og har logget det i konsollen ved hjælp af logger. Vi indstiller en flowvariabel og en sessionsvariabel.

Endelig sender vi vores nyttelast gennem udgående VM-stik. Stien i VM-stik bestemmer det modtagende slutpunkt:

Den meddelelse, der bæres og transformeres af den oprindelige strømning når Flow1 gennem et indgående VM-slutpunkt.

Java-komponenten henter udgående egenskaber, der er indstillet af det første flow, og returnerer det objekt, der bliver beskednyttelasten.

Det transformMessage () metode til denne opgave:

public Object transformMessage (MuleMessage message, String outputEncoding) kaster TransformerException {return (String) message.getInboundProperty ("outboundKey"); }

Derefter indstilles flow- og sessionsvariabler til den anden flow. Derefter har vi en henvisning til Flow2 ved brug af flow-ref komponent.

I Flow2, Vi har transformeret meddelelsen ved hjælp af Java-komponentklasse og logget den i konsollen. Vi har også indstillet en flowvariabel F3.

Efter at have ringet Flow2 ved brug af flow-ref, Flow1 venter på, at meddelelsen behandles i Flow2.

Enhver flowvariabel indstillet Flow1 og Flow2 vil være tilgængelig i begge strømme, da disse strømme ikke adskilles af nogen transportbarrierer.

Endelig sendes beskeden tilbage til HTTP-anmoderen via VM'er. Vi konfigurerede alle virtuelle computere som anmodningssvar.

Vi kan påberåbe sig denne applikation fra enhver REST-klient ved at sende JSON-data i kroppen. URL'en vil være lokal vært: 8081 som konfigureret i HTTP-lytter.

6. Maven Archetype

Vi kan bygge et Mule ESB-projekt ved hjælp af Mulesofts Maven-arketype.

I Maven's settings.xml fil, skal vi først tilføje org.mule.tools plugin-gruppe:

 org.mule.tools 

Derefter skal vi tilføje en profil tag, der siger, hvor Maven skal kigge efter Mulesoft-artefakter:

 Mule Org ægte mulesoft frigiver MuleSoft Repository //repository-master.mulesoft.org/releases/ standard 

Endelig kan vi oprette projektet ved hjælp af muldyr-projekt-arketype: Opret:

mvn muldyr-projekt-arketype: Opret -DartifactId = muleesb -DmuleVersion = 3.9.0

Efter konfiguration af vores projekt kan vi oprette et implementerbart arkiv ved hjælp af mvn-pakke.

Derefter distribuerede vi arkivet i apps mappe på enhver standalone Mule-server.

7. En uafhængig muldyrserver via MuleSofts Maven Repository

Som netop nævnt kræver det projekt, vi lige har oprettet, en uafhængig Mule-server.

Hvis vi ikke allerede har en, kan vi redigere vores pom.xml at trække en fra MuleSofts Maven-arkiv:

 org.mule.tools.maven mule-maven-plugin 2.2.1 standalone 3.9.0 deploy deploy deploy 

8. Konklusion

I denne artikel har vi gennemgået forskellige nødvendige koncepter for bygning som ESB-applikation i Mule. Vi har oprettet et eksempel på et projekt, der illustrerer alle de beskrevne koncepter.

Vi kan nu begynde at oprette ESB-applikationer ved hjælp af Anypoint Studio for at imødekomme vores forskellige behov.

Som sædvanligt kan det komplette projekt findes på GitHub.