Serverløse funktioner med Spring Cloud-funktion

1. Introduktion

I denne vejledning lærer vi, hvordan du bruger Spring Cloud-funktion.

Vi bygger og kører en simpel Spring Cloud-funktion lokalt og derefter distribuerer den til AWS.

2. Opsætning af Spring Cloud-funktion

Lad os starte med at implementere fra bunden og teste et simpelt projekt med to funktioner ved hjælp af forskellige tilgange:

  • En streng reversering ved hjælp af en almindelig metode
  • Og en hilsen ved hjælp af en dedikeret klasse

2.1. Maven afhængigheder

Den første ting, vi skal gøre er at inkludere spring-cloud-starter-function-web afhængighed. Dette fungerer som vores lokale adapter og bringer de nødvendige afhængigheder til at køre vores funktion lokalt:

 org.springframework.cloud spring-cloud-starter-function-web 1.0.1.RELEASE 

Hold øje med, da vi ændrer dette lidt, når vi implementerer til AWS.

2.2. Skrivning af Spring Cloud-funktionen

Med Spring Cloud-funktion, vi kan afsløre @Bønnes af typen Fungere, Forbruger eller Leverandør som individuelle metoder:

@SpringBootApplication offentlig klasse CloudFunctionApplication {public static void main (String [] args) {SpringApplication.run (CloudFunctionApplication.class, args); } @Bean public Function reverseString () {return value -> new StringBuilder (value) .reverse (). ToString (); }}

Som i denne kode kan vi udsætte en omvendt strengfunktion som en Fungere, som vores målfunktionelle platform kan påberåbe sig.

2.3. Afprøvning af omvendt strengfunktion lokalt

Det spring-cloud-starter-function-web eksponerer funktionen som et HTTP-slutpunkt. Når vi kører CloudFunctionApplication, kan vi krølle vores mål for at teste det lokalt:

curl localhost: 8080 / reverseString -H "Content-Type: text / plain" -d "Baeldung User"

Bemærk, at slutpunktet er navnet på bønnen.

Og som forventet får vi den omvendte streng som output:

resU gnudleaB

2.4. Scanning af Spring Cloud-funktion i pakker

Bortset fra at udsætte vores metode som en @Bønne, Vi kunne også skrive vores software som klasser, der implementerer den funktionelle grænseflade Fungere:

offentlig klasse Greeter implementerer funktion {@Override public String gælder (String s) {returner "Hej" + s + ", og velkommen til Spring Cloud-funktion !!!"; }}

Vi kan derefter specificere de pakker, der skal scannes efter relevante bønner i application.properties:

spring.cloud.function.scan.packages = com.baeldung.spring.cloudfunction.funktioner

2.5. Test af Greeter-funktionen lokalt

Igen kan vi starte appen og bruge krølle til at teste Greeter fungere:

curl localhost: 8080 / greeter -H "Content-Type: text / plain" -d "World"

Bemærk, at slutpunktet er navnet på den klasse, der implementerer den funktionelle grænseflade.

Og ingen overraskelse, vi får den forventede hilsen tilbage:

Hej verden, og velkommen til Spring Cloud-funktion !!!

3. Spring Cloud-funktion på AWS

Hvad der gør Spring Cloud-funktion så kraftig, er at vi kan opbygge Spring-aktiverede funktioner, der er cloud agnostiske. Selve funktionen behøver ikke at vide om, hvordan den blev kaldt, eller det miljø, den er implementeret i. For eksempel, Vi kan nemt implementere denne hilsen til AWS, Azure eller Google Cloud-platformen uden at ændre nogen af ​​forretningslogikken.

Da AWS Lambda er en af ​​de populære serverløse løsninger, lad os fokusere på, hvordan vi implementerer vores app i den.

Så lad os ikke vente længere og distribuere vores funktion til skyen!

3.1. Maven afhængigheder

Husk spring-cloud-starter-function-web afhængighed, som vi oprindeligt tilføjede. Nu er det tid til at ændre det.

Se, afhængigt af hvor vi skal køre Spring Cloud-funktionen, skal vi tilføje den relevante afhængighed.

Til AWS bruger vi fjeder-cloud-funktion-adapter-aws:

 org.springframework.cloud spring-cloud-function-adapter-aws 

Lad os derefter tilføje de krævede AWS-afhængigheder til at håndtere Lambda-begivenheder:

 com.amazonaws aws-lambda-java-events 2.0.2 forudsat com.amazonaws aws-lambda-java-core 1.1.0 forudsat 

Endelig, fordi vi vil uploade den artefakt, der er genereret af maven build til AWS Lambda, er vi nødt til at opbygge en artefakt, der er skyggelagt, hvilket betyder, at den har alle afhængigheder eksploderet som individuelle klassefiler i stedet for krukker.

Det fjeder-boot-tynd-layout afhængighed hjælper os med at reducere artefaktens størrelse ved at ekskludere nogle afhængigheder, der ikke er nødvendige:

   org.apache.maven.plugins maven-deploy-plugin sand org.springframework.boot spring-boot-maven-plugin org.springframework.boot.experimental spring-boot-thin-layout 1.0.10.RELEASE org.apache.maven. plugins maven-skygge-plugin falske sande aws 

3.2. AWS Handlers

Hvis vi vil eksponere vores strengrevers igen via en HTTP-anmodning, sendes Spring Cloud Function AWS med SpringBootRequestHandler. Det implementerer AWS'er RequestHandler og har ansvaret for at sende AWS-anmodningen til vores funktion.

offentlig klasse MyStringHandlers udvider SpringBootRequestHandler {}

Spring Cloud Function AWS leveres også med SpringBootStreamHandler og FunctionInvokingS3EventHandler som andre eksempler

Nu kan det virke lidt underligt, at MyStringHandlers er bare en tom klasse, men den spiller en vigtig rolle både fungerer som indgangspunkt for Lambda-funktionen og også definerer dens input- og outputtyper.

Som vi ser på skærmbilledet nedenfor, giver vi det fulde kvalificerede navn på denne klasse i Handler-indtastningsfeltet på AWS Lambda-konfigurationssiden.

3.3. Hvordan ved AWS, hvilken skyfunktion der skal påberåbes?

Som det viser sig, selvom vi har mere end en Spring Cloud-funktion i vores applikation, AWS kan kun påberåbe sig en af ​​dem.

I det næste afsnit specificerer vi skyfunktionsnavnet i en miljøvariabel kaldet FUNCTION_NAME på AWS-konsollen.

4. Upload funktionen til AWS og test

Lad os endelig bygge vores krukke med maven og derefter uploade den via AWS Console UI.

4.1. Opret en Lambda-funktion på AWS-konsol og konfigurer den

På siden AWS Lambda-konsol i sektionen Funktionskode kan vi vælge en Java 8 runtime og blot klikke Upload.

Derefter skal vi angive i Handler felt det fuldt kvalificerede navn på den klasse, der implementeres SpringBootRequestHandler, eller com.baeldung.spring.cloudfunction.MyStringHandlers i vores tilfælde:

Og så i miljøvariabler angiver vi, hvilken fjederfunktionsbønne der skal påberåbes via FUNCTION_NAME miljøvariabel:

Og efter at have gjort det, er det tid for os at teste Lambda-funktionen ved at oprette en testhændelse og levere en prøvestreng:

4.2. Test af funktionen på AWS

Nu, vi Gemme vores test, og klik derefter på Prøve knap.

Og som forventet får vi samme output som det, vi fik, da vi testede funktionen lokalt:

4.3. Test af en anden funktion

Husk, at vi har endnu en funktion i vores ansøgning: hilsen. Lad os sørge for, at det også fungerer.

Vi ændrer FUNCTION_NAME miljøvariabel til hilsen:

Klik på Gemme og til sidst Prøve knappen igen:

5. Konklusion

Sammenfattende, men i sin tidlige fase, Spring Cloud-funktion er et kraftfuldt værktøj til at afkoble forretningslogikken fra ethvert specifikt runtime-mål.

Med den kan den samme kode køre som et webendepunkt, på en cloudplatform eller som en del af en stream. Det uddrager alle transportoplysninger og infrastruktur, så udvikleren kan beholde alle de kendte værktøjer og processer og fokusere fast på forretningslogik.

Som altid skal du tjekke kildekoden til denne tutorial på GitHub.