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 Function, Consumer 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.
Para AWS, usaremosspring-cloud-function-adapter-aws:
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:
Em seguida, em variáveis de ambiente, indicamos qual bean de função Spring invocar por meio da variável de ambienteFUNCTION_NAME :
E, feito isso, é hora de testarmos a função Lambda criando um evento de teste e fornecendo uma string de amostra:
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:
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.