Serverlose Funktionen mit Spring Cloud-Funktion

1. Einleitung

In diesem Tutorial erfahren Sie, wie Sie die Spring Cloud-Funktion verwenden.

Wir werden eine einfache Spring Cloud-Funktion lokal erstellen und ausführen und sie dann in AWS bereitstellen.

2. Einrichtung der Spring Cloud-Funktion

Lassen Sie uns zunächst ein einfaches Projekt mit zwei Funktionen implementieren und testen, wobei unterschiedliche Ansätze verwendet werden:

  • Ein String-Umkehrer mit einer einfachen Methode
  • Und ein Begrüßer mit einer speziellen Klasse

2.1. Maven-Abhängigkeiten

Das erste, was wir tun müssen, ist die Webabhängigkeit Spring-Cloud-Starter-Function-Web . Dies fungiert als unser lokaler Adapter und bringt die notwendigen Abhängigkeiten mit sich, um unsere Funktion lokal auszuführen:

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

Bleiben Sie auf dem Laufenden, da wir dies bei der Bereitstellung in AWS ein wenig ändern werden.

2.2. Schreiben der Spring Cloud-Funktion

Mit der Spring Cloud-Funktion können wir @Beans vom Typ Funktion , Verbraucher oder Lieferant als einzelne Methoden verfügbar machen :

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

Wie in diesem Code können wir eine Funktion für umgekehrte Zeichenfolgen als Funktion verfügbar machen, die unsere Zielfunktionsplattform aufrufen kann.

2.3. Lokales Testen der Reverse String-Funktion

Das Spring-Cloud-Starter-Funktions-Web macht die Funktion als HTTP-Endpunkt verfügbar . Nachdem wir die CloudFunctionApplication ausgeführt haben , können wir unser Ziel locken, um es lokal zu testen:

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

Beachten Sie, dass der Endpunkt der Name der Bean ist.

Und wie erwartet erhalten wir die umgekehrte Zeichenfolge als Ausgabe:

resU gnudleaB

2.4. Scannen der Spring Cloud-Funktion in Paketen

Abgesehen davon, dass wir unsere Methode als @Bean verfügbar machen, können wir unsere Software auch als Klassen schreiben, die die Funktionsschnittstelle implementieren. Funktion :

public class Greeter implements Function { @Override public String apply(String s) { return "Hello " + s + ", and welcome to Spring Cloud Function!!!"; } }

Anschließend können wir die Pakete angeben, die in application.properties nach relevanten Beans durchsucht werden sollen :

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

2.5. Testen der Greeter-Funktion vor Ort

Wieder können wir die App starten und Curl verwenden, um die Greeter- Funktion zu testen :

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

Beachten Sie, dass der Endpunkt der Name der Klasse ist, die die Funktionsschnittstelle implementiert.

Und keine Überraschung, wir bekommen den erwarteten Gruß zurück:

Hello World, and welcome to Spring Cloud function!!!

3. Spring Cloud-Funktion unter AWS

Was Spring Cloud Function so leistungsfähig macht, ist, dass wir Spring-fähige Funktionen erstellen können, die Cloud-unabhängig sind. Die Funktion selbst muss nicht wissen, wie sie aufgerufen wurde oder in welcher Umgebung sie bereitgestellt wird. Beispielsweise können wir diesen Begrüßer problemlos auf AWS-, Azure- oder Google Cloud-Plattformen bereitstellen, ohne die Geschäftslogik zu ändern.

Da AWS Lambda eine der beliebtesten Lösungen ohne Server ist, konzentrieren wir uns darauf, wie unsere App darin bereitgestellt wird.

Warten wir also nicht länger und stellen unsere Funktion in der Cloud bereit!

3.1. Maven-Abhängigkeiten

Denken Sie an die Spring-Cloud-Starter-Funktion-Web- Abhängigkeit, die wir ursprünglich hinzugefügt haben. Jetzt ist es Zeit, das zu ändern.

Je nachdem, wo die Spring Cloud-Funktion ausgeführt werden soll, müssen Sie die entsprechende Abhängigkeit hinzufügen.

Für AWS verwenden wir Spring-Cloud-Funktionsadapter-aws :

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

Als Nächstes fügen wir die erforderlichen AWS-Abhängigkeiten hinzu, um Lambda-Ereignisse zu behandeln:

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

Da wir das vom Maven-Build generierte Artefakt in AWS Lambda hochladen möchten, müssen wir ein Artefakt erstellen, das schattiert ist. Dies bedeutet, dass alle Abhängigkeiten als einzelne Klassendateien anstelle von Jars explodiert sind.

Die Spring-Boot-Thin-Layout- Abhängigkeit hilft uns, die Größe des Artefakts zu reduzieren, indem einige nicht benötigte Abhängigkeiten ausgeschlossen werden:

   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-shade-plugin  false true aws    

3.2. AWS-Handler

If we want to expose our string reverser again via an HTTP request, then Spring Cloud Function AWS ships with SpringBootRequestHandler. It implements AWS's RequestHandler and is in charge of dispatching the AWS request to our function.

public class MyStringHandlers extends SpringBootRequestHandler { }

Spring Cloud Function AWS also ships with SpringBootStreamHandler and FunctionInvokingS3EventHandler as other examples

Now, it may seem a bit odd that the MyStringHandlers is just an empty class but it plays an important role in both acting as the entry point of the Lambda function and also defining its input and output types.

As we'll see in the screenshot below, we'll provide the fully qualified name of this class in the Handler input field of the AWS Lambda configuration page.

3.3. How Does AWS Know Which Cloud Function to Invoke?

As it turns out, even if we have more than one Spring Cloud Function in our application, AWS can invoke only one of them.

In the next section, we'll specify the cloud function name in an environment variable called FUNCTION_NAME on the AWS console.

4. Upload the Function to AWS and Test

Finally, let's build our jar with maven, and then upload it via the AWS Console UI.

4.1. Create a Lambda Function on AWS Console and Configure It

On the AWS Lambda console page, in the Function code section, we can select a Java 8 runtime and simply click Upload.

After that, we need to indicate in the Handler field the fully-qualified name of the class that implements SpringBootRequestHandler, or com.baeldung.spring.cloudfunction.MyStringHandlers in our case:

And then in Environment variables, we indicate which Spring function bean to invoke via the FUNCTION_NAME environment variable:

And having done that, it's time for us to test the Lambda function by creating a test event and supplying a sample string:

4.2. Testing the Function on AWS

Now, we Save our test, then click the Test button.

And, as expected, we get the same output as what we got when we tested the function locally:

4.3. Testing Another Function

Remember, we have one more function in our application: greeter. Let's make sure that works too.

We'll change the FUNCTION_NAME environment variable to greeter:

Click the Save button and finally, the Test button again:

5. Conclusion

In summary, though in its early stages, Spring Cloud Function is a powerful tool for decoupling the business logic from any specific runtime target.

Damit kann derselbe Code als Webendpunkt, auf einer Cloud-Plattform oder als Teil eines Streams ausgeführt werden. Es abstrahiert alle Transportdetails und die Infrastruktur, sodass der Entwickler alle bekannten Tools und Prozesse behalten und sich fest auf die Geschäftslogik konzentrieren kann.

Schauen Sie sich wie immer den Quellcode für dieses Tutorial auf GitHub an.