image

Acesse bootcamps ilimitados e +650 cursos pra sempre

60
%OFF
Daniel Bevilacqua
Daniel Bevilacqua22/08/2025 12:23
Compartilhe

Fundamentos de Microsserviços com Java: Comparativo entre Monolítico, Microsserviços e tecnologias

    Olá comunidade DIO, neste artigo farei apenas um comparativo do que estudei no quarto semestre de ciência de dados na Gran faculdade sobre as tecnologias de microsserviços, fazendo um comparativo entre a arquitetura tradicional monolítica e também as diferenças de tecnologias utilizadas dos dois modelos de arquitetura de software.

        Devido a complexidade da área de desenvolvimento, decidi começar com um glossário de termos técnicos

                      Glossário de termos Técnicos 

    • API (Application Programming Interface): Conjunto de definições e protocolos que permite que diferentes softwares se comuniquem. Em microsserviços, é como os serviços "conversam" entre si.
    • API Gateway: Um único ponto de entrada para todas as requisições externas de uma aplicação de microsserviços. Ele roteia as requisições para os serviços corretos, e pode também lidar com autenticação, segurança e rate limiting.
    • Apache Kafka: Uma plataforma de streaming distribuída de alta performance, usada para comunicação assíncrona entre serviços e processamento de dados em tempo real.
    • Arquitetura Monolítica: Um modelo de software onde todas as funcionalidades de uma aplicação são empacotadas em uma única unidade implantável.
    • Circuit Breaker (Disjuntor): Um padrão de resiliência que previne que uma falha em um serviço se propague para outros, "abrindo o circuito" para o serviço problemático e evitando chamadas desnecessárias ou longos timeouts.
    • CI/CD (Continuous Integration/Continuous Delivery): Práticas de desenvolvimento de software que automatizam a integração de código, testes e entrega (deploy) de aplicações.
    • Consistência Eventual: Um modelo de consistência de dados onde os dados podem não estar imediatamente atualizados em todos os locais, mas eventualmente alcançarão um estado consistente. Comum em arquiteturas distribuídas com bancos de dados independentes.
    • Contêineres: Pacotes leves e portáteis que incluem uma aplicação e todas as suas dependências (código, runtime, bibliotecas, etc.), garantindo que ela rode de forma consistente em qualquer ambiente.
    • DevOps: Um conjunto de práticas que busca unificar o desenvolvimento de software (Dev) e as operações (Ops), promovendo colaboração e automação para melhorar a entrega e a estabilidade.
    • Docker: Uma plataforma de código aberto para criar, empacotar e executar aplicações em contêineres.
    • ELK Stack (Elasticsearch, Logstash, Kibana): Um conjunto de ferramentas para centralizar, analisar e visualizar logs de aplicações.
    • Eureka Server (Spring Cloud Netflix Eureka): Um serviço de Service Discovery que permite que microsserviços se registrem e descubram uns aos outros dinamicamente.
    • Fallback: Uma estratégia de resiliência onde, se uma chamada a um serviço falha, uma resposta alternativa ou padrão é retornada para evitar que o sistema pare.
    • GRPC: Um framework de código aberto de alta performance para comunicação remota entre serviços, usando Protocol Buffers.
    • Hystrix (ou Resilience4j): Bibliotecas Java que implementam padrões de resiliência como Circuit Breaker, Retry e Fallback para microsserviços.
    • Jaeger (ou Zipkin): Ferramentas de Distributed Tracing que permitem rastrear uma requisição à medida que ela passa por múltiplos microsserviços, facilitando a depuração e o monitoramento.
    • Java EE (Enterprise Edition): Uma plataforma para desenvolvimento de aplicações corporativas em Java, geralmente associada a arquiteturas monolíticas tradicionais.
    • JWT (JSON Web Token): Um padrão compacto e autocontido para representar informações de forma segura entre duas partes, frequentemente usado para autenticação e autorização em APIs.
    • Kubernetes (K8s): Uma plataforma de orquestração de contêineres que automatiza a implantação, o dimensionamento e o gerenciamento de aplicações conteinerizadas.
    • Logs Centralizados: A prática de coletar logs de todos os serviços de uma aplicação distribuída em um único local para facilitar a busca, análise e depuração.
    • Mensageria Assíncrona: Um padrão de comunicação onde os serviços trocam mensagens através de uma fila ou tópico, sem esperar por uma resposta imediata. Permite desacoplamento e resiliência.
    • Microsserviços: Uma abordagem arquitetural que estrutura uma aplicação como uma coleção de serviços pequenos, autônomos e independentes, cada um com sua própria base de código e banco de dados.
    • Monitoramento: O processo de coletar e analisar métricas de desempenho e saúde de sistemas e aplicações para identificar problemas, gargalos e tendências.
    • OAuth2 / OpenID Connect: Padrões para autenticação e autorização de usuários e aplicações, frequentemente usados em ambientes de microsserviços.
    • Prometheus: Um sistema de monitoramento e alerta de código aberto que coleta métricas de aplicações e infraestrutura.
    • RabbitMQ: Um message broker (corretor de mensagens) de código aberto que implementa o protocolo AMQP, ideal para filas de tarefas e comunicação ponto a ponto ou "publicar/assinar".
    • Rate Limiting: Uma técnica para controlar a quantidade de requisições que um cliente ou usuário pode fazer a um serviço em um determinado período de tempo.
    • REST (Representational State Transfer): Um estilo arquitetural para sistemas distribuídos, comumente usado para criar APIs web que permitem a comunicação entre serviços.
    • Retry: Um padrão de resiliência onde uma operação falha é automaticamente tentada novamente após um curto período de tempo.
    • Saga Pattern: Um padrão de transação distribuída usado para manter a consistência de dados em um ambiente de microsserviços, onde uma transação de negócio abrange múltiplos serviços.
    • Service Discovery: O mecanismo pelo qual os serviços podem encontrar e se comunicar com outros serviços sem precisar conhecer seus endereços IP ou portas fixas.
    • SRE (Site Reliability Engineering): Uma disciplina que aplica princípios de engenharia de software à operação de sistemas de produção, com foco em automação, confiabilidade e escalabilidade.
    • Spring Boot: Um framework Java que simplifica o desenvolvimento de aplicações e microsserviços, oferecendo configuração mínima e servidores embarcados.
    • Spring Cloud: Uma coleção de projetos que fornece ferramentas para construir e implantar microsserviços em Java, implementando padrões comuns de arquitetura distribuída.
    • TLS/HTTPS: Protocolos de segurança que criptografam a comunicação pela rede, garantindo a privacidade e integridade dos dados trocados entre serviços.
    • Tracing Distribuído: A capacidade de rastrear a jornada de uma requisição através de múltiplos serviços em um sistema distribuído, útil para depuração e otimização de desempenho.
    • Vault (HashiCorp Vault): Uma ferramenta para gerenciar de forma segura segredos e credenciais em ambientes de produção
    • Java + Spring Boot:
    • Java: É uma linguagem de programação orientada a objetos, amplamente utilizada para desenvolver aplicações robustas e escaláveis, desde sistemas de back-end até aplicações móveis e desktop. Sua principal característica é a portabilidade ("write once, run anywhere"), ou seja, o código Java pode ser executado em diferentes sistemas operacionais sem necessidade de recompilação.
    • Spring Boot: É um framework que simplifica o desenvolvimento de aplicações Java, especialmente microsserviços. Ele se baseia no Spring Framework (um dos mais populares para Java) e oferece uma configuração mínima, o que acelera significativamente o processo de criação de serviços. O Spring Boot já vem com servidores embarcados (como o Tomcat ou Jetty), dependências pré-configuradas e uma série de funcionalidades que permitem que o desenvolvedor se concentre mais na lógica de negócio e menos na infraestrutura.
    • Spring Cloud:
    • Microsserviços: São uma arquitetura de desenvolvimento de software onde uma aplicação é construída como uma coleção de pequenos serviços independentes, cada um executando seu próprio processo e se comunicando através de APIs bem definidas.
    • Spring Cloud: É uma coleção de projetos que fornece ferramentas para construir e implantar microsserviços em Java. Ele oferece implementações de padrões comuns em arquiteturas de microsserviços, como:
    • Service Discovery: Permite que os serviços se encontrem e se comuniquem entre si. Em um ambiente de microsserviços, os endereços dos serviços podem mudar dinamicamente, e o service discovery garante que eles possam localizar uns aos outros.
    • Config Server: Centraliza a configuração de todos os serviços. Isso evita que cada serviço tenha sua própria configuração embutida, facilitando a gestão e atualização.
    • Circuit Breaker: É um padrão de resiliência que evita que uma falha em um serviço se propague para outros serviços. Se um serviço está inativo ou respondendo lentamente, o circuit breaker "abre o circuito" para ele, redirecionando as chamadas ou retornando uma resposta padrão, evitando que outros serviços fiquem esperando indefinidamente.
    • Docker:
    • Empacotamento e Execução Isolada dos Serviços: O Docker é uma plataforma de código aberto que permite empacotar aplicações e suas dependências em "contêineres". Um contêiner é uma unidade de software padronizada que inclui tudo o que a aplicação precisa para funcionar: código, runtime, ferramentas de sistema, bibliotecas e configurações.
    • Benefícios: O Docker garante que a aplicação funcione da mesma forma em qualquer ambiente (desenvolvimento, teste, produção), eliminando problemas de "funciona na minha máquina". Ele também proporciona isolamento (os contêineres não interferem uns nos outros) e eficiência (os contêineres são leves e iniciam rapidamente).
    • Kubernetes:
    • Orquestração e Escalabilidade Automática: O Kubernetes (muitas vezes abreviado como K8s) é uma plataforma de orquestração de contêineres de código aberto. Ele automatiza a implantação, o dimensionamento e o gerenciamento de aplicações conteinerizadas.
    • Funções: O Kubernetes garante que os contêineres estejam sempre funcionando, gerencia a alocação de recursos, lida com a distribuição de tráfego (balanceamento de carga), e pode automaticamente escalar (aumentar ou diminuir o número de instâncias de um serviço) com base na demanda. É essencial para gerenciar grandes clusters de microsserviços conteinerizados.
    • Mensageria (RabbitMQ ou Apache Kafka):
    • Comunicação Assíncrona: Sistemas de mensageria são usados para permitir que diferentes partes de uma aplicação (ou diferentes microsserviços) se comuniquem de forma assíncrona. Isso significa que um serviço pode enviar uma mensagem e continuar suas operações sem precisar esperar por uma resposta imediata do receptor.
    • RabbitMQ: É um message broker (corretor de mensagens) que implementa o protocolo AMQP (Advanced Message Queuing Protocol). É excelente para cenários onde as mensagens precisam ser entregues de forma confiável e em uma ordem específica, sendo muito usado para filas de tarefas e comunicação ponto a ponto ou "publicar/assinar".
    • Apache Kafka: É uma plataforma de streaming distribuída. É otimizada para alta throughput e baixa latência, sendo ideal para processamento de eventos em tempo real, ingestão de dados em larga escala e construção de pipelines de dados. Kafka é mais focado em durabilidade e reprocessamento de mensagens.
    • Monitoramento (Prometheus e Grafana):
    • Prometheus: É um sistema de monitoramento e alerta de código aberto. Ele coleta métricas (dados numéricos sobre o comportamento de sistemas e aplicações) de diversas fontes (servidores, aplicações, contêineres) em intervalos regulares. O Prometheus armazena essas métricas em um banco de dados de séries temporais otimizado e permite consultas flexíveis.
    • Grafana: É uma ferramenta de código aberto para visualização e análise de dados. Ele se conecta a diversas fontes de dados (incluindo o Prometheus) e permite criar dashboards interativos e personalizáveis com gráficos e tabelas para exibir as métricas coletadas.
    • Uso em Conjunto: Prometheus e Grafana são frequentemente usados em conjunto para fornecer uma visão abrangente do desempenho e da saúde de um sistema. O Prometheus coleta os dados, e o Grafana os exibe de forma clara e compreensível, facilitando a identificação de problemas e gargalos. O Prometheus também pode ser configurado para enviar alertas com base em limites predefinidos para as métricas.

     O que são Microsserviços?

    Microsserviços são uma abordagem arquitetural que divide uma aplicação em módulos independentes, cada um responsável por uma funcionalidade específica, como carrinho de compras, pagamentos, catálogo de produtos ou gestão de estoque.

    Esses serviços se comunicam entre si por APIs REST ou mensageria assíncrona (RabbitMQ, Kafka), permitindo desenvolvimento, implantação e escalabilidade independentes.

    Principais vantagens:

    • Escalabilidade individual: cada serviço pode ser dimensionado conforme a demanda.
    • Resiliência: falhas isoladas não derrubam todo o sistema.
    • Flexibilidade tecnológica: cada serviço pode usar a tecnologia mais adequada.
    • Manutenção facilitada: código mais modular e compreensível.

    Boas Práticas para o desenvolvimento de microsserviços

    • Separar banco de dados por serviço para evitar acoplamento.
    • Implementar fallback e circuit breaker (Hystrix/Resilience4j) para lidar com falhas.
    • Automatizar deploy com pipelines CI/CD.
    • Monitorar e logar cada serviço individualmente.
    • Testar contratos de API para evitar que mudanças quebrem integrações.

    Principais Desafios na Aplicação de Microsserviços

    1. Complexidade de Arquitetura

    • Em vez de um único sistema, você passa a lidar com múltiplos serviços independentes.
    • É necessário definir padrões de comunicação, autenticação e versionamento de APIs.
    • A topologia da aplicação se torna mais difícil de visualizar e manter.

    2. Comunicação entre Serviços

    • Decidir entre comunicação síncrona (REST/GRPC) e assíncrona (mensageria como Kafka ou RabbitMQ).
    • Lidar com latência de rede, timeouts e falhas parciais.
    • Implementar padrões como circuit breaker, retry e fallback para garantir resiliência.

    3. Gerenciamento de Dados

    • Cada micro serviço deve ter seu próprio banco de dados para evitar o acoplamento.
    • Surge o desafio de consistência eventual e sincronização de dados.
    • Transações distribuídas são complexas e exigem padrões como Saga ou Two-Phase Commit.

    4. Monitoramento e Observabilidade

    • É preciso rastrear requisições que atravessam vários serviços (distributed tracing).
    • Ferramentas como Prometheus, Grafana, Jaeger ou Zipkin tornam-se essenciais.
    • Logs precisam ser centralizados e correlacionados por trace ID.

    5. Implantação e Orquestração

    • Necessidade de CI/CD bem estruturado para evitar implantações manuais e demoradas.
    • Uso de Docker e Kubernetes para gerenciar múltiplos serviços em produção.
    • Controle de versões e rollback seguro em caso de falhas.

    6. Segurança

    • Autenticação e autorização distribuídas (OAuth2, JWT).
    • Proteção contra ataques como man-in-the-middle e service spoofing.
    • Gestão segura de segredos e credenciais (Vault, AWS Secrets Manager).

    7. Cultura e Organização da Equipe

    • Equipes precisam ser multidisciplinares e responsáveis por serviços de ponta a ponta.
    • Comunicação entre times deve ser clara para evitar duplicação de esforços.
    • Adoção de DevOps e SRE para alinhar desenvolvimento e operação.

     Na arquitetura monolítica, a aplicação é única, com todo o código e funcionalidades empacotados juntos. Suas tecnologias comuns incluem frameworks integrados como Java EE, .NET Framework, Spring MVC (monolítico) e Ruby on Rails. Geralmente, utiliza um único banco de dados centralizado (ex.: Oracle, MySQL, PostgreSQL) e a comunicação interna ocorre por chamadas diretas (funções/métodos). A escalabilidade aplica-se à aplicação inteira, mesmo que apenas um módulo necessite de mais recursos. A implantação é única, mais lenta e arriscada. A observabilidade se dá por logs e métricas centralizados, porém menos granulares. A falha em um módulo pode derrubar todo o sistema. Equipes trabalham no mesmo código-base, com maior risco de conflitos, e as tecnologias de suporte incluem servidores de aplicação como Tomcat, JBoss/WildFly e IIS.

    Em contraste, na arquitetura de microsserviços, a aplicação é um conjunto de serviços independentes, cada um responsável por uma função específica. As tecnologias comuns são frameworks e ferramentas leves como Spring Boot, Micronaut, Quarkus, Express.js, FastAPI e Go kit. Cada serviço pode ter seu próprio banco de dados (SQL ou NoSQL), usando tecnologias como MongoDB, Cassandra, DynamoDB e PostgreSQL. A comunicação interna é realizada via APIs REST, GRPC e mensageria (RabbitMQ, Kafka, NATS). A escalabilidade permite escalar apenas o serviço necessário, otimizando custo e desempenho. A implantação é independente por serviço, utilizando Docker, Kubernetes e Helm. A observabilidade se beneficia de ferramentas modernas como Prometheus, Grafana, ELK Stack e Jaeger para rastreamento distribuído. As falhas isoladas em um serviço não afetam os demais (se o sistema for bem projetado). Equipes independentes atuam por serviço, com autonomia tecnológica, e as tecnologias de suporte incluem orquestradores e service meshes como Kubernetes, Istio e Linkerd.

     Melhores Práticas para Mitigar Problemas em Microsserviços

    1. Complexidade de Arquitetura

    • Definir padrões desde o início: nomenclatura de serviços, contratos de API, versionamento e convenções de código.
    • API Gateway: centraliza o acesso, aplica autenticação, roteamento e rate limiting.
    • Service Discovery: uso de ferramentas como Eureka ou Consul para localizar serviços dinamicamente.

    2. Comunicação entre Serviços

    • Escolher o protocolo certo: REST/gRPC para chamadas síncronas; Kafka/RabbitMQ para comunicação assíncrona.
    • Implementar resiliência: Circuit Breaker e Retry com Resilience4j ou Hystrix.
    • Timeouts e fallback: evitar que falhas se propaguem em cascata.

    3. Gerenciamento de Dados

    • Banco de dados por serviço: evita acoplamento e facilita escalabilidade.
    • Consistência eventual: usar eventos e mensageria para sincronizar dados.
    • Padrões de transação distribuída: Saga Pattern ou Outbox Pattern para manter integridade.

    4. Monitoramento e Observabilidade

    • Logs centralizados: ELK Stack (Elasticsearch, Logstash, Kibana) ou Loki + Grafana.
    • Métricas e alertas: Prometheus + Grafana para monitorar saúde e performance.
    • Tracing distribuído: Jaeger ou Zipkin para rastrear requisições entre serviços.

    5. Implantação e Orquestração

    • Conteinerização: Docker para empacotar serviços.
    • Orquestração: Kubernetes para escalar e gerenciar serviços automaticamente.
    • CI/CD: pipelines automatizados para build, teste e deploy (GitHub Actions, GitLab CI, Jenkins).

    6. Segurança

    • Autenticação e autorização centralizadas: OAuth2, OpenID Connect, JWT.
    • Segredos e credenciais: armazenar em cofre seguro (Vault, AWS Secrets Manager).
    • Comunicação segura: TLS/HTTPS entre todos os serviços.

    7. Cultura e Organização

    • Times multifuncionais: responsáveis pelo ciclo de vida completo do serviço.
    • DevOps/SRE: integração entre desenvolvimento e operação para resposta rápida a incidentes.
    • Documentação viva: manter diagramas, contratos de API e fluxos de trabalho atualizados.

    Exemplo Prático de Micro Serviço simples feito em Java, utilizando o framework Spring Boot: Serviço de Catálogo de produtos

    @RestController

    @RequestMapping("/api/catalogo")

    public class ProdutoController {

        @GetMapping("/produtos")

        public List<Produto> listarProdutos() {

            return List.of(

                new Produto(1L, "Notebook Dell", 4500.00),

                new Produto(2L, "Smartphone Samsung", 2500.00)

            );

        }

    }

    class Produto {

        private Long id;

        private String nome;

        private Double preco;

        public Produto(Long id, String nome, Double preco) {

            this.id = id;

            this.nome = nome;

            this.preco = preco;

        }

        // getters e setters

    Compartilhe
    Recomendados para você
    Ri Happy - Front-end do Zero #2
    Avanade - Back-end com .NET e IA
    Akad - Fullstack Developer
    Comentários (0)