BT

Disseminando conhecimento e inovação em desenvolvimento de software corporativo.

Contribuir

Tópicos

Escolha a região

Início Notícias Programação funcional utilizando o framework Spring Cloud Function

Programação funcional utilizando o framework Spring Cloud Function

Favoritos

O Spring Cloud Function é um novo projeto do time de Spring da Pivotal que tem por objetivo impulsionar funções como a unidade primária de desenvolvimento no trabalho. Além disso, projeto proporciona um modelo comum para realizar deploys destes tipos de software em diversas plataformas, inclusive plataformas FaaS (Function as a Service) como Amazon AWS Lambda.

Em comum com outros modelos serveless, o projeto tem por objetivo transformar funções como o conceito primário em que um desenvolvedor possa trabalhar. Um segundo ponto importante do projeto, é o desacoplamento de lógica de negócio do perfil de deploy. Quando a lógica de negócio é implementada como funções, pode ser aplicado no mesmo código perfis de implantações que expõe a função como um serviço RESTfull, como uma aplicação de processamento de stream (por exemplo Spring Cloud Data Flow), ou uma atividade finita. Isto significa que a mesma função pode ser implantada como uma aplicação standalone, ou implantada em uma plataforma FaaS (Function as a Service). Até agora, já foram desenvolvidas as integrações para AWS Lambda e Apache OpenWhisk, e com promessas para outras plataformas serverless como Google Cloud Function e Azure Functions, uma vez que há suporte a Java.

Apesar da abstração e um bom custo-benefício de plataformas como AWS Lambda, há uma preocupação, principalmente das empresas, do risco de se criar uma forte relação a fornecedores devido a adoção de códigos específicos do frameworks.

O especialista em tecnologias serveless Mike Roberts escreveu no blog de Martin Fowler:

Dependendo das circunstâncias, [sistemas FaaS serverless] podem reduzir significamente o gasto e a complexidade operacional a um custo de depender e (até o momento) da imaturidade do suporte dos serviços.

O Spring Cloud Function procura minimizar este problema introduzindo dependências de plataformas de implantação durante a fase de empacotamento na entrega do pipeline. Isto significa que o desenvolvedor pode implementar uma função em isolamento (inclusive criando testes unitários), focado apenas na lógica e nos parâmetros de entrada e saída da função. A função então é empacotada com as dependências necessárias para rodar no ambiente desejado.

Mark Fisher, o líder do projeto Spring Cloud Function, disse ao InfoQ:

Para serveless, queremos melhorar a experiência para os desenvolvedores Java, uma vez que portabilidade e consistência são grandes desafios.

O principal objetivo do projeto é promover o desenvolvimento baseado em funções, ao contrário dos mais conhecidos padrão Spring de POJOs. Para aqueles que já tiveram contato com o mundo serveless reconhecerá este modelo, onde desenvolvedores não tem conhecimento sobre a infraestrutura e sobre o framework, simplesmente se concentram na implementação das regras de negócio, ao invés dos códigos boilerplates. Com o Spring Cloud Function, a lógica de negócio é desenvolvida usando implementações das interfaces definidas no pacote java.util.function: Function, Consumer, e Supplier.

Neste pequeno exemplo, podemos criar uma classe que implementa a interface Function:

 import java.util.function.Function;
 public class LengthCounter implements Function {
      @Override 
      public Integer apply(String name) {
          return new Integer(name.length());
      }
  }

A mágica é realizada com uma varredura no classpath, habilitada pela anotação @FunctionScan

@FunctionScan
@SpringBootApplication
public class ExampleSpringFunctionApplication {
...

Também é possível declarar as funções no corpo da classe, anotando-as com @Bean:

@Bean
public Function lowercase() {
       return flux -> flux.map(value -> value.toLowerCase());
}

Utilizando esta abordagem, não é necessário a anotação @FunctionScan.

As funções são empacotadas como arquivos JAR, juntamente com as configurações necessárias e os adaptadores apropriados a plataforma de deploy escolhida.

Mark Fishe nos contou:

Independente de serveless, queremos promover a simplicidade de functions como uma unidade de desenvolvimento, e a portabilidade entre diversas plataformas de deploy.

Desenvolvedores concentram na criação de funções focadas em regras de negócio, utilizando as ferramentas, processos e facilidades que já são familiar com o ecossistema Spring Boot (ex: teste unitário, auto-configuration, injeção de dependência, métricas), enquanto os detalhes de transporte, infraestrutura, e frameworks de implantação são abstraídos.

O projeto está ainda em estado inicial mas o pessoal da Spring promete que mais coisas estão por vir, como integração com Fission e outras plataformas serveless baseadas em Kubernetes, assim como uma integração mais alinhada com a nova versão do Spring Cloud Data Flow.

Avalie esse artigo

Relevância
Estilo/Redação

Conteúdo educacional

BT