O que são microsserviços?
Em uma arquitetura de microsserviços, cada aplicativo é composto de muitos serviços menores, com acoplamento fraco e independente.
Plano de fundo azul e preto
O que são microsserviços?

Os microsserviços (ou a arquitetura de microsserviços) consistem em uma abordagem de arquitetura nativa de cloud na qual um único aplicativo é composto de muitos componentes ou serviços menores que são implementáveis de forma independente e que possuem acoplamento fraco. Esses serviços normalmente

  • têm sua própria stack de tecnologia, incluindo o modelo de banco de dados e gerenciamento de dados;

  • comunicam-se sobre uma combinação de APIs de REST, fluxos de eventos e brokers de mensagens; e

  • são organizados por recurso de negócios, com a linha separando os serviços que, muitas vezes, são chamados de contexto delimitado.

Embora grande parte da discussão sobre os microsserviços tenha sido relacionada a definições e características arquitetônicas, seu valor pode ser mais facilmente compreendido por meio de benefícios corporativos e de negócios bastante simples:

  • O código pode ser atualizado com mais facilidade, ou seja, novos recursos ou funcionalidades podem ser incluídas sem precisar alterar todo o aplicativo

  • As equipes podem usar stacks e linguagens de programação diferentes para componentes diferentes.

  • É possível ajustar a escala dos componentes de forma independente, reduzindo o desperdício e o custo associado ao ajuste de escala de aplicativos inteiros, como nos casos em que há um único recurso sobrecarregado.

O que os microsserviços não são

Os microsserviços também podem ser entendidos em contraste com duas arquiteturas de aplicativos anteriores: a arquitetura monolítica e a arquitetura orientada a serviços (SOA).

A abordagem da arquitetura monolítica é composta de um grande aplicativo com acoplamento forte, o que é diferente da arquitetura de microsserviços, na qual os microsserviços compõem um único aplicativo de muitos serviços menores com acoplamento fraco.

As diferenças entre a arquitetura de microsserviços e a SOA podem ser um pouco menos claras. Embora seja possível elaborar contrastes técnicos entre a arquitetura de microsserviços e a SOA, especialmente com relação à função do barramento de serviço corporativo (ESB), é mais fácil interpretar a diferença como uma questão de escopo. A SOA foi um esforço corporativo de padronização da forma como todos os serviços da web em uma empresa conversam entre si e se integram, enquanto a arquitetura de microsserviços é específica do aplicativo.

A postagem "SOA vs. microsserviços: qual é a diferença?" oferece mais detalhes.

Para saber mais sobre as diferenças entre a arquitetura monolítica e a de microsserviços, assista a este vídeo:

Como os microsserviços beneficiam a empresa

É provável que os microsserviços sejam tão populares entre os executivos e líderes de projetos quanto entre os desenvolvedores. Essa é uma das características mais incomuns dos microsserviços, pois o entusiasmo com relação à arquitetura é normalmente proveniente apenas das equipes de desenvolvimento de software. A razão para isso é que os microsserviços refletem melhor a forma como muitos líderes de negócios querem estruturar e administrar suas equipes e processos de desenvolvimento.

Os microsserviços são um modelo arquitetônico que facilita a aquisição do modelo operacional desejado. Em uma pesquisa recente da IBM com mais de 1.200 desenvolvedores e executivos de TI, 87% dos usuários de microsserviços concordaram que a adoção deles foi benéfica, tanto economicamente quanto logisticamente. 

Veja a seguir apenas alguns dos diversos benefícios corporativos oferecidos pelos microsserviços.

Implementáveis de forma independente

Talvez a característica mais importante dos microsserviços seja que os serviços são menores e implementáveis de forma independente, o que elimina a necessidade de uma legislação específica para mudar uma linha de código ou incluir um novo recurso no aplicativo.

Os microsserviços prometem às empresas a eliminação das frustrações associadas ao tempo necessário para fazer pequenas mudanças. Você não precisa ser um Ph.D. em ciência da computação para compreender o valor de uma abordagem que facilita e aprimora a velocidade e a agilidade.

Porém, a velocidade não é o único benefício de projetar serviços desta forma. Um novo modelo organizacional comum é unir equipes de diversas funções diferentes na resolução de um problema de negócios, serviço ou produto. O modelo de microsserviços se ajusta facilmente a essa tendência porque possibilita que uma empresa crie equipes pequenas e com diversas funções com relação a um serviço ou a uma coleção deles para agilizar as operações.

O acoplamento fraco dos microsserviços também oferece um nível de isolamento de falhas, além de melhor resiliência para os aplicativos. O pequeno tamanho dos serviços, combinado com seus padrões de comunicação e limites claros, facilita a compreensão dos novos membros da equipe quanto à base de código para acelerar as contribuições, o que oferece um benefício claro em termos de velocidade e engajamento da equipe.

Ferramenta ideal para a tarefa

Nos padrões tradicionais de arquitetura de n-camadas, um aplicativo geralmente compartilha um stack com um grande  banco de dados relacional  que suporta todo o aplicativo. Essa abordagem tem várias desvantagens óbvias, sendo a mais significativa o fato de que todo componente de um aplicativo deve compartilhar uma pilha, um modelo de dados e um banco de dados comuns, mesmo que haja uma ferramenta clara e melhor para a tarefa em determinados elementos. Isso gera uma arquitetura ruim e frustra os desenvolvedores que estão sempre cientes de que há uma maneira melhor e mais eficiente para desenvolver esses componentes.

Por outro lado, em um modelo de microsserviços, os componentes são implementados de forma independente e se comunicam por meio de uma combinação de REST, fluxos de eventos e brokers de mensagens, o que permite que o stack de cada serviço seja otimizada para ele. A tecnologia muda o tempo todo, e um aplicativo composto por diversos serviços menores simplifica e reduz os custos do desenvolvimento quando uma tecnologia mais adequada se torna disponível.

Ajuste de escala preciso

Com os microsserviços, a implementação e o ajuste de escala dos serviços ocorre de forma individual. O benefício resultante é evidente: quando executados corretamente, os microsserviços requerem menos infraestrutura do que os aplicativos monolíticos porque permitem que um ajuste de escala preciso seja feito somente nos componentes necessários, em vez de em todo o aplicativo, no caso de aplicativos monolíticos.

Há também desafios

Além dos benefícios, há também desafios significativos relativos aos microsserviços. Migrar do monolítico para os microsserviços pode aumentar a complexidade de gerenciamento, pois haverá mais serviços, exigirá mais equipes e serão implementados em mais ambientes. Os problemas que ocorrem em um serviço podem causar ou ser a causa de problemas em outros. O registro de dados (usados para o monitoramento e a resolução de problemas) gera mais volume e pode ser inconsistente entre os serviços. Novas versões podem causar problemas de compatibilidade com versões anteriores. Os aplicativos envolvem mais conexões de rede, o que significa mais oportunidades para problemas de latência e conectividade. Uma abordagem de DevOps (como explicado abaixo) pode abordar diversas dessas questões, mas sua adoção apresenta desafios específicos.

No entanto, esses desafios não estão impedindo os não adotantes de implementar os microsserviços, ou que os adotantes avancem em seus compromissos com microsserviços. Dados recentes  de uma pesquisa feita pela IBM  revelam que 56% das pessoas que não são atualmente usuários estão propensas ou muito propensas a adotar os microsserviços nos próximos dois anos. Além disso, 78% dos usuários atuais provavelmente investirão mais tempo, dinheiro e esforços em seus microsserviços.

Os microsserviços permitem o uso de DevOps, mas também precisam dele

A arquitetura de microsserviços é frequentemente descrita como otimizada para DevOps e para a integração contínua/entrega contínua (CI/CD). No contexto de pequenos serviços que podem ser implementados com frequência, é fácil entender o motivo. 

Mas outra forma de analisar este relacionamento entre microsserviços e DevOps é que as arquiteturas de microsserviços, na verdade, requerem DevOps para ter sucesso. Embora os aplicativos monolíticos tenham uma variedade de desvantagens (que foram discutidas anteriormente neste artigo), seu benefício é não ser um sistema distribuído e complexo com diversas peças móveis e stacks de tecnologia independentes. Em contraste, dado o enorme aumento de complexidade, movimentação de peças e dependências decorrentes dos microsserviços, são necessários investimentos significativos em implementação, monitoramento e automação do ciclo de vida.

Andrea Crawford oferece mais detalhes sobre DevOps no vídeo a seguir:

Principais ferramentas e tecnologias facilitadoras

Embora qualquer ferramenta ou linguagem moderna possa ser usada em uma arquitetura de microsserviços, há um variedade de ferramentas importantes que se tornaram essenciais e praticamente definitivas para os microsserviços:

Contêineres, Docker e Kubernetes

Uma das principais características de um microsserviço é que geralmente é bem pequeno. Não existe um volume específico de código que determine se algo é ou não um microsserviço, mas "micro" está lá no nome.

Quando oDocker iniciou a era do contêiner moderno em 2013, também introduziu um modelo de computação que se tornaria muito associado aos microsserviços. Como os  contêineres  individuais não têm a sobrecarga do próprio sistema operacional, são menores e mais leves do que as  máquinas virtuais  tradicionais e podem girar para cima e para baixo mais rapidamente, são ideais para os serviços menores e mais leves encontrados nas arquiteturas de microsserviços.

Com a proliferação de serviços e contêineres, orquestrar e gerenciar grandes grupos de contêineres rapidamente tornou-se um dos maiores desafios. O Kubernetes, uma plataforma de software livre  para a orquestração de contêineres,  surgiu como uma das soluções de orquestração mais populares porque é muito eficaz.

Gateways de API

Os microsserviços muitas vezes se comunicam por meio de APIs, especialmente para estabelecer o estado inicial. Embora os clientes e serviços possam se comunicar diretamente, os gateways de API consistem muitas vezes em uma camada intermediária útil, especialmente à medida que o número de serviços em um aplicativo cresce ao longo do tempo. Um gateway de API atua como um proxy reverso para os clientes, roteando as solicitações e as distribuindo entre diversos serviços para fornecer segurança e autenticação adicionais.

Há diversas tecnologias para a implementação de gateways de API, incluindo plataformas de gerenciamento de API, mas quando a arquitetura de microsserviços está sendo implementada com contêineres e com o Kubernetes, o gateway é normalmente implementado com o Ingress ou, mais recentemente, com o  Istio.

Sistema de mensagens e fluxos de eventos

Embora a melhor prática seja desenvolver serviços sem estado, o estado ainda existe e os serviços precisam estar atentos a ele. E embora uma chamada de API seja muitas vezes eficaz para estabelecer inicialmente o estado de um determinado serviço, ela não é particularmente eficaz para manter-se atualizado sobre ele. Uma pergunta constante, a abordagem "já chegamos aonde gostaríamos?" para manter os serviços atual simplesmente não é prática.

Em vez disso, é preciso acoplar chamadas de API de estabelecimento de estado com sistemas de mensagens ou fluxos de eventos para que os serviços possam transmitir as mudanças de estado e outras partes interessadas possam ouvir essas mudanças e fazer os ajustes necessários. Esta tarefa pode ser mais bem executada por um broker de mensagens de propósito geral, mas há casos nos quais uma plataforma de fluxos de eventos, como o Apache Kafka, é mais adequada. Ao combinar os microsserviços com a  arquitetura orientada a eventos,  os desenvolvedores  podem criar sistemas distribuídos, altamente escaláveis, tolerantes a falhas e extensíveis que são capazes de consumir e processar quantidades enormes de eventos ou informações em tempo real.

Serverless

As arquiteturas serverless utilizam alguns dos padrões de cloud e de microsserviços em sua conclusão lógica. Nesse caso, a unidade de execução não é só um pequeno serviço, mas uma função, que muitas vezes pode ter poucas linhas de código. As diferenças entre uma função serverless e um microsserviço não são muito claras, mas as funções são consideradas ainda menores do que um microsserviço.

Tanto as arquiteturas serverless e as plataformas de  função como serviço (FaaS)  quanto os microsserviços tem como objetivo criar unidades menores de implementação e ajustar precisamente a escala de acordo com a demanda.

Microsserviços e serviços em cloud

Não é necessariamente só a área de cloud computing que vê relevância nos microsserviços, mas há algumas razões importantes que justificam esse interesse e que vão além da popularidade do estilo de arquitetura dos microsserviços e da cloud como destino de hospedagem para novos aplicativos.

Entre os principais benefícios da arquitetura de microsserviços estão a utilização e o custo associados à implementação e ao ajuste de escala de cada componente. Embora isso, de certa forma, também seja um benefício da infraestrutura local, só é possível obter uma otimização de custo real ao combinar componentes pequenos e que podem ter sua escala ajustada de maneira independente com uma infraestrutura sob demanda e com pagamento por uso.

Além disso, outro grande benefício dos microsserviços, talvez até mesmo o mais importante, é que cada componente individual pode adotar a stack mais adequada à sua tarefa específica. Enquanto a proliferação de stacks pode gerar grande complexidade e sobrecarga quando gerenciada por conta própria, consumir a stack de suporte na forma de serviços de cloud pode minimizar drasticamente os desafios de gerenciamento. Embora não seja impossível implementar sua própria infraestrutura de microsserviços, isso não é recomendado, especialmente quando você está apenas começando.

Padrões comuns

Nas arquiteturas de microsserviços, há muitos padrões de design, comunicação e integração comuns e úteis que ajudam a lidar com alguns dos desafios e das oportunidades mais recorrentes, incluindo os seguintes:

Padrão back-end para front-end (BFF). Esse padrão insere uma camada entre a experiência do usuário e os recursos usados por ela. Por exemplo, um aplicativo usado em uma área de trabalho terá um tamanho de tela, uma exibição e limites de desempenho diferentes daqueles em um dispositivo móvel. O padrão BFF permite que desenvolvedores criem e suportem um tipo de back-end por interface com o usuário usando as melhores opções para essa interface, em vez de tentar suportar um back-end genérico que funciona com qualquer interface, mas que pode impactar negativamente o desempenho do front-end.

Padrões de entidades e agregados. Uma entidade é um objeto diferenciado por sua identidade. Por exemplo, em um site de e-commerce, um objeto de produto pode ser distinguido por nome, tipo e preço. Um agregado é uma coleção de entidades relacionadas que deve ser tratada como uma unidade. Portanto, para o site de e-commerce, um pedido seria uma coleção (agregado) de produtos (entidades) solicitada por um comprador. Esses padrões são usados para classificar dados de maneiras significativas.

Padrões de descoberta de serviço. Esses aplicativos e serviços de ajuda são combinados. Em uma arquitetura de microsserviços, as instâncias de serviço mudam dinamicamente devido ao ajuste de escala, aos upgrades, às falhas de serviço e até mesmo à rescisão de serviço. Esses padrões fornecem mecanismos de descoberta para lidar com essa transitoriedade. O balanceamento de carga pode adotar estes padrões de descoberta de serviço usando verificações de funcionamento e falhas de serviço como acionadores para reequilibrar o tráfego.

Padrões de adaptadores de microsserviços. Os padrões de adaptadores são similares aos adaptadores de tomada usados em viagens para outros países. A finalidade dos padrões de adaptador é ajudar a traduzir os relacionamentos entre classes ou objetos que seriam incompatíveis. Um aplicativo que usa APIs de terceiros pode precisar de um padrão de adaptador para garantir a comunicação entre o aplicativo e as APIs.

Padrão de aplicação Strangler. Estes padrões ajudam a gerenciar a refatoração de um aplicativo monolítico em aplicativos de microsserviços. O nome criativo se refere a como uma videira (microsserviços) lentamente toma conta e estrangula uma árvore (um aplicativo monolítico).

Você pode saber mais sobre esses padrões em "Como usar padrões de desenvolvimento com microsserviços (parte 4)". O IBM Developer também oferece um lote de informações caso você deseje descobrir sobre outros padrões de código de microsserviços.

Antipadrões

Embora existam muitos padrões úteis para os microsserviços, há um número igualmente significativo de padrões que podem causar problemas para qualquer equipe de desenvolvimento. Veja a seguir alguns deles, considerados ruins para os microsserviços:

A primeira regra dos microsserviços é não criar microsserviços. Mais precisamente, não comece a partir dos microsserviços. Os microsserviços são uma forma de gerenciar a complexidade de aplicativos que ficaram grandes demais para serem atualizados e mantidos com facilidade. Ao notar as dificuldades e a complexidade do aplicativo monolítico, vale a pena considerar como refatorá-lo em serviços menores. Até lá, não se preocupe com isso. Não haverá um monólito que precisa de refatoração.

Não faça microsserviços sem DevOps ou serviços de cloud. Desenvolver microsserviços significa desenvolver sistemas distribuídos, ou seja, haverá complexidade (especialmente se você tomar as decisões erradas). Você terá muitos problemas ao tentar usar microsserviços sem a) implementação e automação de monitoramento adequadas ou b) serviços de cloud gerenciados para suportar sua nova infraestrutura extensa e heterogênea. Em vez disso, economize tempo e concentre-se apenas no estado. 

Não crie muitos microsserviços tornando-os muito pequenos. Ao fazer isso, pode haver sobrecarga e complexidade superiores aos ganhos gerais da arquitetura de microsserviços. É melhor usar serviços maiores e separá-los apenas quando eles começarem a desenvolver características que podem ser resolvidas pelos microsserviços, ou seja, quando a implementação de mudanças é difícil e lenta, um modelo de dados comum está se tornando muito complexo ou diferentes partes do serviço têm diferentes requisitos de carga/escala.

Não transforme os microsserviços em SOA. Os microsserviços e a arquitetura orientada a serviços (SOA) são frequentemente assimilados como a mesma coisa, dado que em seu nível mais básico, ambos estão interessados em desenvolver componentes individuais reutilizáveis que possam ser consumidos por outros aplicativos. A diferença entre eles é que os projetos de microsserviços geralmente envolvem a refatoração de um aplicativo para facilitar o gerenciamento, enquanto a SOA se preocupa em mudar a forma como os serviços de TI funcionam em toda a empresa. Um projeto de microsserviços que se transforma em um projeto de SOA provavelmente apresentará problemas.

Não tente ser igual a Netflix. A Netflix foi um dos pioneiros da arquitetura de microsserviços ao desenvolver e gerenciar um aplicativo que representava um terço de todo o tráfego da Internet, o que exigiu muitos serviços e código customizados que eram desnecessários para o aplicativo de forma geral. É muito melhor começar aos poucos, evitando a complexidade e usando o maior número de ferramentas prontas para uso possível.

Soluções relacionadas
Red Hat OpenShift on IBM Cloud

Implemente clusters Kubernetes altamente disponíveis e completamente gerenciados para seus aplicativos conteinerizados com um único clique

Conheça o Red Hat OpenShift on IBM Cloud
IBM Cloud Satellite

Implemente e gerencie aplicativos em contêiner de forma consistente em ambientes locais, computação de borda e na cloud pública de qualquer fornecedor

Conheça o IBM Cloud Satellite
IBM Cloud Code Engine

Execute imagens de contêiner, trabalhos em lote ou código-fonte como cargas de trabalho serverless, sem a necessidade de realizar dimensionamento, ajuste a escala, implementação ou criação de rede.

Conheça o IBM Cloud Code Engine
Recursos O que é DevOps?

O DevOps acelera a entrega de software de qualidade superior combinando e automatizando o trabalho de desenvolvimento de software e equipes de operações de TI.

O que são contêineres?

Os contêineres são unidades executáveis de software que oferecem um pacote de código de aplicativos com sua estrutura de biblioteca e que podem ser executados em qualquer lugar, seja no desktop, TI tradicional ou na cloud.

O que é o Kubernetes?

Kubernetes é uma plataforma de orquestração de contêiner de software livre que automatiza a implementação, o gerenciamento e o ajuste de escala de aplicativos em contêineres.

Dê o próximo passo

Com o Red Hat OpenShift on IBM Cloud, os desenvolvedores do OpenShift têm uma maneira rápida e segura de conteinerizar e implementar cargas de trabalho corporativas em clusters Kubernetes. Como a IBM oferece gerenciamento da Plataforma de Contêiner OpenShift (OCP), você pode transferir tarefas repetitivas envolvendo gerenciamento da segurança, gerenciamento de conformidade, gerenciamento de implementação e gerenciamento contínuo de ciclo de vida e ter mais tempo para focar em suas tarefas principais.

Conheça o Red Hat OpenShift on IBM Cloud