Skip to main content

Microsserviço 7

· 4 min read
Leandro Andrade
Leandro Andrade
Software Developer

Iniciando o uso de microsserviços, precisamos rever o processo de desenvolvimento para acomodar esse novo estilo de arquitetura.

Dentro desta revisão, um ponto de grande importância é a integração contínua (CI) e a entrega contínua (CD).

Quando falamos em CI, o principal objetivo é manter todos em sincronia, ou seja, garantir que alterações no código sejam integradas ao código principal o mais cedo possível. Queremos criar artefatos que serão validados e reutilizados em todas as implantações dessa versão do código.

Exemplos de boas práticas de CI incluem:

  • Integração com a branch principal com a maior frequência possível;
  • Execução de testes, pois, sem eles, saberemos apenas que a integração foi bem-sucedida sintaticamente, mas não se afetou o comportamento do sistema; e
  • Correção de problemas na build: todos os check-ins que não estejam diretamente envolvidos na correção de uma build com erro devem ser interrompidos até que o problema seja resolvido.

Já o objetivo do CD é manter um pipeline que gere um artefato, o qual passará por várias etapas até ser entregue ao ambiente de produção.

Modelos de Branches

Trabalhar com branches permite que o desenvolvimento seja feito de forma isolada, sem interferir no trabalho de outras pessoas. No entanto, todos os membros do time que estão trabalhando em uma branch devem integrá-la à branch principal com frequência. Branches de longa duração devem ser evitadas.

Pipeline

Em uma pipeline de CD, várias etapas compõem o processo de build, e uma dessas etapas gera um artefato. Outras etapas podem incluir a execução de testes, verificação de vulnerabilidades, aprovação em UAT e, finalmente, implantação em produção. Esse processo deve ser percorrido pelo mesmo artefato gerado inicialmente.

Além da CD, temos a implantação contínua. A diferença é que, na CD, cada nova mudança é candidata a uma nova versão para ser lançada, mas o lançamento depende de uma análise de qualidade para decidir se a versão está pronta para ser implantada. Na implantação contínua, todas as mudanças aprovadas por validações automatizadas são automaticamente implantadas sem intervenção humana.

Artefato

O artefato criado no processo de build será utilizado em todas as etapas da pipeline de CD. Configurações que variam de acordo com o ambiente devem ser mantidas fora do artefato em si.

Código-Fonte

Para gestão do código-fonte no repositório, temos três abordagens:

  • Repositório único;
  • Repositório por microsserviço; e
  • Monorepo.

No caso de um repositório único, há um único repositório que armazena todo o código e gera uma única build. Com essa abordagem, os lançamentos precisam ser sincronizados e vários serviços são implantados ao mesmo tempo. Uma alteração mínima em um serviço faz com que todos os serviços sejam reconstruídos e implantados, o que é ineficiente e geralmente indesejável.

Na abordagem de repositório por microsserviço, cada projeto tem seu repositório de código-fonte, e qualquer mudança no código envolve a construção apenas do projeto correspondente. Contudo, ao trabalhar com vários repositórios, alterações em diferentes repositórios não podem ser feitas de forma atômica. Um ponto importante é que, se mudanças contínuas impactam vários microsserviços, talvez as fronteiras dos serviços não estejam bem definidas, resultando em alto acoplamento entre eles. Nesses casos, considerar a fusão de alguns microsserviços pode ser vantajoso.

No uso de monorepo, o código de vários microsserviços (ou outros tipos de projetos) é armazenado em um único repositório de código-fonte. Esse modelo permite que alterações de código feitas em diferentes projetos sejam realizadas de forma atômica. Para construção de artefatos, pastas devem ser mapeadas para processos de build específicos, e cada diretório pode ter responsáveis designados. Uma vantagem do monorepo é que ele facilita a reutilização de código entre projetos e permite mudanças atômicas.

No monorepo, é importante definir responsabilidades para diferentes áreas do código. Esses modelos indicam quem é responsável por cada parte do repositório. Os tipos incluem:

  • Responsabilidade forte: o código pertence a um grupo específico de pessoas. Se alguém fora desse grupo quiser fazer uma alteração, deve solicitar que os responsáveis façam a modificação;
  • Responsabilidade fraca: o código pertence a um grupo específico, mas pessoas de fora desse grupo têm permissão para fazer alterações, que devem ser revisadas pelos responsáveis; e
  • Responsabilidade coletiva: qualquer pessoa pode fazer qualquer alteração no código.

De modo geral, a abordagem de repositório por microsserviço (multirepo) é mais simples e sustentável. No caso do monorepo, a dificuldade de gerenciamento tende a crescer conforme o número de softwares aumenta.