.NET - Projetando e Executando Microservices - I
Neste artigo veremos os desafios em projetar uma aplicação usando Microservices e as abordagens para executar com sucesso essas aplicações. |
Como um bom desenvolvedor de software você se esforça para criar soluções eficazes e oportunas para problemas complexos. O primeiro problema que você geralmente tenta resolver é : O que o seu cliente quer, O que ele precisa ?
Se você for um desenvolvedor habilidoso, você vai conseguir entender isso
direito. Mas seus esforços não param por aí. Seu aplicativo após ser
implantado com sucesso, continua a crescer : você depura problemas; você
constrói novos recursos; você o mantém disponível e funcionando sem problemas.
Mesmo tendo uma equipe bem disciplinada ela terá que lutar para sustentar o
ritmo de crescimento das funcionalidades da aplicação. Na pior das hipóteses, o
seu produto que inicialmente era simples e estável acaba por torna-se intratável
e instável com o tempo devido ao incremento de novas funcionalidades.
Em vez de fornecer de forma sustentável mais valor aos seus clientes, você está
cansado de interrupções, e esta ficando ansioso para liberar novas
funcionalidades, ficando assim muito lento para fornecer novos recursos ou
assumir novos riscos.
Neste cenário nem seus clientes nem sua equipe estão felizes. Esta é a deixa
para apresentarmos os Microserviços.
Os Microsserviços prometem uma maneira melhor de gerar um impacto nos negócios de forma sustentável. Em vez de uma única unidade monolítica, as aplicações construídas usando microsserviços são compostas de serviços fracamente acoplados e autônomos.
A figura abaixo mostra uma típica arquitetura em camadas de uma aplicação monolítica:
Ao construir serviços que fazem bem uma coisa, você pode evitar a inércia e a
entropia de grandes aplicações. Mesmo em aplicativos existentes, você pode
progressivamente extrair funcionalidades em serviços independentes para tornar
todo o seu sistema mais sustentável.
Quando começamos a trabalhar com microsserviços, percebemos rapidamente que
construir serviços pequenos e auto-suficientes é apenas uma parte da execução de
uma aplicação de negócio critica.
Abaixo temos uma figura que mostra como podemos dividir uma aplicação em microserviços:
Mas o que é afinal uma aplicação com Microserviço ?
Microsserviços são uma abordagem arquitetural de desenvolvimento de software na qual uma aplicação monolítica é decomposta em vários pequenos serviços independentes, cada um focado em executar uma função específica. Cada microsserviço é uma unidade autônoma que pode ser desenvolvida, implantada e dimensionada de forma independente. Esses serviços interagem uns com os outros por meio de APIs (Interfaces de Programação de Aplicativos) ou outros mecanismos de comunicação.
A ideia por trás dos microsserviços é dividir um sistema complexo em partes menores, o que torna o desenvolvimento e a manutenção mais fáceis, escaláveis e flexíveis. Além disso, os microsserviços permitem que equipes de desenvolvimento trabalhem de forma mais independente, o que pode acelerar o ciclo de desenvolvimento e permitir atualizações mais rápidas e frequentes.
Desta forma, um
aplicativo de microsserviço é uma coleção de serviços autônomos, cada um dos
quais
realizando bem uma única tarefa, que trabalham juntos para realizar operações mais
complexas.
Em vez de um único sistema complexo, você constrói e gerencia um
conjunto de
serviços relativamente simples que podem interagir de formas complexas. Esses
serviços colaboram entre si por meio de protocolos de mensagens agnósticos em
tecnologia, ponto a ponto ou de forma assíncrona.
Isto pode
parecer uma ideia simples, mas tem implicações notáveis para reduzir o atrito no
desenvolvimento de sistemas complexos. A prática clássica de engenharia de
software advoga
coesão e acoplamento fraco como propriedades desejáveis de um sistema bem
projetado. Sistemas que
possuem essas propriedades serão mais fácéis de manter e mais maleáveis diante
da mudança.
A
coesão é o grau em que os elementos de um
determinado módulo permanecem juntos, enquanto
acoplamento é o grau em que um elemento sabe sobre
o funcionamento interno de outro.
O Princípio de Responsabilidade Única - SRP de
Robert C. Martin é uma maneira útil de considerar a
coesão : Agrupe as coisas
que mudam pelas mesmas razões. Separe as coisas que mudam por razoes diferentes.
Em um aplicativo monolítico, você tenta projetar para essas propriedades em uma
classe, módulo,
ou nível de biblioteca.
Em um aplicativo de microsserviço, você deseja, em vez disso, obter essas
propriedades no nível de unidades de funcionalidade independentemente
implantáveis.
Um único microsserviço deve ser altamente coeso: deve ser responsável por uma única responsabilidade dentro de uma aplicação. Da mesma forma, quanto menos cada serviço souber sobre o funcionamento interno de outros serviços, mais fácil será fazer alterações em um serviço sem forçar alterações nos demais.
Para ter
uma ideia melhor de como um aplicativo de microsserviço funciona, vamos
consider alguns dos recursos de um sistema hipotético de investimento on-line com
as seguintes funcionalidades:
- Abrir uma conta;
- Depositar e retirar dinheiro;
- Fazer pedidos para comprar ou vender posições em produtos fnanceiros (por
exemplo, ações);
- Modelar o risco e fazer previsões fnanceiras;
Vamos explorar o processo de venda de ações:
1 - Um cliente cria uma ordem para vender algumas ações de
um estoque de sua conta;
2 - Esta posição é reservada na sua conta, por isso não pode ser vendida várias
vezes;
3 - Como custa dinheiro fazer um pedido no mercado - uma taxa será cobrada da
conta do cliente;
4 - O sistema precisa comunicar esse pedido ao mercado de ações apropriado;
A figura abaixo mostra o fluxo de comunicação através de microserviços em uma aplicação que permite o usuário vender posições de suas ações no mercado:
Nesta figura podemos identificar dois atributos fundamentais dos microserviços:
A ideia
de que os microsserviços são responsáveis por coordenar ações em um sistema é a
diferença crucial entre essa abordagem e as arquiteturas orientadas a serviços
tradicionais (SOAs).
Esses tipos de sistemas (SOAs) costumavam usar
barramentos de serviço
corporativo (ESBs) ou padrões de orquestração mais complexos para externalizar a
orquestração de mensagens e processos dos próprios aplicativos. Nesse modelo, os
serviços freqüentemente careciam de coesão, com a lógica de negócios sendo cada
vez mais acrescida ao barramento de serviço, ao invés dos próprios serviços.
É
interessante pensar em como o desacoplamento das
funcionalidades no sistema de investimento on-line o ajuda a ser mais
flexível face à mudança de requisitos.
Imagine os seguintes cenários:
1- Você precisa alterar como as taxas são calculadas;
(alterar um requisito existente)
Você poderia fazer e liberar essas mudanças no serviço de taxas, sem
qualquer alteração nos demais serviços.
2- Quando um pedido for feito, você precisa alertar a
equipe de risco; (temos aqui um novo requisito)
Seria fácil criar um novo microsserviço para realizar essa operação com base em
um evento gerado pelo serviço de pedidos sem ter que alterar o resto do sistema;
Para concluir esta parte do artigo podemos pensar que 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.
(citação integral de :
https://martinfowler.com/articles/microservices.html acessado em
outubro/2018)
Desta forma ,a arquitetura de microservices tem muitas vantagens, por exemplo, serviços individuais são mais fáceis de entender e podem ser desenvolvidos e implantados de forma independente. Adotar novas tecnologias e frameworks torna-se mais fácil, pois a adoção pode ser aplicada em um serviço de cada vez.
Mas nem tudo são flores, pois as aplicações com muitos microsserviços tornam-se mais complexas de gerenciar pois são constituídas por mais elementos, e, para ser utilizada de forma eficaz, a arquitetura de microservices exige um alto nível de automação, como um PaaS, além disso, para desenvolver microsserviços, é necessário lidar com alguns problemas complexos de gerenciamento de dados distribuídos.
Apesar disso, a arquitetura de microservices é adequada para aplicações complexas e de grande porte que estão evoluindo rapidamente, especialmente para aplicações do tipo SaaS.(Software as a Service).
Na próxima parte do artigo vamos continuar abordando as principais chaves dos microserviços e como escalar através do desacoplamento.
"Ora,
àquele que é poderoso para vos guardar de tropeçar, e apresentar-vos
irrepreensíveis, com alegria, perante a sua glória,Ao único Deus sábio, Salvador nosso, seja glória e majestade, domínio e poder,
agora, e para todo o sempre. Amém."
Judas
1:24,25
Gostou ? Compartilhe no Facebook Compartilhe no Twitter
Referências:
https://smartbear.com/learn/api-design/what-are-microservices/
https://blog.newrelic.com/technology/microservices-what-they-are-why-to-use-them/