Apache Camel med Spring Boot

1. Oversikt

I sin kjerne er Apache Camel en integrasjonsmotor, som - enkelt sagt - kan brukes til å lette samspill mellom et bredt og variert utvalg av teknologier.

Disse broene mellom tjenester og teknologier kalles ruter. Ruter er implementert på en motor ( CamelContext), og de kommuniserer med såkalte “utvekslingsmeldinger”.

2. Maven-avhengigheter

For å begynne med må vi inkludere avhengigheter for Spring Boot, Camel, Rest API med Swagger og JSON:

  org.apache.camel camel-servlet-starter $ {camel.version} org.apache.camel camel-jackson-starter $ {camel.version} org.apache.camel camel-swagger-java-starter $ {camel.version} org.apache.camel camel-spring-boot-starter $ {camel.version} org.springframework.boot spring-boot-starter-web $ {spring-boot-starter.version} 

De nyeste versjonene av Apache Camel-avhengigheter finner du her.

3. Hovedklassen

La oss først lage en Spring Boot applikasjon:

@SpringBootApplication @ComponentScan (basePackages = "com.baeldung.camel") public class Application {public static void main (String [] args) {SpringApplication.run (Application.class, args); }}

4. Kamelkonfigurasjoner for vårstøvel

La oss nå konfigurere applikasjonen vår med Spring, og starte med konfigurasjonsfilene (egenskaper).

La oss for eksempel konfigurere en logg for applikasjonen vår på en application.properties fil i src / main / resources:

logging.config = classpath: logback.xml camel.springboot.name = MyCamel server.address = 0.0.0.0 management.address = 0.0.0.0 management.port = 8081 endpoints.enabled = true endpoints.health.enabled = true

Dette eksemplet viser en application.properties fil som også setter banen til en Logback-konfigurasjon. Ved å sette IP-en til “0.0.0.0” begrenser vi fullstendig admin og ledelse tilgang på webserveren levert av Spring Boot. Vi aktiverer også den nødvendige nettverkstilgang til endepunktene for applikasjonen, samt endepunktene for helsekontroll.

En annen konfigurasjonsfil er application.yml. I det vil vi legge til noen egenskaper som hjelper oss å injisere verdier i applikasjonsrutene:

server: port: 8080 kamel: springboot: navn: Services Rest management: port: 8081 endepunkter: aktivert: falsk helse: aktivert: sann hurtigstart: genererOrderPeriod: 10s prosess

5. Sette opp Camel Servlet

En måte å begynne å bruke Camel på er å registrere den som en servlet, slik at den kan fange opp HTTP-forespørslene og omdirigere dem til applikasjonen vår.

Som nevnt tidligere, stirrer vi på Camels versjon 2.18 og nedenfor, kan vi dra nytte av vår application.yml - ved å opprette en parameter for den endelige nettadressen vår. Senere vil den bli injisert i Java-koden vår:

baeldung: api: sti: '/ kamel'

Tilbake til vår applikasjon klasse, må vi registrere kamelservletten ved roten av kontekstveien vår, som skal injiseres fra referansen baeldung.api.path i application.yml når søknaden starter:

@Value ("$ {baeldung.api.path}") Streng contextPath; @Bean ServletRegistrationBean servletRegistrationBean () {ServletRegistrationBean servlet = new ServletRegistrationBean (new CamelHttpTransportServlet (), contextPath + "/ *"); servlet.setName ("CamelServlet"); retur servlet; }

Fra og med Camels versjon 2.19, har denne konfigurasjonen blitt droppet som CamelServlet er som standard satt til "/kamel".

6. Å bygge en rute

La oss begynne å lage en rute ved å utvide RouteBuilder klasse fra Camel, og sette den som en @Komponent slik at komponentskanningsrutinen kan finne den under initialisering av webserveren:

@Komponentklasse RestApi utvider RouteBuilder {@Override public void configure () {CamelContext context = new DefaultCamelContext (); restConfiguration () ... rest ("/ api /") ... fra ("direct: remoteService") ...}}

I denne klassen overstyrer vi konfigurer () metode fra Camel's RouteBuilder klasse.

Kamel trenger alltid en CamelContext forekomst - kjernekomponenten der innkommende og utgående meldinger oppbevares.

I dette enkle eksemplet, StandardCamelContext er tilstrekkelig da det bare binder meldinger og ruter inn i det, som REST-tjenesten vi skal lage.

6.1. De restConfiguration () Rute

Deretter oppretter vi en REST-erklæring for sluttpunktene vi planlegger å opprette i restConfiguration () metode:

restConfiguration () .contextPath (contextPath) .port (serverPort) .enableCORS (true) .apiContextPath ("/ api-doc") .apiProperty ("api.title", "Test REST API") .apiProperty ("api.version "," v1 ") .apiContextRouteId (" doc-api ") .komponent (" servlet ") .bindingMode (RestBindingMode.json)

Her registrerer vi kontekstbanen med vårt injiserte attributt fra YAML-filen. Den samme logikken ble brukt på porten for søknaden vår. CORS er aktivert, slik at du kan bruke denne nettjenesten på tvers. Bindingsmodus tillater og konverterer argumenter til API-en vår.

Deretter legger vi til Swagger-dokumentasjon i URI, tittel og versjon vi tidligere har satt. Når vi oppretter metoder / sluttpunkter for vår REST-nettjeneste, vil Swagger-dokumentasjonen automatisk bli oppdatert.

Denne Swagger-konteksten er i seg selv en kamelrute, og vi kan se litt teknisk informasjon om den i serverloggen under oppstartsprosessen. Eksempeldokumentasjonen vår er som standard servert på // localhost: 8080 / kamel / api-doc.

6.2. De hvile() Rute

La oss nå implementere hvile() metodeanrop fra konfigurer () metoden som er oppført ovenfor:

rest ("/ api /") .id ("api-route") .consumes ("application / json") .post ("/ bean") .bindingMode (RestBindingMode.json_xml) .type (MyBean.class) .to ("direkte: remoteService");

Denne metoden er ganske grei for de som kjenner API-er. De id er identifikasjonen av ruten inne i CamelContext. Den neste linjen definerer MIME-typen. Bindingsmodus er definert her for å vise at vi kan sette en modus på restConfiguration ().

De post() metoden legger til en operasjon i API, og genererer en “POST / bønne”Endepunkt, mens MyBean (en vanlig Java-bønne med en Heltall-id og Strengnavn) definerer forventede parametere.

Tilsvarende er HTTP-handlinger som GET, PUT og DELETE alle tilgjengelige også i form av få(), sette(), slett ().

Til slutt, til() metoden skaper en bro til en annen rute. Her ber den Camel om å søke i sin kontekst / motor til en annen rute som vi skal lage - som blir navngitt og oppdaget av verdien / iden "direkte:…“, Som samsvarer med ruten som er definert i fra() metode.

6.3. De fra() Rute med forvandle()

Når du arbeider med Camel, mottar en rute parametere og konverterer, transformerer og behandler disse parametrene. Etter det sender den disse parametrene til en annen rute som videresender resultatet til ønsket utgang (en fil, en database, en SMTP-server eller et REST API-svar).

I denne artikkelen oppretter vi bare en annen rute inne i konfigurer () metode som vi overstyrer. Det vil være destinasjonsruten for vår siste til() rute:

fra ("direct: remoteService") .routeId ("direct-route") .tracing () .log (">>> $ {body.id}") .log (">>> $ {body.name}" ) .transform (). enkel ("Hello $ {in.body.name}") .setHeader (Exchange.HTTP_RESPONSE_CODE, konstant (200));

De fra() metoden følger de samme prinsippene og har mange av de samme metodene som hvile() metoden, bortsett fra at den bruker fra Camel-kontekstmeldingene. Dette er grunnen til parameteren “direkte rute“, Som skaper en lenke til den nevnte metoden hvile (). til ().

Mange andre konverteringer er tilgjengelige, inkludert ekstraksjon som Java-primitive (eller objekter) og sende den ned til et utholdenhetslag. Legg merke til at rutene alltid leses fra innkommende meldinger, slik at kjedede ruter ignorerer utgående meldinger.

Eksemplet vårt er klart, og vi kan prøve det:

  • Kjør ledeteksten: mvn spring-boot: run
  • Gjør en POST-forespørsel til // localhost: 8080 / kamel / api / bønne med headerparametere: Innholdstype: applikasjon / json, og en nyttelast {“Id”: 1, ”name”: “Verden”}
  • Vi skal motta en returkode på 201 og svaret: Hei Verden

6.4. SIMPLE skriptspråk

Eksemplet gir logging ved hjelp av sporing() metode. Legg merke til at vi har brukt ${} plassholdere; disse er en del av et skriptspråk som tilhører Camel, kalt SIMPLE. Den brukes på meldinger som utveksles over ruten, som kroppen til meldingen.

I vårt eksempel bruker vi SIMPLE til å sende bønneattributtene som er inne i Camel-meldingen til loggen.

Vi kan også bruke den til å gjøre enkle transformasjoner, som vist med forvandle() metode.

6.5. De fra() Rute med prosess()

La oss gjøre noe mer meningsfylt, for eksempel å ringe et tjenestelag for å returnere behandlede data. SIMPLE er ikke ment for tung databehandling, så la oss erstatte forvandle() med en prosess() metode:

fra ("direct: remoteService") .routeId ("direct-route") .tracing () .log (">>> $ {body.id}") .log (">>> $ {body.name}" ) .prosess (ny prosessor () {@Override offentlig ugyldig prosess (Exchange exchange) kaster Unntak {MyBean bodyIn = (MyBean) exchange.getIn (). getBody (); ExampleServices.example (bodyIn); exchange.getIn (). setBody (bodyIn);}}) .setHeader (Exchange.HTTP_RESPONSE_CODE, konstant (200));

Dette lar oss trekke ut dataene i en bønne, den samme som tidligere definert på type() metode, og behandle den i vår EksempelTjenester lag.

Siden vi satte inn bindingMode () til JSON tidligere, er svaret allerede i et riktig JSON-format, generert basert på vår POJO. Dette innebærer at for en EksempelTjenester klasse:

public class ExampleServices {public static void example (MyBean bodyIn) {bodyIn.setName ("Hello", + bodyIn.getName ()); bodyIn.setId (bodyIn.getId () * 10); }}

Den samme HTTP-forespørselen returnerer nå med en svarkode 201 og brødtekst: {“Id”: 10, ”name”: “Hello, World”}.

7. Konklusjon

Med noen få kodelinjer klarte vi å lage en relativt komplett applikasjon. Alle avhengigheter bygges, administreres og kjøres automatisk med en enkelt kommando. Videre kan vi lage API-er som binder sammen alle slags teknologier.

Denne tilnærmingen er også veldig containervennlig, noe som resulterer i et veldig magert servermiljø som lett kan replikeres på forespørsel. De ekstra konfigurasjonsmulighetene kan enkelt innlemmes i en konfigurasjonsfil for containermal.

Dette REST-eksemplet finner du på GitHub.

Endelig, utover filter(), prosess(), forvandle(), og marshall () APIer, mange andre integrasjonsmønstre og datamanipulasjoner er tilgjengelige i Camel:

  • Kamellintegrasjonsmønstre
  • Kamelbrukerhåndbok
  • Kamel ENKELT språk

$config[zx-auto] not found$config[zx-overlay] not found