Serverloze functies met Spring Cloud-functie

1. Inleiding

In deze zelfstudie leren we hoe u Spring Cloud Function gebruikt.

We bouwen en draaien lokaal een eenvoudige Spring Cloud-functie en implementeren deze vervolgens in AWS.

2. Spring Cloud-functie instellen

Laten we om te beginnen vanaf het begin een eenvoudig project implementeren en testen met twee functies met behulp van verschillende benaderingen:

  • Een stringomkeerder, met behulp van een eenvoudige methode
  • En een begroeter die een speciale klas gebruikt

2.1. Afhankelijkheden van Maven

Het eerste dat we moeten doen, is de spring-cloud-starter-function-web afhankelijkheid. Dit zal fungeren als onze lokale adapter en zorgt voor de nodige afhankelijkheden om onze functie lokaal uit te voeren:

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

Blijf op de hoogte, want we zullen dit een beetje aanpassen wanneer we implementeren op AWS.

2.2. De Spring Cloud-functie schrijven

Met Spring Cloud-functie, we kunnen blootleggen @Boons van het type Functie, Klant of Leverancier als individuele methoden:

@SpringBootApplication openbare klasse CloudFunctionApplication {openbare statische leegte hoofd (String [] args) {SpringApplication.run (CloudFunctionApplication.class, args); } @Bean public Function reverseString () {retourwaarde -> nieuwe StringBuilder (waarde) .reverse (). ToString (); }}

Net als in deze code kunnen we een reverse string-functie weergeven als een Functie, waarop ons doelgerichte functionele platform een ​​beroep kan doen.

2.3. De omgekeerde tekenreeksfunctie lokaal testen

De spring-cloud-starter-function-web stelt de functie bloot als een HTTP-eindpunt. Nadat we het CloudFunctionApplication, kunnen we ons doel omkrullen om het lokaal te testen:

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

Merk op dat het eindpunt de naam van de boon is.

En zoals verwacht, krijgen we de omgekeerde string als uitvoer:

resU gnudleaB

2.4. Scannen van Spring Cloud-functie in pakketten

Afgezien van het blootleggen van onze methode als een @Boon, we zouden onze software ook kunnen schrijven als klassen die de functionele interface implementeren Functie:

public class Greeter implementeert Functie {@Override public String apply (String s) {return "Hallo" + s + ", en welkom bij Spring Cloud Function !!!"; }}

We kunnen dan de pakketten specificeren die moeten worden gescand op relevante bonen application.properties:

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

2.5. Lokaal testen van de Greeter-functie

Nogmaals, we kunnen de app starten en curl gebruiken om het Greeter functie:

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

Merk op dat het eindpunt de naam is van de klasse die de functionele interface implementeert.

En het is geen verrassing dat we de verwachte begroeting terug krijgen:

Hallo wereld, en welkom bij de Spring Cloud-functie !!!

3. Spring Cloud-functie op AWS

Wat Spring Cloud Function zo krachtig maakt, is dat we voor Spring geschikte functies kunnen bouwen die cloud-agnostisch zijn. De functie zelf hoeft niet te weten hoe het werd aangeroepen of de omgeving waarin het is geïmplementeerd. Bijvoorbeeld, we kunnen deze begroeter eenvoudig implementeren op AWS-, Azure- of Google Cloud-platform zonder de bedrijfslogica te wijzigen.

Omdat AWS Lambda een van de populaire serverloze oplossingen is, laten we ons concentreren op hoe we onze app erin kunnen implementeren.

Dus laten we niet langer wachten en onze functie in de cloud implementeren!

3.1. Afhankelijkheden van Maven

Herinner de spring-cloud-starter-function-web afhankelijkheid, die we oorspronkelijk hebben toegevoegd. Nu is het tijd om dat te veranderen.

Kijk, afhankelijk van waar we de Spring Cloud-functie gaan draaien, moeten we de juiste afhankelijkheid toevoegen.

Voor AWS gebruiken we spring-cloud-functie-adapter-aws:

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

Laten we vervolgens de vereiste AWS-afhankelijkheden toevoegen om Lambda-gebeurtenissen af ​​te handelen:

 com.amazonaws aws-lambda-java-events 2.0.2 voorzien com.amazonaws aws-lambda-java-core 1.1.0 verstrekt 

Ten slotte, omdat we het artefact gegenereerd door de maven build naar AWS Lambda gaan uploaden, moeten we een artefact bouwen dat gearceerd is, wat betekent dat alle afhankelijkheden geëxplodeerd zijn als individuele klassebestanden in plaats van potten.

De spring-boot-dunne-layout afhankelijkheid helpt ons om de grootte van het artefact te verkleinen door enkele afhankelijkheden uit te sluiten die niet nodig zijn:

   org.apache.maven.plugins maven-deploy-plugin true org.springframework.boot spring-boot-maven-plugin org.springframework.boot.experimental spring-boot-thin-layout 1.0.10.RELEASE org.apache.maven. plugins maven-shad-plugin false true aws 

3.2. AWS-handlers

Als we onze stringomkeerder opnieuw willen blootstellen via een HTTP-verzoek, wordt Spring Cloud Function AWS geleverd met SpringBootRequestHandler. Het implementeert AWS's RequestHandler en is verantwoordelijk voor het verzenden van het AWS-verzoek naar onze functie.

openbare klasse MyStringHandlers breidt SpringBootRequestHandler {} uit

Spring Cloud Function AWS wordt ook geleverd met SpringBootStreamHandler en FunctieInvokingS3EventHandler als andere voorbeelden

Nu lijkt het misschien een beetje vreemd dat de MyStringHandlers is slechts een lege klas, maar het speelt een belangrijke rol in beide fungeren als het ingangspunt van de Lambda-functie en ook het definiëren van de invoer- en uitvoertypes.

Zoals we in de onderstaande schermafbeelding zullen zien, geven we de volledig gekwalificeerde naam van deze klasse in het invoerveld Handler van de AWS Lambda-configuratiepagina.

3.3. Hoe weet AWS welke cloudfunctie moet worden aangeroepen?

Het blijkt dat zelfs als we meer dan één Spring Cloud-functie in onze applicatie hebben, AWS kan er slechts één aanroepen.

In de volgende sectie specificeren we de naam van de cloudfunctie in een omgevingsvariabele met de naam FUNCTION_NAME op de AWS-console.

4. Upload de functie naar AWS en test

Laten we tot slot onze pot bouwen met maven en deze vervolgens uploaden via de AWS Console UI.

4.1. Maak een Lambda-functie op de AWS-console en configureer deze

Op de AWS Lambda-consolepagina, in de sectie Functiecode, kunnen we een Java 8 looptijd en klik gewoon Uploaden.

Daarna moeten we aangeven in de Handler veld de volledig gekwalificeerde naam van de klasse die wordt geïmplementeerd SpringBootRequestHandler, of com.baeldung.spring.cloudfunctie.MyStringHandlers in ons geval:

En dan geven we in Omgevingsvariabelen aan welke Spring-functieboon moet worden aangeroepen via de FUNCTION_NAME omgevingsvariabele:

En nadat we dat hebben gedaan, is het tijd voor ons om de Lambda-functie te testen door een testgebeurtenis te maken en een voorbeeldreeks op te geven:

4.2. De functie testen op AWS

Nu we Sparen onze test en klik vervolgens op het Test knop.

En, zoals verwacht, krijgen we dezelfde output als wat we kregen toen we de functie lokaal testten:

4.3. Een andere functie testen

Onthoud dat we nog een functie hebben in onze applicatie: begroeter. Laten we ervoor zorgen dat dat ook werkt.

We veranderen de FUNCTION_NAME omgevingsvariabele naar begroeter:

Klik op de Sparen knop en tenslotte de Test knop nogmaals:

5. Conclusie

Samenvattend, hoewel in de vroege stadia, Spring Cloud Function is een krachtig hulpmiddel om de bedrijfslogica los te koppelen van elk specifiek runtime-doel.

Hiermee kan dezelfde code worden uitgevoerd als een webeindpunt, op een cloudplatform of als onderdeel van een stream. Het abstraheert alle transportdetails en infrastructuur, waardoor de ontwikkelaar alle vertrouwde tools en processen kan behouden en zich stevig kan concentreren op bedrijfslogica.

Bekijk zoals altijd de broncode voor deze tutorial op GitHub.