Microsserviços

Tecnologias Utilizadas

Os microsserviços têm como base os seguintes frameworks Java:

  • Spring Boot, como alicerce da arquitetura

  • Spring Security (nova stack), para camada de segurança com OIDC / OAuth2

  • Spring Data JPA, para suporte ao JPA

  • Spring JPA Auditing, para auditoria básica com JPA

  • Spring Web MVC, para webservices

  • Spring Boot Admin client, para monitoramento via Actuator

  • Swagger, para documentação dos endpoints webservice

  • Micrometer, com exposição de métricas, técnicas ou negociais, para Prometheus

  • Log4j2, para logging de aplicação

  • Lombok, que reduz código de classes POJO, DTOs e Entidades persistentes

  • Tomcat, container runtime

  • Cloudsupport, que oferece componentes estruturais

Os microsserviços utilizam como dependência a biblioteca Maven cloudsupport-parent, que inclui módulos e componentes para aumentar produtividade dos desenvolvedores bem como auxiliar o cumprimento dos padrões e convenções de código definidos ao longo deste manual. Dessa forma o código-fonte dos projetos fica enxuto e o desenvolvedor poderá focar naquilo que lhe é útil: persistência e regras de negócio.

A biblioteca cloudsupport-parent é um projeto Maven BOM. Ao herdar do cloudsupport-parent, os microsserviços:

  • Recebem automaticamente a biblioteca cloudsupport.

  • Não precisam declarar a versão do plugin Maven do Spring Boot.

Considere o exemplo cloudsupport-archetype-backend como ponto de partida para novos projetos bem como para acompanhar a leitura deste manual e melhor assimilar os conceitos.

Funcionalidades da Arquitetura

São funcionalidades oferecidas pelo Cloudsupport para backend:

  • Active Record, pattern para acesso simplificado às operações de persistência.

  • Pattern próprio da arquitetura para implementação das Features, que permite um código mais legível, mais encapsulado, sem referências cíclicas, organizado por funcionalidades e orientado ao requisito funcional. Manutenibilidade e mitigação de bugs são ganhos destaques deste padrão.

  • Mapeamento automático de endpoints webservice, via anotação da arquitetura, para alta produtividade e padronização, sem limitar os recursos do Spring MVC.

  • Versionamento de API webservice, por convenções da arquitetura.

  • Rastreamento de falhas, via tratamento automático e padronizado de exceções não tratadas pelo desenvolvedor, com geração de código único de rastreamento e não exposição de dados técnicos e/ou sensíveis para o cliente ou frontend.

  • Motor de jobs, lightweight, com implementação inspirada no Spring Batch e normas do Java, para o desenvolvimento rápido de rotinas background, com suporte a:

    • Vários modelos de execução: Iterativo, Produtor-Consumidor finito e Produtor-Consumidor contínuo, este para filas de alta performance.

    • Persistência do status de execução em banco de dados.

    • Monitoramento.

    • Controle de interrupção.

    • Gerenciamento de falhas.

  • Geração aprimorada da documentação OpenAPI/Swagger, com reconhecimento automático das convenções da arquitetura, incluindo do versionamento de API.

  • Logging enriquecido com dados de ambiente (build-info.properties), que inclui versão do microsserviço.

  • Suporte a HA (High Availability) em ambiente Kubernetes, com zero downtime, provido por endpoints integrados ao Actuator que implementam probes para o ciclo de rollout do K8s.

Estrutura de Camadas

Os microsserviços possuem as seguintes camadas:

Camadas do Backend

Descrição das camadas:

  • Camada de Persistência (Persistence), engloba o mapeamento JPA das entidades persistentes.

  • Camada de Integração (Remotes), classes clientes que fazem a comunicação com serviços externos.

  • Camada de Negócio (Services), composta pelas features ou funcionalidades de negócio. Cada feature é composta de duas classes principais:

    • “Service”, contém as regras de negócio. A classe de serviço pode utilizar eventuais classes complementares, como fragmentos, DTOs etc.

    • “Adapter”, responsável por disponibilizar o serviço em determinado protocolo de comunicação. Inclui, como por exemplo, o mapeamento do serviço na forma endpoint webservice, mapeamento para mensageria ou mesmo mapeamento como rotina em background.

Outras camadas e outros frameworks podem ser adicionados no projeto de acordo com suas necessidades específicas. Por exemplo:

  • Para banco distribuído transacional (ACID), do tipo Document Store, pode ser adicionado o MongoDB.

  • Para banco distribuído altamente escalável, do tipo Column, pode ser adicionado o Cassandra.

  • Para banco distribuído Key-Value em memória, com finalidade, por exemplo, de caching, pode ser adicionado o Redis.

  • Para banco de armazenamento de arquivos de alta volumetria, pode ser adicionado um S3 (AWS S3 ou Minio).

  • Para mensageria, pode ser adicionado o Apache RabbitMQ ou Apache Kafka, conforme o cenário.

Estrutura de Arquivos

A estrutura de pastas e arquivos segue o padrão do Apache Maven, sendo, ao mínimo:

pom.xml
src/
   main/
      java/
      resources/

O arquivo pom.xml é o descritor Maven do projeto. Nele é configurado o uso da biblioteca cloudsupport-parent.

A pasta java segue a estrutura de pacotes:

Pacote Descrição
dominio.nomeMicrosservico.persistence Camada de persistência; Contém as entidades persistentes mapeadas com JPA.
dominio.nomeMicrosservico.services Camada de negócio; Contém as classes que implementam as regras de negócio.
dominio.nomeMicrosservico.remotes Camada de funcionalidades remotas; Contém as classes clientes para comunicação com outros microsserviços ou serviços externos.
dominio.nomeMicrosservico.util Classes estáticas utilitárias.

Outros pacotes podem ser criados conforme necessidade. O pacote spring pode ser utilizado para Beans de configuração do Spring Boot.

A pasta resources contém os seguintes arquivos de configuração:

Arquivo Descrição
application.properties Configurações básicas da aplicação.
application-local.properties Configurações da aplicação para o ambiente local.
application-nomeDoAmbiente.properties Configurações da aplicação para outros ambientes, como teste, homologação ou produção; Propriedades com dados sensíveis (como senhas) podem ser definidas em tempo de execução pelo cluster Kubernetes.

Próximos Passos

As seções Persistência, Negócio e Integração detalham respectivamente as camadas persistence, services e remotes. Tópicos especiais são tratados nas seções de Concorrência e de Transações Distribuídas, cuja leitura é igualmente importante.