Serverlose Funktionen mit Spring Cloud-Funktion

Serverlose Funktionen mit Spring Cloud-Funktion

1. Einführung

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

Wir erstellen und führen eine einfache Spring Cloud-Funktion lokal aus und stellen sie dann in AWS bereit.

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, der eine einfache Methode verwendet

  • Und ein Begrüßer, der eine dedizierte Klasse benutzt

2.1. Maven-Abhängigkeiten

Das erste, was wir tun müssen, ist die Abhängigkeit vonspring-cloud-starter-function-webeinzuschließen. Dies fungiert als unser lokaler Adapter und bringt die notwendigen Abhängigkeiten ein, 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 werdenwe can expose @Beans of type FunctionConsumer or Supplier as individual methods:

@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 ein Reverse-String-Feature alsFunction verfügbar machen, das unsere Zielfunktionsplattform aufrufen kann.

2.3. Lokales Testen der Reverse String-Funktion

Dasspring-cloud-starter-function-web exposiert die Funktion als HTTP-Endpunkt. Nachdem wirCloudFunctionApplication ausgeführt haben, können wir unser Ziel kräuseln, um es lokal zu testen:

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

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

Und wie erwartet erhalten wir den umgekehrten String als Ausgabe:

resU gnudleaB

2.4. Scannen der Spring Cloud-Funktion in Paketen

Abgesehen davon, dass unsere Methode als@Bean, we verfügbar gemacht wird, könnte unsere Software auch als Klassen geschrieben werden, die die funktionale SchnittstelleFunction<T, R> implementieren:

public class Greeter implements Function {

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

Wir können dann die Pakete angeben, die inapplication.properties nach relevanten Beans durchsucht werden sollen:

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

2.5. Testen der Greeter-Funktion vor Ort

Wieder können wir die App starten und Curl verwenden, um die Funktion vonGreeterzu 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.

Kein Wunder, dass wir den erwarteten Gruß zurückbekommen:

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. Zum Beispielwe can easily deploy this greeter to AWS, Azure or Google Cloud platform without changing any of the business logic.

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 Abhängigkeit vonspring-cloud-starter-function-web, die wir ursprünglich hinzugefügt haben. Jetzt ist es Zeit, das zu ändern.

Abhängig davon, wo wir die Spring Cloud-Funktion ausführen, müssen wir die entsprechende Abhängigkeit hinzufügen.

Für AWS verwenden wirspring-cloud-function-adapter-aws:


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

Fügen Sie als Nächstes die erforderlichen AWS-Abhängigkeiten hinzu, um Lambda-Ereignisse zu verarbeiten:


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


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

Da wir das durch den Maven-Build generierte Artefakt in AWS Lambda hochladen möchten, müssen wir ein Artefakt erstellen, das schattiert ist, dh, alle Abhängigkeiten werden als einzelne Klassendateien anstelle von Gläsern explodiert.

Diespring-boot-thin-layout -Sdependenz 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

Wenn wir unseren String-Umkehrer über eine HTTP-Anforderung erneut verfügbar machen möchten, wird die Spring Cloud-Funktion AWS mitSpringBootRequestHandler.geliefert. Sie implementiert dieRequestHandlervon AWS und ist für den Versand der AWS-Anforderung an unsere Funktion verantwortlich.

public class MyStringHandlers extends SpringBootRequestHandler {

}

Spring Cloud-Funktion AWS wird auch mitSpringBootStreamHandler undFunctionInvokingS3EventHandler als weiteren Beispielen geliefert

Now, it may seem a bit odd that the MyStringHandlers is just an empty class but it plays an important role fungiert sowohl als Einstiegspunkt der Lambda-Funktion als auch als Definition ihrer Eingabe- und Ausgabetypen.

Wie im folgenden Screenshot zu sehen ist, geben wir den vollständig qualifizierten Namen dieser Klasse im Eingabefeld "Handler" der AWS Lambda-Konfigurationsseite an.

3.3. Woher weiß AWS, welche Cloud-Funktion aufgerufen werden soll?

Wie sich herausstellt, sindAWS can invoke only one of them., selbst wenn wir mehr als eine Spring Cloud-Funktion in unserer Anwendung haben

Im nächsten Abschnitt geben wir den Namen der Cloud-Funktion in einer Umgebungsvariablen mit dem NamenFUNCTION_NAME in der AWS-Konsole an.

4. Laden Sie die Funktion in AWS hoch und testen Sie sie

Lassen Sie uns abschließend unser Glas mit maven erstellen und es dann über die AWS Console-Benutzeroberfläche hochladen.

4.1. Erstellen Sie eine Lambda-Funktion in der AWS-Konsole und konfigurieren Sie sie

Auf der AWS Lambda-Konsolenseite können Sie im Abschnitt Funktionscode die Laufzeit vonJava 8auswählen und einfach aufUpload klicken.

Danach müssen wir im FeldHandler den vollständig qualifizierten Namen der Klasse angeben, dieSpringBootRequestHandler odercom.example.spring.cloudfunction.MyStringHandlers in unserem Fall implementiert:

image

Und dann geben wir in Umgebungsvariablen an, welche Spring-Funktions-Bean über die UmgebungsvariableFUNCTION_NAME aufgerufen werden soll:

image

Nachdem wir dies getan haben, ist es Zeit für uns, die Lambda-Funktion zu testen, indem wir ein Testereignis erstellen und eine Beispielzeichenfolge bereitstellen:

image

4.2. Testen der Funktion unter AWS

Jetzt testen wirSave und klicken dann auf die SchaltflächeTest.

Und wie erwartet erhalten wir die gleiche Ausgabe wie beim Testen der Funktion vor Ort:

image

4.3. Eine andere Funktion testen

Denken Sie daran, wir haben eine weitere Funktion in unserer Anwendung:greeter. Stellen wir sicher, dass dies auch funktioniert.

Wir ändern die UmgebungsvariableFUNCTION_NAME ingreeter:

image

Klicken Sie auf die SchaltflächeSave und schließlich erneut auf die SchaltflächeTest:

image

5. Fazit

Zusammenfassend lässt sich sagen, dassSpring Cloud Function is a powerful tool for decoupling the business logic from any specific runtime target., obwohl in einem frühen Stadium

Damit kann derselbe Code als Web-Endpunkt, auf einer Cloud-Plattform oder als Teil eines Streams ausgeführt werden. Alle Transportdetails und die Infrastruktur werden entfernt, sodass der Entwickler alle bekannten Tools und Prozesse beibehalten und sich ganz auf die Geschäftslogik konzentrieren kann.

Überprüfen Sie wie immer den Quellcode für dieses Tutorialover on GitHub.