Microsserviços: Um Framework Reutilizável

No artigo “Microsserviços: Projetando”, apresentamos aspectos referentes ao desenvolvimento de aplicações baseadas em microsserviços. Neste post, vamos apresentar as vantagens de se utilizar um framework para a construção de microsserviços, padronizando elementos comuns a todos eles, mesmo que mantendo a liberdade de escolha da tecnologia por cada equipe. Um framework desse tipo é normalmente baseado no Microservice Chassis Pattern.

Contexto

Conforme apresentado no artigo “Microsserviço, o que é: Conceitos e Propriedades”, uma das características da arquitetura de microsserviços é possibilitar a construção de cada microsserviço de forma independente do restante da aplicação, proporcionando liberdade de escolha com relação à tecnologia e às linguagens utilizadas, o que inclui os mecanismos de persistência de dados. 

À medida que a organização cresce, as equipes técnicas também aumentam em número. Neste processo, é muito comum que cada equipe faça suas escolhas de ferramentas e linguagem de programação. E escolhas tendem a aumentar a produtividade dos membros da equipe à medida que ganham experiência na tecnologia escolhida. No entanto,  isso também cria uma certa barreira para a rotatividade de membros entre as equipes. 

Outra questão importante a ser considerada é o fato de que poderá haver duplicação de trabalho. Equipes acabam resolvendo os mesmos problemas de forma diferente e com tecnologias diferentes. Estes esforços poderiam ser melhor direcionados para questões ainda não resolvidas. 

Entretanto, mesmo diante dessas dificuldades e duplicações de trabalho, ainda é melhor manter a liberdade de escolha do que definir regras rígidas para todas as equipes seguirem. Além de ferir os princípios dos microsserviços, essa atitude poderia comprometer a qualidade e a agilidade na criação e implantação das aplicações.

Uma solução possível para esse dilema é adotar um framework (chassis) que trata das questões gerais dos microsserviços e que são comuns a todas as tecnologias, como logging e health checking. Dessa forma, as equipes podem continuar com suas escolhas de forma independente. Podem, ainda, estar alinhadas entre si através das ferramentas que lidam com a infraestrutura disponível para executar seus microsserviços. Essa padronização reduz a redundância do sistema, abstraindo essa lógica comum em uma outra camada de implementação. Adicionalmente, as questões referentes à conectividade, à configuração e ao monitoramento da aplicação podem ser transferidas para esse framework.

Framework Reutilizável

A adoção horizontal de um framework comum traz muitos benefícios para a organização e suas equipes de sistemas.

Embora a arquitetura de microsserviços possibilite a adoção de tecnologias completamente distintas pelas várias equipes de desenvolvimento, é comum que se utilize um número relativamente reduzido de linguagens na maioria dos casos. Dessa maneira, o compartilhamento de soluções prontas, bibliotecas e experiência pode representar um grande ganho para as equipes.

Outro aspecto importante é que os microsserviços devem ser criados continuamente e de forma rápida. Para atender essa necessidade, podemos prover uma estrutura básica. Em paralelo, um conjunto de ferramentas já aprovadas previamente para cada linguagem utilizada na organização. Essas ferramentas serão usadas para construir os microsserviços e colocá-los em execução rapidamente. Certamente, essa é uma forma de introduzir melhores práticas no dia-a-dia das equipes, ao mesmo tempo em que facilita a rápida prototipação. Essa prática também garante que o esforço seja dedicado principalmente à construção da lógica de negócio das aplicações. Reduz, ainda, o tempo gasto com a funcionalidade de infraestrutura e gerenciamento dos microsserviços em si.

Com a criação desse chassi, respeitamos as características dos microsserviços e obtemos todos os benefícios acima descritos. Além disso, caso seja encontrada alguma vulnerabilidade em uma biblioteca, a atualização poderá ser realizada em um único ponto e ficará disponível para todos. 

Microservice Chassis Pattern

O propósito de um microservice chassi é facilitar a criação de novos microsserviços, ao mesmo tempo em que provê um conjunto de padrões que todos eles devem respeitar, independentemente da equipe a qual pertencem. Essa padronização facilita a entrada de novos membros nas equipes. Estabelece, ainda, um vocabulário comum e incrementa a troca de experiências entre elas, e facilita o entendimento do código.

Algumas das funcionalidades que devem estar presentes nesse chassi (Figura 1) incluem logging, health checking, tratamento de exceções, autenticação, registro e descoberta de serviços, métricas, padrão de transporte de mensagens, setup para bases de dados e facilidades para instanciar novos microsserviços. Aspectos como observabilidade, relatórios de erros, balanceamento de carga e rate limiting também podem estar implementadas no microservice chassis

Microservice chassi compartilhado por vários serviço

Figura 1: Microservice chassi compartilhado por vários serviço

O microservice chassis também contribui para minimizar os riscos envolvidos na criação de novos microsserviços, uma vez que ele provê um conjunto de padrões e funcionalidades já testadas, aprovadas e em produção, incluindo combinações de linguagens e suas principais bibliotecas. 

O trabalho envolvido em criar, manter e atualizar um microservice chassis traz um enorme retorno para a organização, pois gera um setup correto, testado e reutilizável e evita que o tempo gasto na adequação dos serviços ao ambiente de execução seja repetido a cada novo microsserviço. 

Mesmo com todos os benefícios proporcionados pela adoção de um chassi, é importante notar que ele poderá ser um obstáculo para a adoção de novas linguagens ou frameworks já que é necessário criar uma adaptação ao microservice chassis para cada linguagem utilizada na organização. 

Existem vários frameworks para microservice chassis disponíveis para utilização, como Spring Boot, Spring Cloud e Dropwizard para a linguagem Java e Gizmo, Micro e Go Kit para a linguagem Go.

Resumindo

Em resumo, o microservice chassis é uma forma de abstrair a implementação de algumas questões relacionadas à infraestrutura, uma vez que ele fornece mecanismos para uma rápida criação e inicialização dos microsserviços e também auxilia no compartilhamento de experiências entre as equipes. Naturalmente, chassi deve ser mantido em constante evolução, à medida que incorpora novas soluções encontradas pelas equipes. Importante que seja  mantido atualizado com as práticas e com a experiência da organização.

Finalmente, cabe observar que muitas aspectos de resiliência dos microsserviços e comunicação entre eles normalmente estará isolada na camada de Service Mesh, não fazendo parte da funcionalidade de um microservice chassi.

fique atualizado

Assine nossa newsletter e acompanhe as nossas novidades.