Fonctions sans serveur avec fonction Spring Cloud

Fonctions sans serveur avec fonction Spring Cloud

1. introduction

Dans ce tutoriel, nous allons apprendre à utiliser Spring Cloud Function.

Nous allons créer et exécuter une simple fonction Spring Cloud en local, puis la déployer sur AWS.

2. Configuration de la fonction Spring Cloud

Pour commencer, mettons en œuvre à partir de zéro et testons un projet simple avec deux fonctions utilisant des approches différentes:

  • Un inverseur de chaîne, en utilisant une méthode simple

  • Et un greeter utilisant une classe dédiée

2.1. Dépendances Maven

La première chose à faire est d'inclure la dépendancespring-cloud-starter-function-web. Cela fera office d'adaptateur local et apportera les dépendances nécessaires pour exécuter notre fonction localement:


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

Restez à l'écoute car nous modifierons cela un peu lors du déploiement sur AWS.

2.2. Ecrire la fonction Spring Cloud

Avec la fonction Spring Cloud,we 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();
    }
}

Comme dans ce code, nous pouvons exposer une fonctionnalité de chaîne inversée en tant queFunction, que notre plate-forme fonctionnelle cible peut appeler.

2.3. Test local de la fonction de chaîne inverse

Lespring-cloud-starter-function-web expose la fonction en tant que point de terminaison HTTP. Après avoir exécuté lesCloudFunctionApplication, nous pouvons curl notre cible pour la tester localement:

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

Notez que le point de terminaison est le nom du bean.

Et comme prévu, nous obtenons la chaîne inversée en sortie:

resU gnudleaB

2.4. Analyse de la fonction Spring Cloud dans les packages

En plus d'exposer notre méthode en tant que@Bean, we, nous pourrions également écrire notre logiciel sous forme de classes qui implémentent l'interface fonctionnelleFunction<T, R>:

public class Greeter implements Function {

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

Nous pouvons ensuite spécifier les packages à analyser pour les beans pertinents enapplication.properties:

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

2.5. Test de la fonction Greeter localement

Encore une fois, nous pouvons démarrer l'application et utiliser curl pour tester la fonctionGreeter:

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

Notez que le point de terminaison est le nom de la classe qui implémente l'interface fonctionnelle.

Et, sans surprise, nous recevons le message d'accueil attendu:

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

3. Fonction Spring Cloud sur AWS

Ce qui rend Spring Cloud Function si puissant, c’est que nous pouvons créer des fonctions qui ne dépendent pas de Spring et qui sont compatibles Spring. La fonction elle-même n'a pas besoin de savoir comment elle a été appelée ou l'environnement dans lequel elle est déployée. Par exemple,we can easily deploy this greeter to AWS, Azure or Google Cloud platform without changing any of the business logic.

Étant donné qu'AWS Lambda est l'une des solutions sans serveur les plus populaires, concentrons-nous sur la manière d'y déployer notre application.

Alors n’attendons plus et déployez notre fonction dans le cloud!

3.1. Dépendances Maven

Souvenez-vous de la dépendancespring-cloud-starter-function-web, que nous avons ajoutée à l'origine. Il est maintenant temps de changer cela.

Vous voyez, selon l'endroit où nous allons exécuter la fonction Spring Cloud, nous devons ajouter la dépendance appropriée.

Pour AWS, nous utiliseronsspring-cloud-function-adapter-aws:


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

Ensuite, ajoutons les dépendances AWS requises pour gérer les événements Lambda:


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


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

Enfin, comme nous allons télécharger l'artefact généré par la construction maven vers AWS Lambda, nous devons créer un artefact ombré, ce qui signifie que toutes les dépendances sont éclatées en tant que fichiers de classe individuels au lieu de fichiers JAR.

La dépendancespring-boot-thin-layout  nous aide à réduire la taille de l'artefact en excluant certaines dépendances qui ne sont pas nécessaires:


    
        
            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. Gestionnaires AWS

Si nous voulons à nouveau exposer notre inverseur de chaîne via une requête HTTP, Spring Cloud Function AWS est livré avecSpringBootRequestHandler..Il implémente lesRequestHandler d'AWS et est chargé de distribuer la requête AWS à notre fonction.

public class MyStringHandlers extends SpringBootRequestHandler {

}

Spring Cloud Function AWS est également livré avecSpringBootStreamHandler etFunctionInvokingS3EventHandler comme autres exemples

Now, it may seem a bit odd that the MyStringHandlers is just an empty class but it plays an important role à la fois agissant comme point d'entrée de la fonction Lambda et définissant également ses types d'entrée et de sortie.

Comme nous le verrons dans la capture d'écran ci-dessous, nous fournirons le nom complet de cette classe dans le champ de saisie Handler de la page de configuration AWS Lambda.

3.3. Comment AWS sait-il quelle fonction cloud appeler?

En fait, même si nous avons plus d'une fonction Spring Cloud dans notre application,AWS can invoke only one of them.

Dans la section suivante, nous allons spécifier le nom de la fonction cloud dans une variable d'environnement appeléeFUNCTION_NAME sur la console AWS.

4. Téléchargez la fonction sur AWS et testez

Enfin, construisons notre fichier jar avec maven, puis importons-le via l'interface utilisateur de la console AWS.

4.1. Créez une fonction Lambda sur AWS Console et configurez-la

Sur la page de la console AWS Lambda, dans la section Code de fonction, nous pouvons sélectionner un environnement d'exécutionJava 8 et cliquer simplement surUpload.

Après cela, nous devons indiquer dans le champHandler  le nom complet de la classe qui implémenteSpringBootRequestHandler, oucom.example.spring.cloudfunction.MyStringHandlers dans notre cas:

image

Et puis dans les variables d'environnement, nous indiquons quel bean de fonction Spring appeler via la variable d'environnementFUNCTION_NAME :

image

Et cela fait, il est temps pour nous de tester la fonction Lambda en créant un événement de test et en fournissant un exemple de chaîne:

image

4.2. Test de la fonction sur AWS

Maintenant, nousSave notre test, puis cliquez sur le boutonTest.

Et, comme prévu, nous obtenons le même résultat que lorsque nous avons testé la fonction localement:

image

4.3. Tester une autre fonction

N'oubliez pas que nous avons une autre fonction dans notre application:greeter. Assurons-nous que cela fonctionne également.

Nous allons changer la variable d'environnementFUNCTION_NAME engreeter:

image

Cliquez sur le boutonSave et enfin, sur le boutonTest à nouveau:

image

5. Conclusion

En résumé, bien qu'à ses débuts,Spring Cloud Function is a powerful tool for decoupling the business logic from any specific runtime target.

Avec lui, le même code peut être exécuté en tant que point de terminaison Web, sur une plate-forme cloud ou dans le cadre d'un flux. Il supprime tous les détails et l'infrastructure de transport, permettant au développeur de conserver tous les outils et processus familiers, et de se concentrer fermement sur la logique métier.

Comme toujours, consultez le code source de ce tutorielover on GitHub.