10 Princípios Essenciais de Design e Desenvolvimento de Microsserviços

Nader Fares
9 min readMar 10, 2023

--

Projetando Microsserviços para a sua organização? Siga esses princípios de design para criar Microsserviços robustos e escaláveis.

Olá pessoal, se você é um desenvolvedor Java sênior ou um programador júnior trabalhando em Microsserviços e não tem muita ideia de como criar Microsserviços em nível de produção, este artigo é para você. Tenho desenvolvido Microsserviços nos últimos anos e tem sido uma jornada difícil, pois tive que aprender a maioria das coisas da maneira difícil.

Cometi um grande erro quando não investi em meu aprendizado ao ingressar em nenhum curso de treinamento sobre Microsserviços antes de começar o desenvolvimento, e por causa disso meu aprendizado foi lento e tive que fazer muitas pesquisas no Google até mesmo para coisas simples.

É por isso que faz mais sentido fazer alguns cursos, ler livros e artigos antes de começar a trabalhar em uma nova tecnologia ou arquitetura. Mesmo que você não aprenda tudo, terá ideias sobre muitas coisas que economizarão muito seu tempo.

Neste artigo, vou compartilhar princípios de design essenciais que você pode seguir ao projetar e desenvolver seus Microsserviços. Esses princípios de design estão intimamente relacionados ao re-desenvolvimento de software e ajudarão você a projetar Microsserviços robustos, escaláveis e sustentáveis.

A propósito, esses princípios de design diferem dos padrões de design de Microsserviços como CQRS, SAGA ou Banco de Dados por Microsserviço, neste artigo vamos nos concentrar em princípios que se aplicam a todos os Microsserviços.

Aqui está uma lista de 10 princípios de design de Microsserviços que você pode ter em mente e seguir enquanto faz o desenvolvimento de Microsserviços. Eles ajudarão muito a longo prazo, mesmo após o desenvolvimento e a implantação.

  1. Princípio da Responsabilidade Única

Isso não é novo para nenhum desenvolvedor de software, todos estamos familiarizados com isso como parte do aprendizado do princípio de design SOLID, mas isso também se aplica a Microsserviços.

Conforme o SRP ou Princípio da Responsabilidade Única, cada Microsserviço deve ter uma única responsabilidade bem definida e deve se comunicar apenas com outros microsserviços para realizar tarefas.

Por exemplo, um microsserviço pode lidar com a autenticação do usuário, enquanto outro, lida com o processamento de pagamentos. Mas você não deve criar um Microsserviço que faça tanto a autenticação do usuário quanto o manuseio de pagamento, isso seria uma violação do SRP.

Você pode ver isso no seguinte diagrama, temos diferentes serviços para lidar com funcionalidades diferentes, como Serviço de Conta, Serviços de Inventário e Serviços de Envio.

2. Princípio de Gerenciamento de Dados Descentralizado

Conforme o princípio de Gerenciamento de Dados Descentralizado, cada Microsserviço deve gerenciar seus próprios dados, sem depender de outros Microsserviços, para garantir escalabilidade e confiabilidade. Por exemplo, cada Microsserviço pode ter seu próprio banco de dados que usa para armazenar dados.

Compartilhar bancos de dados com outros Microsserviços viola esse princípio e deve ser evitado, pois tornará difícil a solução de problemas e pode resultar em inconsistência de dados.

Esse princípio de design ajudará você a gerenciar melhor seu banco de dados e é a base do padrão de design de Banco de Dados por Microsserviço, um princípio essencial de design de Microsserviços.

Se você está pensando em como outro Microsserviço poderia ter acesso aos mesmos dados, já que é muito possível que outro serviço precise deles? Bem, você sempre deve criar APIs para isso, como observaremos no próximo princípio de design de Microsserviços.

Você pode ver isso na seguinte arquitetura de Microsserviços, temos bancos de dados diferentes para UserService, MessageService e FriendService.

3. Princípio de Design Orientado a API

Este é um dos meus princípios favoritos de design de Microsserviços e ajuda muito durante o processo de design de Microsserviços. De acordo com esse princípio, os Microsserviços devem ser projetados em torno de APIs, com cada serviço expondo um conjunto bem definido de APIs para comunicação com outros serviços.

Por exemplo, um Microsserviço pode expor uma API para recuperar informações do cliente, que outros Microsserviços poderiam usar para acessar essas informações.

Esse princípio também se alinha com o princípio de design anterior que defende que os Microsserviços não devem compartilhar bancos de dados. Você deve criar APIs para outros serviços que precisam de acesso aos dados e isso irá direcionar o design de seu próprio Microsserviço.

4. Princípio de Ausência de Estado (Statelessness)

De acordo com este princípio, os Microsserviços devem ser sem estado, o que significa que não devem manter nenhum estado específico do cliente entre solicitações.

Por exemplo, se um Microsserviço manipula o carrinho de compras de um usuário, ele não deve armazenar nenhuma informação sobre o carrinho do usuário entre as solicitações, mas deve recuperar as informações do carrinho de um banco de dados cada vez que processar uma solicitação.

Se eu pudesse dar apenas um conselho da minha experiência de anos em projetar serviços Java, eu diria para mantê-los sem estado o máximo possível. Ao não gerenciar o estado em seu serviço, você evitará muitos problemas que surgem devido a isso e poderá se beneficiar muito de coisas como o Cache para melhoria de desempenho.

5. Princípio de Desacoplamento (Loose Coupling)

Este é outro princípio de design de software que também se aplica a Microsserviços. No design orientado a objetos, temos como objetivo desacoplar nossas classes, pacotes e módulos e podemos aplicar a mesma regra aos Microsserviços.

De acordo com esse princípio, os Microsserviços devem ser fracamente acoplados, o que significa que não devem ter uma dependência rígida entre si, para garantir escalabilidade e facilidade de implantação.

Por exemplo, se um Microsserviço estiver inoperante, os outros ainda devem ser capazes de funcionar normalmente. Aqui está um diagrama que ilustra Microsserviços fortemente acoplados e fracamente acoplados:

6. Princípio de Smart Endpoints e Dumb Pipes

De acordo com este princípio, a lógica de processamento de dados deve estar localizada nos próprios Microsserviços, em vez de em um hub centralizado, para garantir escalabilidade e confiabilidade. Se você está se perguntando o que são endpoints e pipes aqui, endpoints são APIs ou URLs, enquanto pipes são filas e bancos de dados.

O padrão sugere que os endpoints, como interfaces de usuário ou APIs, devem ser projetados para serem inteligentes, lidando com toda a apresentação e lógica de negócios, enquanto os pipes, como filas ou bancos de dados, devem ser projetados para serem burros, executando apenas funções simples de transferência e armazenamento de dados.

Por exemplo, um Microsserviço pode ser responsável pelo processamento de pedidos de clientes, em vez de ter um hub centralizado lidando com todo o processamento de pedidos.

O principal benefício de usar esse padrão é que ele permite que as equipes de desenvolvimento criem aplicativos com componentes fracamente acoplados que podem ser desenvolvidos e implantados independentemente, permitindo melhor escalabilidade e manutenção mais fácil.

Este padrão também ajuda a simplificar o processo de desenvolvimento, pois os desenvolvedores podem se concentrar na implementação de recursos específicos em seus endpoints inteligentes, em vez de se preocupar com os sistemas de comunicação e armazenamento de dados subjacentes.

No entanto, uma desvantagem desse padrão é que ele pode tornar a depuração mais difícil, pois os erros podem ocorrer em vários componentes. Além disso, os endpoints inteligentes podem exigir mais recursos e poder de processamento, o que pode aumentar o custo de execução do aplicativo.

Aqui está um diagrama legal que ilustra esse princípio:

7. Princípio de Auto-Escalabilidade (Auto-Scaling)

Quando pensamos em Microsserviços, pensamos em Escalabilidade, e este é o princípio que cuida disso. De acordo com esta melhor prática e princípio, cada Microsserviço deve ser projetado para escalonar automaticamente para cima ou para baixo em resposta a mudanças na demanda, para garantir que o aplicativo permaneça responsivo e disponível.

Por exemplo, se o número de usuários que acessam um Microsserviço aumentar, esse Microsserviço poderia criar automaticamente instâncias adicionais para lidar com o aumento da demanda.

Na vida real, ferramentas como o Kubernetes podem escalonar automaticamente criando novas instâncias de seus Microsserviços e destruindo-as quando não forem mais necessárias.

Se seus Microsserviços não são projetados para escalonamento automático, eles não aproveitarão ao máximo a nuvem e ferramentas como o Kubernetes, então você deve garantir que eles sejam projetados para escalabilidade. Se você está se perguntando como conseguir isso, fique ligado, compartilharei mais dicas sobre como garantir a escalabilidade de seus Microsserviços no próximo artigo.

8. Princípio de Monitoramento e Registro (Monitoring and Logging)

Um dos principais problemas ao trabalhar em um projeto que tem centenas de Microsserviços é que a depuração é realmente difícil. É difícil encontrar a causa de uma falha na solicitação porque os logs estão dispersos.

Você pode ver erros de autenticação de usuário pensando haver algo errado com as credenciais do usuário, mas, na verdade, pode ser um tempo limite em um serviço que executa essa tarefa e somente olhando os logs de vários serviços você chegará à verdadeira razão.

De acordo com este princípio, os Microsserviços devem ter mecanismos robustos de monitoramento e registro para ajudar a diagnosticar problemas e acompanhar o desempenho.

Por exemplo, cada Microsserviço pode registrar informações sobre seu desempenho e uso, que podem ser usadas para identificar e diagnosticar problemas. Isso com certeza ajudará você a longo prazo e no trabalho de suporte diário.

9. Princípio de Implantação e Integração Contínuas (Continuous Deployment and Integration)

De acordo com este princípio, qualquer Microsserviço deve ser implantável continuamente, o que significa que eles devem ser atualizados com frequência com pequenas mudanças incrementais, como correções de bugs, pequenos aprimoramentos, etc.

Por exemplo, um Microsserviço pode ser atualizado para corrigir um bug ou adicionar um novo recurso, sem afetar o restante do aplicativo.

A implantação contínua é alcançada por meio de uma combinação de técnicas, como automação de processos de compilação e implantação, teste e integração com outras ferramentas, como sistemas de controle de versão, sistemas de rastreamento de problemas e ferramentas de monitoramento.

Ao automatizar o processo de implantação, as equipes podem garantir que as novas mudanças sejam implantadas rapidamente e de forma consistente, com intervenção humana mínima.

Essa prática também ajuda a reduzir o tempo de inatividade e minimizar o risco de erros, pois as novas mudanças são rigorosamente testadas antes de serem implantadas em produção. Além disso, permite que as organizações lancem novos recursos e correções de bugs com mais frequência, o que pode resultar em aumento da inovação e tempo mais rápido para chegar ao mercado.

10. Princípio de Automação de Infraestrutura (Infrastructure Automation)

Este é algo para DevOps, mas como desenvolvedores, também devemos estar familiarizados com isso. De acordo com este princípio, a implantação e gerenciamento de Microsserviço devem ser automatizados, para garantir consistência e eficiência.

Por exemplo, você pode usar ferramentas como Docker ou Kubernetes para automatizar a implantação e dimensionamento de Microsserviços. Isso é realmente uma prática padrão agora em várias empresas e garante que o processo de implantação seja consistente e eficiente.

Você pode criar pipelines do Jenkins para implantação automática e também pode usar ferramentas como o Terraform para criar ambientes automaticamente. Aqui está um exemplo de pipelines para implantação automática de Microsserviços.

Isso é tudo sobre os princípios essenciais de design de Microsserviços que todo desenvolvedor Java deve conhecer. Seguindo esses princípios de design, você pode construir aplicativos de Microsserviços escaláveis e confiáveis que possam atender às demandas de seus clientes.

Eles não apenas ajudarão você a criar Microsserviços robustos e escaláveis, mas também economizarão tempo durante a depuração, monitoramento, solução de problemas e manutenção de Microsserviços.

--

--

Nader Fares

Nader is a seasoned technologist and CTO with expertise in Agile methodologies, SDLC, cloud services, and innovation-driven growth.