⭐⭐⭐⭐⭐ 187.205 🌐 Português
Criado por: Fernando Henrique Kerchner
Olá, caro aluno! Tudo bem?
Vire o seu dispositivo na vertical para
uma melhor experiência de estudo.
Bons estudos! =)
💼 Processos Seletivos (Vagas de emprego)
🏆 Prova de Títulos (Empresa)
👩🏫 Atividades Extras (Faculdade)
📝 Pontuação (Concursos Públicos)
Não há cadastros ou provas. O aluno apenas estuda o material abaixo e se certifica por isso.
Ao final da leitura, adquira os 10 certificados deste curso por apenas R$47,00.
Você recebe os certificados em PDF por e-mail em 5 minutinhos.
Bons estudos!
Formações complementares são excelentes para processos seletivos, provas de títulos na empresa, entrega de horas extracurriculares na faculdade e pontuação em concursos públicos.

Para compreendermos a razão pela qual a arquitetura de microsserviços se tornou tão proeminente no cenário tecnológico atual, é fundamental voltarmos no tempo e entendermos o paradigma que dominou o desenvolvimento de software por décadas: a arquitetura monolítica. O termo “monolito” pode soar pejorativo hoje em dia, mas sua adoção não foi um acidente ou um erro de projeto; foi, na verdade, a abordagem mais lógica, direta e eficiente para construir sistemas em seu tempo. Um monolito, em sua essência, é uma aplicação construída como uma única unidade coesa e indivisível. Todo o código-fonte, abrangendo as mais diversas funcionalidades do sistema, reside em uma única base de código. O resultado desse processo de desenvolvimento é um único artefato executável, seja um arquivo WAR ou JAR em um ecossistema Java, uma DLL em .NET ou um único executável em outras linguagens. Quando chega a hora de fazer o deploy, toda a aplicação é implantada como uma só peça.
Imagine, para ilustrar, o desenvolvimento de um sistema de comércio eletrônico, que chamaremos de “Mercado Digital”. No modelo monolítico, as funcionalidades de cadastro de clientes, catálogo de produtos, carrinho de compras, processamento de pagamentos e gestão de estoque seriam desenvolvidas dentro do mesmo projeto. Elas compartilhariam a mesma memória, os mesmos recursos de processamento e, frequentemente, o mesmo banco de dados gigantesco. No início, essa simplicidade é sedutora: é fácil de desenvolver, fácil de testar (basta levantar a aplicação na máquina local) e fácil de implantar. No entanto, conforme o “Mercado Digital” cresce, o sucesso traz consigo a complexidade. A base de código torna-se imensa, difícil de entender e de manter. Uma pequena alteração no módulo de pagamentos pode, inadvertidamente, quebrar a funcionalidade de busca de produtos devido ao acoplamento excessivo entre as partes. O tempo de inicialização da aplicação cresce, e a escalabilidade torna-se um pesadelo: se o módulo de catálogo recebe muito tráfego na Black Friday, é necessário replicar toda a aplicação, desperdiçando recursos em módulos que não estão sendo demandados, como o de cadastro de usuários.
A transição para os microsserviços surgiu como uma resposta necessária a essas limitações impostas pelo gigantismo e pela rigidez dos monolitos. A indústria de software, impulsionada por gigantes da tecnologia que precisavam de agilidade e escala sem precedentes, começou a experimentar a quebra dessas grandes estruturas em pedaços menores e autônomos. A ideia não era apenas técnica, mas organizacional: permitir que equipes pequenas pudessem trabalhar, implantar e escalar suas funcionalidades de forma independente, sem a necessidade de coordenar cada lançamento com centenas de outros desenvolvedores. Assim, a arquitetura de microsserviços não nasceu como uma moda, mas como uma solução evolutiva para lidar com a complexidade crescente dos sistemas digitais modernos, trocando a coesão rígida do monolito pela flexibilidade dinâmica dos sistemas distribuídos.
A arquitetura de microsserviços é um estilo arquitetural que estrutura uma aplicação como uma coleção de serviços pequenos e autônomos, modelados ao redor de um domínio de negócio específico. Ao contrário do monolito, onde tudo está junto, nos microsserviços cada componente tem uma responsabilidade única e clara. Retomando o nosso exemplo do “Mercado Digital”, em vez de um único blocão de código, teríamos agora um “Serviço de Catálogo”, um “Serviço de Carrinho”, um “Serviço de Pagamentos” e um “Serviço de Estoque”. Cada um desses serviços é uma aplicação completa em si mesma, com seu próprio código, suas próprias bibliotecas e, crucialmente, seu próprio banco de dados. Eles se comunicam entre si através de interfaces bem definidas e leves, geralmente utilizando protocolos de rede como HTTP/REST ou mensageria assíncrona.
A autonomia é a palavra-chave aqui. Cada microsserviço pode ser desenvolvido, implantado, operado e escalado sem afetar o funcionamento dos demais. Isso significa que a equipe responsável pelo “Serviço de Pagamentos” pode decidir atualizar sua tecnologia ou corrigir um bug e colocar a nova versão em produção numa terça-feira à tarde, sem precisar pedir permissão ou coordenar com a equipe do “Serviço de Catálogo. Se o “Serviço de Pagamentos” falhar, ele não derruba necessariamente todo o e-commerce; o catálogo continua visível, permitindo que os clientes naveguem enquanto o problema de pagamento é resolvido. Essa resiliência e isolamento de falhas são vantagens estruturais profundas desse modelo.
Outra característica definidora é a descentralização. No mundo dos microsserviços, evitamos a ideia de um “cérebro central” ou de um barramento de serviços (ESB) inteligente que contém toda a lógica de orquestração. Em vez disso, adotamos o princípio de “pontos inteligentes e canos burros” (smart endpoints and dumb pipes). A inteligência reside nos próprios serviços, que processam as informações e aplicam as regras de negócio, enquanto a infraestrutura de comunicação serve apenas para transportar mensagens de um ponto a outro da forma mais eficiente possível. Isso promove a liberdade tecnológica: como os serviços se comunicam por interfaces padrão, o “Serviço de Recomendação” pode ser escrito em Python para aproveitar bibliotecas de Inteligência Artificial, enquanto o “Serviço de Pedidos” é escrito em Java pela sua robustez, e o “Serviço de Notificações” em Node.js pela sua eficiência com I/O. Essa abordagem poliglota permite usar a ferramenta certa para cada trabalho.
O sucesso de uma arquitetura de microsserviços depende menos da tecnologia escolhida e mais da qualidade da modelagem dos limites de cada serviço. Um erro comum é dividir os serviços baseando-se em camadas técnicas (um serviço para o banco de dados, outro para a lógica, outro para a interface), o que apenas recria o monolito de forma distribuída e ineficiente. A abordagem correta é o Domain-Driven Design (DDD), ou Design Orientado ao Domínio. Devemos identificar os “Contextos Delimitados” (Bounded Contexts) do negócio. No “Mercado Digital”, o conceito de “Produto” no contexto do Catálogo é diferente do conceito de “Produto” no contexto do Estoque ou da Expedição. No Catálogo, o produto é definido por fotos, descrições e especificações técnicas. No Estoque, o que importa são as dimensões físicas, o peso, a localização no galpão e a quantidade disponível.
Tentar criar um único modelo canônico de dados que sirva a todos esses contextos é uma armadilha que leva ao acoplamento. Nos microsserviços, aceitamos a duplicação de dados em prol da independência. O “Serviço de Catálogo” tem o seu banco de dados com as descrições ricas, e o “Serviço de Estoque” tem o seu banco de dados com os saldos físicos. Quando um novo produto é cadastrado, essa informação pode ser replicada ou referenciada entre os serviços, mas cada um mantém a soberania sobre os dados que são vitais para sua operação. Isso reflete a Lei de Conway, que postula que as organizações tendem a projetar sistemas que copiam suas estruturas de comunicação. Se organizarmos times multidisciplinares em torno de capacidades de negócio (um time de Estoque, um time de Pagamentos), a arquitetura do software naturalmente seguirá essa divisão, resultando em serviços mais coesos e alinhados com o valor que entregam.
Essa organização em torno de capacidades de negócio também muda a mentalidade de “projeto” para “produto”. Em vez de um time ser montado para entregar um projeto de software e depois ser dissolvido (deixando o software para uma equipe de sustentação), no modelo de microsserviços o time é dono do serviço durante todo o seu ciclo de vida. O lema é “você constrói, você opera” (you build it, you run it). Isso incentiva a qualidade, pois os desenvolvedores sabem que, se o serviço quebrar de madrugada, são eles que serão acionados para consertar. O foco passa a ser a evolução contínua do produto para atender melhor o cliente, e não apenas a entrega de funcionalidades dentro de um prazo.
Uma vez que dividimos nossa aplicação em múltiplos serviços, o maior desafio passa a ser como eles conversam entre si para realizar uma operação de negócio. Existem fundamentalmente dois modelos: a comunicação síncrona e a assíncrona. A comunicação síncrona, tipicamente implementada via HTTP/REST ou gRPC, segue o modelo de requisição-resposta. O cliente faz uma pergunta e espera pela resposta. Por exemplo, quando o usuário do “Mercado Digital” acessa a página de um produto, o frontend chama o “Serviço de Catálogo” para obter os detalhes. Essa chamada é direta e bloqueante; o frontend precisa da resposta para renderizar a tela. A vantagem é a simplicidade e a imediatismo. No entanto, o excesso de chamadas síncronas cria um acoplamento temporal: se o “Serviço de Catálogo” estiver lento ou fora do ar, a página não carrega, degradando a experiência do usuário. Além disso, cadeias longas de chamadas (Serviço A chama B, que chama C) aumentam a latência e o risco de falha em cascata.
A comunicação assíncrona, baseada em troca de mensagens ou eventos, oferece uma alternativa poderosa para desacoplar os serviços. Nesse modelo, o remetente envia uma mensagem sem esperar uma resposta imediata, e o destinatário a processa quando puder. Imagine que, ao finalizar uma compra, o “Serviço de Pedidos” não chame diretamente o “Serviço de Estoque” para baixar o item. Em vez disso, ele publica um evento chamado “Pedido Criado” em um broker de mensagens (como RabbitMQ ou Kafka). O “Serviço de Estoque”, que assina esse evento, recebe a notificação e atualiza o saldo. Simultaneamente, o “Serviço de Email” também escuta esse evento e envia a confirmação para o cliente. Se o sistema de e-mail estiver fora do ar, isso não impede a venda; a mensagem fica na fila e será processada assim que o serviço voltar.
Essa abordagem orientada a eventos (Event-Driven Architecture) aumenta a resiliência e a escalabilidade, pois os serviços não precisam estar online ao mesmo tempo para que o processo de negócio flua. Porém, ela introduz uma complexidade adicional: a consistência eventual. No exemplo acima, pode haver um breve momento em que o pedido foi criado, mas o estoque ainda não foi atualizado. O sistema deve ser projetado para lidar com essa latência e garantir que, eventualmente, todos os dados estejam consistentes. A escolha entre síncrono e assíncrono não é binária; a maioria das arquiteturas de microsserviços utiliza uma combinação de ambos, usando chamadas síncronas para leituras de dados que o usuário precisa ver agora, e mensagens assíncronas para processos de escrita e atualizações de estado que podem ocorrer em segundo plano.
O gerenciamento de dados é, sem dúvida, o aspecto mais complexo da migração para microsserviços. No monolito, a consistência dos dados era garantida pelas transações ACID do banco de dados relacional. Se uma compra envolvesse debitar o saldo do cliente e criar um pedido, o banco de dados garantia que ou as duas coisas aconteciam, ou nenhuma acontecia (rollback). Nos microsserviços, com o padrão de “Banco de Dados por Serviço”, essa garantia desaparece. O “Serviço de Clientes” e o “Serviço de Pedidos” vivem em mundos separados. Não podemos fazer um join entre tabelas de serviços diferentes, nem abrir uma transação que abranja múltiplos bancos de dados de forma performática.
Para lidar com transações distribuídas, utilizamos o padrão Saga. Uma Saga é uma sequência de transações locais. Cada serviço executa sua parte da transação e publica um evento ou mensagem que aciona a próxima etapa da Saga em outro serviço. Se uma etapa falhar (por exemplo, o cartão de crédito for recusado no “Serviço de Pagamentos”), a Saga deve executar transações de compensação para desfazer as alterações feitas pelas etapas anteriores (como cancelar o pedido criado no “Serviço de Pedidos”). Existem duas formas de coordenar uma Saga: Coreografia e Orquestração.
Na Coreografia, não há um coordenador central. Os serviços reagem a eventos uns dos outros. O “Serviço de Pedidos” emite “Pedido Criado”. O “Serviço de Pagamentos” ouve, tenta cobrar e emite “Pagamento Efetuado” ou “Pagamento Recusado”. Se for recusado, o “Serviço de Pedidos” ouve e cancela o pedido. É simples para fluxos curtos, mas pode ficar confuso se muitos serviços estiverem envolvidos. Já na Orquestração, criamos um serviço específico (o Orquestrador da Saga) que diz a cada participante o que fazer. O Orquestrador chama o Pedido, depois chama o Pagamento, depois o Estoque. Se o Pagamento falhar, o Orquestrador comanda explicitamente o cancelamento do Pedido. Isso centraliza a lógica do fluxo, facilitando o monitoramento e a gestão de processos complexos de negócio.
A questão das consultas (queries) também muda. Como não podemos fazer joins entre bancos, como montamos uma tela que mostra os dados do pedido junto com os dados do cliente e do produto? Uma abordagem é a Composição de API, onde um serviço agregador (ou o próprio frontend) chama os três serviços e monta o resultado. Outra abordagem, mais sofisticada, é o CQRS (Command Query Responsibility Segregation), onde mantemos um banco de dados de leitura separado, otimizado para consultas, que é atualizado assincronamente através de eventos vindos dos serviços de escrita. No “Mercado Digital”, poderíamos ter uma base de dados de “Histórico de Pedidos” que já contém os dados denormalizados do cliente e dos produtos, permitindo consultas ultra-rápidas sem onerar os microsserviços operacionais.
Expor dezenas ou centenas de microsserviços diretamente para o mundo exterior é uma receita para problemas de segurança e complexidade no cliente. Para resolver isso, introduzimos o padrão API Gateway. O API Gateway atua como um porteiro único para a aplicação. Todos os clientes (web, mobile, parceiros) enviam suas requisições para o Gateway, que então as roteia para o microsserviço apropriado. Além de rotear, o Gateway pode realizar funções transversais essenciais, como autenticação e autorização (garantindo que o usuário tem permissão para acessar aquele recurso), limitação de taxa (rate limiting) para proteger os serviços de sobrecarga, e tradução de protocolos (recebendo HTTP e falando gRPC internamente).
No “Mercado Digital”, o aplicativo móvel não precisa saber o endereço IP do “Serviço de Catálogo” ou do “Serviço de Carrinho”. Ele chama api.mercadodigital.com/produtos e o Gateway sabe para onde enviar. Isso desacopla o cliente da arquitetura interna; podemos dividir ou fundir serviços nos bastidores sem quebrar o aplicativo. Uma evolução desse padrão é o BFF (Backend for Frontend), onde criamos Gateways específicos para cada tipo de cliente. O App Mobile pode ter um BFF que entrega dados mais enxutos para economizar bateria e dados, enquanto a Web Desktop tem um BFF que entrega dados mais ricos para aproveitar a tela grande.
Dentro do cluster de microsserviços, as instâncias dos serviços são efêmeras; elas nascem e morrem dinamicamente, mudando de endereço IP a todo momento. Para que o Gateway (ou outros serviços) saibam para onde mandar as requisições, utilizamos o padrão Service Discovery. Existe um componente, o registro de serviços, que funciona como uma lista telefônica dinâmica. Quando uma nova instância do “Serviço de Estoque” sobe, ela se registra: “Estou aqui no IP 10.0.0.5”. Quando o Gateway precisa chamar o Estoque, ele consulta o registro para obter os endereços disponíveis. Isso pode ser feito via Client-Side Discovery (o cliente consulta o registro e escolhe o IP) ou Server-Side Discovery (o cliente chama um balanceador de carga que consulta o registro). Ferramentas modernas de orquestração, como o Kubernetes, já trazem funcionalidades de Service Discovery embutidas, simplificando imensamente essa gestão.
Em um sistema distribuído, a falha não é uma possibilidade; é uma certeza. Redes oscilam, bancos de dados travam, serviços ficam sobrecarregados. A arquitetura de microsserviços deve ser projetada para a falha (Design for Failure). Um padrão crucial para evitar que uma falha local se torne uma catástrofe sistêmica é o Circuit Breaker (Disjuntor). Imagine que o “Serviço de Recomendações” do nosso e-commerce esteja lento ou fora do ar. Se a página principal continuar tentando chamá-lo a cada requisição de usuário, esses processos ficarão travados esperando a resposta (timeout), consumindo recursos até que todo o servidor web trave.
O Circuit Breaker funciona como um disjuntor elétrico. Ele monitora as chamadas para um serviço remoto. Se a taxa de falhas ou de lentidão ultrapassar um certo limite, o disjuntor “abre”, e as chamadas subsequentes são interrompidas imediatamente, sem nem tentar contatar o serviço problemático. Em vez de um erro, o Circuit Breaker pode retornar uma resposta de fallback (plano B). No caso das recomendações, se o serviço falhar, o fallback pode ser retornar uma lista estática de “Produtos Mais Vendidos” ou simplesmente não mostrar a seção de recomendações. A página carrega, o usuário consegue comprar, e o sistema sobrevive. O disjuntor fica periodicamente testando se o serviço voltou (estado “meio-aberto”) e, se tiver sucesso, fecha novamente, restaurando o fluxo normal. Essa capacidade de degradar a funcionalidade graciosamente é o que diferencia sistemas robustos de sistemas frágeis.
Para empresas que já possuem um sistema legado monolítico, a ideia de reescrever tudo do zero em microsserviços (o famoso Big Bang) é extremamente arriscada e raramente recomendada. A estratégia mais segura e eficaz é o padrão Strangler Fig (Figueira Estranguladora). Na natureza, essa planta cresce ao redor de uma árvore hospedeira, envolvendo-a lentamente até que a árvore original morra e fique apenas a figueira. No software, aplicamos esse conceito criando novos microsserviços ao redor do monolito existente.
Começamos identificando uma funcionalidade específica e isolada do monolito, por exemplo, a gestão de avaliações de produtos no “Mercado Digital”. Em vez de continuar mantendo esse código no legado, desenvolvemos um novo “Serviço de Avaliações” em arquitetura de microsserviços. Utilizamos o API Gateway para interceptar as chamadas que iriam para o monolito e redirecioná-las para o novo serviço. Aos poucos, funcionalidade por funcionalidade, vamos “estrangulando” o monolito. As novas features são feitas já no novo modelo, e as antigas são migradas gradualmente. Isso permite que a equipe aprenda e amadureça nas tecnologias de microsserviços com baixo risco, entregando valor continuamente, até que o monolito se torne pequeno o suficiente para ser desligado ou mantido como apenas mais um serviço residual.
A jornada para microsserviços é complexa e exige maturidade em automação (CI/CD), monitoramento (observabilidade com logs distribuídos e métricas) e cultura organizacional. No entanto, ao dominar esses padrões e conceitos, as organizações ganham uma capacidade sem precedentes de inovar, escalar e adaptar seus sistemas às demandas de um mercado digital em constante transformação.
Esperamos que tenha gostado deste curso online complementar.
Agora você pode solicitar o certificado de conclusão em seu nome.
Os certificados complementares são ideais para processos seletivos, promoção interna, entrega de horas extracurriculares obrigatórias da faculdade e para pontuação em concursos públicos.
Eles são reconhecidos e válidos em todo o país. Após emissão do certificado, basta baixá-lo e imprimi-lo ou encaminhar diretamente para a Instituição interessada (empresa, faculdade ou órgão público).
Desejamos a você todo o sucesso do mundo. Até o próximo curso!