Thiago Cantero

Tecnologia e Entretenimento

Arquitetura de SoftwareDesenvolvimento WebDesign de SoftwareDockerMicrosserviçosMonolíticaSistemas Operacionais

Arquitetura de Microsserviços – Conceitos Básicos e análise crítica.

Olá, mundo!
Tudo bem?

Hoje gostaria de falar sobre um tema amplamente difundido, a arquitetura de Microsserviços. Inclusive esta modalidade arquitetural não é nova como a Hype que está nos Youtubes, Cursos fornecidos ou Ebooks (por módicos R$ 9,99) dizem por ai. É um conceito antigo, inclusive dos idos dos anos 70 e 80. ; )

Introdução

Afinal, é uma arquitetura inovadora?Tem necessidade de se adotar ela?Vamos entender do que se trata, e aos poucos iremos entender cada parte do conceito.

“Microsserviços” – mais um novo termo nas ruas lotadas da arquitetura de software. Embora a nossa inclinação natural seja olhar para essas coisas com um certo desprezo, a terminologia descreve um estilo de sistemas de software que temos achado cada vez mais atraente. Temos visto muitos projetos usando esse estilo nos últimos anos, e os resultados até agora têm sido positivos; tanto que, para muitos de nossos colegas, microsserviços vem se tornando o estilo padrão para o desenvolvimento de aplicativos corporativos. Infelizmente, no entanto, não há muita informação que descreva o estilo de microsserviços e como aplicá-lo.

Resumindo, o estilo de arquitetura de microsserviços é uma abordagem que desenvolve um aplicativo único como uma suite de pequenos serviços, cada um executando seu próprio processo e se comunicando através de mecanismos leves, muitas vezes em uma API com recursos HTTP. Esses serviços são construídos em torno de capacidades de negócios e funcionam através de mecanismos de deploy independentes totalmente automatizados. Há o mínimo possível de gerenciamento centralizado desses serviços, que podem ser escritos em diferentes linguagens de programação e utilizam diferentes tecnologias de armazenamento de dados. – Martin Fowler e James Lewis disponível em https://martinfowler.com/articles/microservices.html  – traduzido

Imagine a Torre de Babel, aquela Torre ilustrada em Gênesis (Bíblia), em que tinha o intuito de se chegar ao céu. Vou resumir brevemente… …Sobreviventes do Dilúvio (que falavam uma única língua), levantaram uma Torre que possibilitasse os homens enxergarem os céus, mas Deus não se agradou e fez com que todos que ali estavam presentes, confundissem entre si através de línguas distintas…

Bom, o que tem a ver isso?Tudo, imagine um cenário em que você necessita criar uma forma de comunicar com outros sistemas, que estes se integram para uma finalidade em comum!Você faria isso através de APIs, correto?
É o que se trata a Arquitetura de Microsserviços, nada além de um compartilhamento de serviços (aplicações) de diferentes linguagens (Torre de Babel), para prover um único fim.

Escalabilidade

O termo é bem falado nos dias atuais, mas você sabe o que seria?

Basicamente existem duas formas de escalabilidade: Horizontal e Vertical. Vejamos como elas funcionam em um diagrama simplório.

 

A aplicação fica disposta entre servidores numa mesma linha, possibilitando a execução desta de maneira distribuída. Neste tipo de escalabilidade, não é sempre levado em consideração um hardware mais avançado, já que os recursos computacionais irão ser divididos.

Esta escalabilidade é a mais cara, pois se vale de atualização do Hardware, optando por exemplo um Processador mais moderno, mais memórias, SSD, enfim, dependendo do cenário. Será o necessário, pois se estiver trabalhando com Banco de Dados Relacional, não tem outra forma a não ser esta.

Uma importante observação, não é a linguagem em si que é escalar, e sim o Sistema Operacional!Devemos sempre ter esta atenção, pois é visto em diversos posts da internet do mundo afora, que linguagem x não escala, em detrimento da linguagem y. Isto não é de toda verdade, o Sistema Operacional deve ter esta premissa, por exemplo um Sistema Monotarefa como o DOS não era Escalável, já um DOS Novell era, isso se dava por questões específicas do Kernel de cada Sistema. Veja que isso não é tão moderno quanto parece.

Conteinerização da Aplicação

Por algum dia desses, talvez tenha ouvido ou lido sobre Contêineres Dockers, Kubernetes e toda essa “boa nova” do mundo afora, sim?

Bom, o Docker é um conceito novo, lá de 2008…rs Sim, ele é baseado no LXC (Linux Containers), uma forma diferente de virtualização que isola um Sistema Operacional (Linux) em um contêiner, as vantagens de um contêiner são visíveis em relação a virtualização. Veja este comparativo:

What is a Container? - Docker
What is a Container? Disponível em: https://www.docker.com/resources/what-container/

Conforme podemos observar, o Docker serve como um provedor de múltiplas camadas de software, utilizando o mesmo Kernel do Sistema Operacional nativo, no entanto, rodando serviços de forma isoladas. Isso acaba com aquele mito de que “só roda na minha máquina”, pois cada contêiner pode ser configurado e disponível para que você implemente em qualquer outro ambiente que possua o Docker. Isso ajuda muito em termos de adaptação e implementação.

Já uma Virtualização tem uma camada de Hypervisor no Kernel do Sistema Operacional, compartilhando mais recursos, e consequentemente, onerando mais. Mas afinal, a virtualização é ruim em relação aos Contêineres, depende!
O Contêiner tem a vantagem de fazer a imagem exatamente igual ao que fora gerada no desenvolvimento e facilita para colocar em produção.

Diferenças entre Aplicações Monolíticas e de Microsserviços

 

Arquiteturas Monolíticas e de Microsserviços – Autor desconhecido

Como podemos observar acima, a Arquitetura Monolítica, é feita por uma única instância (isso não é regra!) e as camadas de Inteface do Usuário, Lógica do Negócio e a Camada de Acesso aos Dados, são únicos, dispostas em um mesmo serviço. Quando escalarmos essa aplicação, iremos de maneira isolada (monolítica) escalá-las entre Horizontalmente (Nós e serviços com trabalhos compartilhados) ou Verticalmente (Nós mais modernos, hardwares mais performáticos). Já a Arquitetura de Microsserviços dispõe de múltiplos servidores, e os serviços rodam independentes, ou seja, em geral fazemos uma adoção de contêineres, que isolam cada aplicação e ajusta conforme a demanda, por exemplo: Um serviço de busca de sua aplicação que trabalha com NodeJS no backend, no entanto trabalha com indexação de busca com o Apache Solr (Java), você pode isolar este serviço em Solr em um Contêiner Docker, e escalá-lo conforme sua necessidade, baseado no monitoramento de que este recurso da aplicação é muito solicitada, com isso ganhando desempenho.

Um resumo breve, aplicação monolítica em termos de custo, é mais barato pois terá em sua posse uma equipe menor, e que trabalhará de maneira uniforme cada parte da aplicação, no entanto se a aplicação crescer muito, terá alguns problemas de manutenção de código, dentre outros fatores que concernem ao modelo. A Aplicação de Microsserviços é mais cara e complexa, pois em geral, trabalham com linguagens distintas, equipes trabalham com o modelo CI/CD (Entrega Contínua) do projeto, o que é uma grande vantagem, porém encarece e muito em termos distintos. Nesta adoção se faz necessário o uso de uma API Gateway para gerenciar os processos (partes da aplicação) que se comunicam por protocolos HTTP REST ou gRPC, por exemplo. Por essa razão devemos definir muito bem o que devemos ter, afinal em muitos casos, não estamos em Big Techs que devem ter o serviço de maneira crítica disponibilizada. Realmente, certas Hypes como esta causam uma histeria. ; D

Não existe bala de prata

Por mais que esta frase seja muito clichê, realmente não existe algo melhor ou específico!Tudo depende de como organiza seu código. Ele deve ser limpo de rotinas que fazem leitura de um arquivo em disco, por exemplo, um Load Balancer para gerir melhor as Sessões de sua aplicação, até mesmo adoção de Bancos NoSQL como o REDIS para esta finalidade. Trabalhar com filas, enfim uma série de boas prática de design e arquitetura de software. E o que você tem disponível para investir, em dinheiro, recurso humano qualificado, para não haver problemas futuros, como uma não continuidade da aplicação.(O que ocorre muito, e inclusive autores consagrados como Eric Evans expõe isso.)

Acima de tudo, humildade!Creio que seja esta a palavra certa para que tenhamos o melhor dos mundos, seja monolítico ou microsserviços.

Por hoje é só!Até mais! ; )

Para conseguir a amizade de uma pessoa digna é preciso desenvolvermos em nós mesmos as qualidades que naquela admiramos.