Introdução a Microsserviços

Olá! Neste artigo vou fazer uma introdução a microsserviços, apresentando sua definição, benefícios, desafios, e livros que eu indico para ler a respeito deles! Este artigo é agnóstico a tecnologias, com as informações aqui apresentadas sendo aplicadas em qualquer arquitetura de microsserviços.

No meu canal do YouTube também tenho adicionado conteúdo relacionado a microsserviços. Segue lá caso ainda não o tenha feito!

Vamos lá?


O que são Microsserviços?

Começo pelo questionamento que está entre os mais polêmicos a respeito de microsserviços. O que é um microsserviço? Como saber se meu projeto pode ser considerado uma arquitetura de microsserviços? Se eu organizar as pastinhas do projeto de minha API em formato X, posso chamar ele de microsserviço?

Quem consome meu conteúdo de lives e outros formatos sabe que eu tendo a ser o menos “autoritário” possível quanto a definições e estruturas. A respeito de microsserviços vou adotar a mesma postura.

Microsserviços são serviços pequenos e autônomos, que trabalham juntos. Os princípios de Coesão e SRP (princípio SOLID de responsabilidade única) andam juntos com microsserviços, especificando que eles devem conter em si códigos que são alterados pela mesma razão, e que devem ser separados se conter códigos que são alterados por razões diferentes.

Eles são também divididos por limites do negócios (ou contextos delimitados, utilizando o termo do DDD).

É isso. Mas e aí? Essas afirmações podem (e devem!) gerar alguns questionamentos. Abaixo eu os apresento, e já respondo a seguir.

Quão pequenos? Existe alguma métrica específica que me diz que se passar dela, eu deixo de ter um microsserviço?

Jon Eaves, do RealEstate.com.au, tem uma fala sua referenciada no livro Building Microservices: Designing Fine-Grained Systems, de Sam Newman : “…algo que possa ser reescrito em duas semanas”.

Meio ambíguo? Pode ser, mas de fato a definição de tamanho em microsserviços é realmente ambigua, não está escrita “em pedra”. Não tem uma restrição quanto a quantidade de pontos de acesso de APIs, consumidores de mensagens, ou quantidade de linhas de código.

Quão autônomos? Em que sentido são autônomos?

Autônomos se refere a poder ser alterado e publicado como um serviço isolado, com comunicação através da rede com outros serviços. Sendo assim, a não ser por alterações mais impactantes de regras de negócio ou fluxo de processo, um microsserviço deveria ser possível de ser publicado e não quebrar todo o sistema.

Microsserviços tem uma relação próxima com o Domain-Driven Design (ou DDD), por ajudar aos desenvolvedores desenharem serviços que foquem em um contexto do domínio, facilitando a definições de limites entre eles.


Benefícios

A adoção correta de arquitetura de microsserviços traz consigo diversos beneficios, que apresento a seguir:

  • Tecnologicamente heterogêneo: por conta dos microsserviços se comunicarem através da rede usando protocolos maduros e compatíveis com uma grande quantidade de frameworks e tecnologias, é possível criar um ambiente heterogeneo tecnologicamente. Por exemplo, alguns microsserviços poderiam ser implementados com Spring Boot, outros com ASP.NET Core, e por aí vai. Isso se aplica também a bancos de dados! É crítico entender que isso acompanha riscos, afinal, contratar mão-de-obra mais escassa sai mais caro, dependendo da tecnologia escolhida, bem como a curva de aprendizagem que a equipe terá de passar para ser produtiva e confiante para desenvolver a solução.
  • Resiliência: algo vai falhar, isso é fato. A comunicação na rede poderá falhar, assim como instancias da aplicação, banco de dados, e o próprio servidor. Existem algumas ações que podem melhorar a resiliencia da arquitetura de microsserviços, como ter cuidado com conexões síncronas via HTTP, já que uma conexão da cadeia lenta poderá atrasar todo o processo, asism como a falta de definição de timeouts! Quando possível, utilizar Retry e Circuit Breaker patterns. Falarei deles em um artigo futuro!
  • Escalabilidade: esse aspecto leva em conta o trabalho e velocidade de escalar um sistema inteiro x um serviço apenas, tanto de maneira manual quanto de auto-scaling, que se beneficia muito de uma inicialização rápida de serviços menores e com contêineres.
  • Facilidade de publicação: ter serviços menores e autônomos evita de realizar o build e publicação de um grande sistema, que é o que ocorre com o monolito, a cada alteração realizada, resultando em publicações e rollbacks mais rápidos e com menor risco de impactar outras áreas do sistema.

Desafios

A adoção da arquitetura de microsserviços também traz uma série de desafios. a lista de desafios abaixo foi definida baseado nos projetos de microsserviços que já participei, onde pude ver de dentro algumas dificuldades, que tem origem em diferentes aspectos (técnicos, infra-estrutura, equipes, processos, entre outros).

  • Consistência dos dados: por conta de diferentes microsserviços serem responsáveis por diferentes contextos do domínio, a atualização de dados de mesma entidade, mas diferentes modelos, deve ser orquestrada entre diferentes componentes da arquitetura. Por exemplo, se ocorrer a atualização de preço de um produto via microsserviço dessa entidade, os dados de produto que estiverem no microsserviço de carrinho de compra devem ser atualizados. Mesma coisa ocorre com dados de perfil de usuário que forem atualizados via microsserviço dele, e que precisam ser atualizados em outros serviços. Em caso de atraso na atualização desses dados, usuários poderão ver inconsistências de dados entre partes do sistema. O mesmo pode ocorrer dependendo do modelo de replicação e acesso de dados entre instâncias do mesmo serviço.
  • Comunicação entre sistemas, e também entre equipes: é essencial orquestrar bem alterações de modelos entre os serviços, para que não ocorra uma inconsistência de regras de negócio do processo. Isso é um desafio, e é amplificado quando a comunicação entre as equipes é demasiadamente burocrática (ou de menos!). Publicações de funcionalidades que envolvem mais de um serviço devem ser combinadas de maneira clara, assim como seu desenvolvimento, que deve envolver alinhamento entre as múltiplas equipes, para que a funcionalidade seja entregue em harmonia.
  • Monitoramento: Por existirem múltiplos serviços em sua arquitetura, a detecção e diagnósticos de erros se tornam mais complexos e demorados. Para auxiliar nisso, se recomenda implementar Health Checks (para detectar quando um serviço não estiver “saudável”), tracing (rastreamento) de fluxos de início ao fim de operaçoes para isolar problemas, e logging para permitir análises antes, durante, e depois de problemas. Com isso, pode-se tomar decisões baseados nas informações contidas no logging, como por exemplo se atentar a serviços que venham lançando erros desconhecidos, bem como seus pontos problemáticos.
  • Maior sobrecarga na infra-estrutura no geral: preparar e implementar esteiras de CI/CD, bem como estudar e adotar ferramentas de monitoramento, logging, API Gateway, gerenciamento de segredos, entre outras, não vem de graça. Quem dera fosse tão fácil quanto apertar enter e não precisar se preocupar com infra-estrutura! Muitos dos componentes que auxiliam a arquitetura de microsserviços a ser mais completa exigem uma curva de aprendizagem considerável para sua adoção, bem como custos maiores de infra-estrutura. Cada microsserviço idealmente teria uma instância de banco de dados para ele, resultando em mais componentes para se preocupar.
  • Testes e debugging: devido a maior complexidade de fluxos, que podem (e provavelmente vão) envolver múltiplos serviços e bancos de dados.

Livros

Assim como falei nesse artigo, livros seguem como uma ótima fonte de informações! Tenho um Kindle a 5 anos e somos inseparáveis!

Faço a indicação de dois livros que eu li sobre microsserviços, e que me ajudaram muito no meu trabalho em projetos com essas arquiteturas, e me permitiram contribuir de maneira mais ativa com a equipe e lideranças para promover melhorias.

Building Microservices: Designing Fine-Grained Systems

Livro mais completo que já li sobre o tema.

Passa por inúmeros conceitos sobre arquitetura de microsserviços, e explica MUITO bem. Algo que eu gosto muito a respeito da escrita do autor é que ele não é sensacionalista a respeito dessa arquitetura. Ele explica os conceitos bem detalhadamente, e deixa claro os desafios que podem ser encontrados na adoção dessa arquitetura. Super recomendo!

Alguns conteúdos (dentro muitos) abordados.

  • O que são microsserviços, benefícios, desafios;
  • Técnicas de decomposição;
  • Como modelar domínios usando DDD;
  • REST;
  • Comunicação baseada em eventos;
  • Versionamento;
  • Testes;

Voce pode encontrá-lo aqui, tanto em formato Kindle quanto em formato físico.

Monolith to Microservices: Evolutionary Patterns to Transform Your Monolith

Um desafio que muitas equipes e projetos encontram em sua jornada rumo aos microsserviços é a migração de sistemas legados. Com a adoção de padrões detalhados, e com um passo-a-passo, este livro

Alguns conteúdos (dentre muitos) abordados nele:

  • O que são microsserviços, benefícios, desafios;
  • Planejamento de migração;
  • Domain-Driven Design;
  • Divisão de um monolito;
  • Padrões detalhados para a migração para um microsserviço;
  • Desafios e como superá-los.
  • Voce pode encontrá-lo aqui, tanto em formato Kindle quanto em formato físico.

Voce pode encontrá-lo aqui, tanto em formato Kindle quanto em formato físico.


Inscreva-se na lista de espera do Método .NET Direto ao Ponto, um treinamento completo sobre C#, APIs com ASP.NET Core e Microsserviços:  Inscreva-se aqui.

São quase 200 vídeo-aulas sobre temas como C#, ASP NET Core 5, EF Core, CQRS, Clean Architecture, Autenticação e autorização com JWT, Testes Unitários, além de mini-cursos em Microsserviços, Performance em .NET, ASP NET Core e Azure, Docker, Carreira Internacional em .NET, e mais.


Conclusão

Neste artigo foram apresentados as definições, benefícios, e desafios relacionados à adoção de microsserviços. Em conteúdos posteriores eu abordarei diferentes categorias, ferramentas, e tecnologias utilizadas para auxiliar no desenho, implementação, e publicação de sistemas que adotam essa arquitetura.

Te convido a compartilhar este artigo com sua equipe ou amigos, para que possam também aprender sobre esse tema tão relevante hoje em dia.