Funções sem servidor com a função Spring Cloud

Funções sem servidor com a função Spring Cloud

1. Introdução

Neste tutorial, aprenderemos como usar o Spring Cloud Function.

Vamos construir e executar um Spring Cloud Function simples localmente e, em seguida, implantá-lo no AWS.

2. Configuração da função Spring Cloud

Para começar, vamos implementar do zero e testar um projeto simples com duas funções usando abordagens diferentes:

  • Um reversor de String, usando um método simples

  • E um recepcionista usando uma classe dedicada

2.1. Dependências do Maven

A primeira coisa que precisamos fazer é incluir a dependênciaspring-cloud-starter-function-web. Isso atuará como nosso adaptador local e traz as dependências necessárias para executar nossa função localmente:


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

Fique ligado, pois vamos modificar um pouco isso quando estivermos implantando no AWS.

2.2. Escrevendo a função Spring Cloud

Com Spring Cloud Function,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();
    }
}

Como neste código, podemos expor um recurso de string reverso comoFunction, que nossa plataforma funcional de destino pode invocar.

2.3. Testando a função de seqüência reversa localmente

Ospring-cloud-starter-function-web apresenta a função sexualmente como um ponto de extremidade HTTP. Depois de executar oCloudFunctionApplication, podemos enrolar nosso alvo para testá-lo localmente:

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

Observe que o ponto de extremidade é o nome do bean.

E, como esperado, obtemos a string invertida como saída:

resU gnudleaB

2.4. Verificando a função Spring Cloud em pacotes

Além de expor nosso método como@Bean, , swe também pode escrever nosso software como classes que implementam a interface funcionalFunction<T, R>:

public class Greeter implements Function {

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

Podemos então especificar os pacotes para verificar os beans relevantes emapplication.properties:

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

2.5. Testando a função Greeter localmente

Novamente, podemos iniciar o aplicativo e usar curl para testar a funçãoGreeter:

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

Observe que o terminal é o nome da classe que implementa a interface funcional.

E, sem surpresa, recebemos a saudação esperada de volta:

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

3. Spring Cloud Function na AWS

O que torna o Spring Cloud Function tão poderoso é que podemos criar funções habilitadas para Spring que não são independentes da nuvem. A função em si não precisa saber sobre como foi chamada ou o ambiente em que está implantada. Por exemplo,we can easily deploy this greeter to AWS, Azure or Google Cloud platform without changing any of the business logic.

Como o AWS Lambda é uma das soluções populares sem servidor, vamos nos concentrar em como implantar nosso aplicativo nele.

Então, não vamos esperar mais e implantar nossa função na nuvem!

3.1. Dependências do Maven

Lembre-se da dependênciaspring-cloud-starter-function-web, que adicionamos originalmente. Agora é hora de mudar isso.

Veja, dependendo de onde vamos executar a Função Spring Cloud, precisamos adicionar a dependência apropriada.


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

A seguir, vamos adicionar as dependências AWS necessárias para lidar com eventos Lambda:


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


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

Por fim, como faremos o upload do artefato gerado pela compilação maven para o AWS Lambda, precisamos criar um artefato sombreado, o que significa que todas as dependências explodiram como arquivos de classe individuais em vez de frascos.

A dependênciaspring-boot-thin-layout  nos ajuda a reduzir o tamanho do artefato, excluindo algumas dependências que não são necessárias:


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

Se quisermos expor nosso reversor de string novamente por meio de uma solicitação HTTP, o Spring Cloud Function AWS vem comSpringBootRequestHandler.. Ele implementaRequestHandler do AWS e é responsável por despachar a solicitação AWS para nossa função.

public class MyStringHandlers extends SpringBootRequestHandler {

}

Spring Cloud Function AWS também vem comSpringBootStreamHandlereFunctionInvokingS3EventHandler como outros exemplos

Now, it may seem a bit odd that the MyStringHandlers is just an empty class but it plays an important role em ambos atuando como o ponto de entrada da função Lambda e também definindo seus tipos de entrada e saída.

Como veremos na captura de tela abaixo, forneceremos o nome totalmente qualificado desta classe no campo de entrada Handler da página de configuração do AWS Lambda.

3.3. Como a AWS sabe qual função de nuvem invocar?

Acontece que, mesmo que tenhamos mais de um Spring Cloud Function em nosso aplicativo,AWS can invoke only one of them.

Na próxima seção, especificaremos o nome da função da nuvem em uma variável de ambiente chamadaFUNCTION_NAME no console da AWS.

4. Faça upload da função para a AWS e teste

Por fim, vamos construir nosso jar com maven e, em seguida, carregá-lo por meio da AWS Console UI

4.1. Crie uma função Lambda no AWS Console e configure-a

Na página do console do AWS Lambda, na seção Código de função, podemos selecionar um tempo de execuçãoJava 8 e simplesmente clicar emUpload.

Depois disso, precisamos indicar no campoHandler  o nome totalmente qualificado da classe que implementaSpringBootRequestHandler, oucom.example.spring.cloudfunction.MyStringHandlers no nosso caso:

image

Em seguida, em variáveis ​​de ambiente, indicamos qual bean de função Spring invocar por meio da variável de ambienteFUNCTION_NAME :

image

E, feito isso, é hora de testarmos a função Lambda criando um evento de teste e fornecendo uma string de amostra:

image

4.2. Testando a função na AWS

Agora, fazemosSave nosso teste e, em seguida, clique no botãoTest.

E, como esperado, obtemos a mesma saída que obtivemos quando testamos a função localmente:

image

4.3. Testando Outra Função

Lembre-se, temos mais uma função em nosso aplicativo:greeter. Vamos nos certificar de que isso funcione também.

Vamos mudar a variável de ambienteFUNCTION_NAME paragreeter:

image

Clique no botãoSave e, finalmente, no botãoTest novamente:

image

5. Conclusão

Em resumo, embora em seus estágios iniciais,Spring Cloud Function is a powerful tool for decoupling the business logic from any specific runtime target.

Com ele, o mesmo código pode ser executado como um terminal da Web, em uma plataforma em nuvem ou como parte de um fluxo. Ele abstrai todos os detalhes e infraestrutura de transporte, permitindo que o desenvolvedor mantenha todas as ferramentas e processos familiares e se concentre firmemente na lógica de negócios.

Como sempre, verifique o código-fonte deste tutorialover on GitHub.