Por que utilizar microsserviços e contêineres? - TecMundo
Atualizado em: 14 de setembro de 2020 | Publicado em: 1 de novembro de 2018
Em primeiro lugar, o que são microsserviços? Uma arquitetura de microsserviços divide seu aplicativo em vários serviços que realizam funções refinadas e compõem seu aplicativo como um todo. Cada microsserviço terá uma função lógica diferente para o seu aplicativo.
Os aplicativos tradicionais possuem arquiteturas monolíticas em que todos os componentes e funções do seu aplicativo se encontram em uma única instância; microsserviços dividem os aplicativos monolíticos em partes menores. O diagrama a seguir compara arquiteturas monolíticas e de microsserviços.
Arquiteturas monolíticas x de microsserviços
Portanto, onde são colocados seus microsserviços? Em contêineres.
Contêineres são pacotes do seu software que contam com tudo o que ele precisa para ser executado, incluindo código, dependências, bibliotecas, binários e muito mais. Docker e Kubernetes são os frameworks mais populares para organizar vários contêineres em ambientes corporativos. Em comparação com as máquinas virtuais (VMs, do inglês Virtual Machines), os contêineres compartilham o kernel do sistema operacional em vez de armazenar uma cópia completa, como na implementação de várias VMs em um único host. Embora seja possível colocar seus microsserviços em múltiplas VMs, esse é um caso em que normalmente contêineres seriam utilizados, dado que ocupam menos espaço e têm inicialização mais rápida.
Por que utilizar uma arquitetura de microsserviços?
A arquitetura de microsserviços foi criada para lidar com problemas causados por aplicativos monolíticos. Os microsserviços já são usados em larga escala e alguns sites de grande porte já transformaram seus aplicativos monolíticos em microsserviços.
Alguns benefícios do uso de uma arquitetura de microsserviços são:
Os desenvolvedores trabalharão em uma base de código menor em comparação com uma maior em um aplicativo monolítico. Quando os componentes do aplicativo estiverem frouxamente acoplados, o código fonte será de fácil compreensão para os desenvolvedores. Sendo assim, não haverá atraso no desenvolvimento, fora o fato de que seu IDE será mais rápido se você estiver trabalhando com um número menor de linhas de código. Os desenvolvedores não precisarão lidar com as complexidades e dependências de funções que podem ser encontradas em um aplicativo monolítico;
As responsabilidades dos desenvolvedores serão mais definidas. Uma equipe pode ser designada por componentes ou microsserviços do aplicativo. As revisões de código serão mais rápidas. Os processos de atualização serão mais rápidos e não haverá necessidade de construir e implantar tudo, em comparação com o que ocorre em um aplicativo monolítico;
O conjunto de tecnologia do aplicativo pode variar através de microsserviços. Não será necessário que o aplicativo seja dependente de uma linguagem ou biblioteca. Os microsserviços podem alavancar diferentes linguagens de programação de acordo com o discernimento dos desenvolvedores. É possível ter microsserviços poliglotas, como os apresentados no diagrama abaixo;
Microsserviços poliglotas
A entrega contínua será mais fácil. Em comparação com um aplicativo monolítico, você não precisará implantar tudo novamente para uma simples mudança com microsserviços. Você pode optar por reconstruir e implantar apenas aquele microsserviço que precisa de atualização. As atualizações frequentes serão mais rápidas;
A escalabilidade será independente para cada microsserviço. Você tem a opção de dimensionar cada componente do seu aplicativo de acordo com o recurso necessário. Você não precisaria fazer várias instâncias de tudo em comparação com um aplicativo monolítico. O escalonamento dos microsserviços utilizará os recursos disponíveis com eficiência, em lugar de ter várias cópias de todo o aplicativo em um aplicativo monolítico.
Microsserviços e escalabilidade
Os dados podem ser descentralizados. Você pode optar pelo uso de diferentes bancos de dados ou armazenamento para seus microsserviços. Pode escolher um banco de dados NoSQL caso ele atenda melhor seu microsserviço do que um banco de dados relacional. Um microsserviço também pode demandar apenas um banco de dados de armazenamento de chaves simples, como o Redis. Como mostra o diagrama abaixo, você pode escolher uma combinação de bancos de dados Cloudant, MySQL e MongoDB. Pode tirar proveito de diferentes bancos de dados para armazenar diferentes tipos de dados;
Microsserviços e bases de dados
Isolamento de falhas. Um erro ou bug em um microsserviço não derruba o sistema inteiro. Quando você tem componentes frouxamente acoplados e um microsserviço em seu aplicativo trava ou causa erros, a chance de outros microsserviços serem afetados é menor, dado que eles estão em seus próprios contêineres e não dependem totalmente uns dos outros. Um aplicativo monolítico pode interromper todo o processo de seu aplicativo se o bug ou erro não for detectado corretamente.
Embora o uso de microsserviços resolva alguns dos problemas de uma arquitetura monolítica, sua utilização carrega seu próprio conjunto de problemas. Se você está tentando dividir seu aplicativo monolítico em microsserviços, o primeiro desafio é como efetuar essa divisão. Você pode optar por dividi-los em funções de negócios, criando, por exemplo, um microsserviço para lidar com remessas e outro microsserviço para lidar com serviços de pagamento. Ao fim do processo, seus componentes devem ter apenas um pequeno conjunto de funções ou responsabilidades.
Enxergo alguns problemas em uma arquitetura de microsserviços que são dignos de destaque, como:
Assim que o número de microsserviços aumenta, o monitoramento pode tornar-se difícil. A configuração inicial de integração e entrega contínuas (CI/CD) pode ser difícil, dado que você precisará lidar com a complexidade adicional de ter toda essa variedade de microsserviços;
Complexidade. Os microsserviços exigiriam mais coordenação, especialmente quando várias equipes estão envolvidas. Os microsserviços também introduziriam mais chamadas de rede nos casos em que há a necessidade de interagir com outros microsserviços, que não estariam presentes em um aplicativo monolítico. Não seria tão simples quanto implantar uma instância de um aplicativo. Outras coisas que você também precisará considerar são: como gerenciar a comunicação entre microsserviços, lidar com erros para evitar a interrupção de outros microsserviços e adicionar mais casos de teste em cada componente;
Identificação e rastreamento dos bugs e erros em seu aplicativo. Esse processo seria mais fácil se o seu microsserviço tiver apenas uma rota, mas se um microsserviço se comunicar com vários outros microsserviços, grande parte do seu tempo pode ser consumida apenas na procura desse erro;
O roteamento de seus microsserviços será mais trabalhoso. Você precisará dedicar algum tempo para configurar e controlar o fluxo de seus microsserviços. Também precisará monitorar as versões de seus microsserviços e lidar com seu roteamento;
Roteamento de microsserviços
É possível que os microsserviços consumam mais recursos em comparação com um aplicativo monolítico. Embora uma das vantagens que mencionei se refira à escalabilidade e ao uso melhor e mais eficiente dos recursos, cada componente precisaria de sua própria instância e contêiner, potencialmente acarretando um uso maior de memória e CPU.
Ferramentas que podem servir de ajuda com microsserviços
Kubernetes é uma plataforma de orquestração de contêineres que permite implantar, dimensionar e gerenciar todos os seus contêineres. A plataforma possibilita que você automatize a implantação de seus microsserviços em contêineres. Isso facilita o gerenciamento de todos os componentes e microsserviços do seu aplicativo. É necessário aprender a usar o Docker para armazenar seus microsserviços em contêineres. A IBM tem uma oferta pública com o IBM Cloud Kubernetes Service que gerencia o cluster para você.
O Istio aborda algumas das desvantagens dos microsserviços. É uma malha de serviços que oferece ainda mais suporte no gerenciamento de seus microsserviços. Pode ser instalado em sobreposição ao Kubernetes, ajudando assim a rastrear e monitorar seus microsserviços. Isso também pode ajudar a rastrear rapidamente os erros e bugs em seu aplicativo, caso existam. O Istio também é capaz de gerenciar o tráfego de seus microsserviços, como no gerenciamento e controle do fluxo ­– suas rotas podem ser facilmente configuradas. Além disso, fornece segurança em seus microsserviços, através, por exemplo, de TLS mútuo ou limitação do acesso a serviços externos. Você também pode instalar o Istio no IBM Cloud Kubernetes Service.
Na minha experiência, utilizar uma plataforma de orquestração de contêineres é essencial na construção de seu aplicativo com microsserviços. O Kubernetes é uma das escolhas populares entre desenvolvedores, dado que leva rapidamente seu aplicativo do desenvolvimento à produção. E, melhor ainda, é de código aberto!
Para os desenvolvedores que estão começando a construir seus aplicativos, é preciso decidir se seria benéfico usar uma arquitetura de microsserviços em vez de uma monolítica. É preciso considerar a usabilidade e escalabilidade a longo prazo de seu aplicativo. Não há problema em começar com uma arquitetura monolítica, porém uma vez que o aplicativo cresce em tamanho, fica mais difícil sua decomposição em microsserviços. Nesse caso, seria mais vantajoso já começar com microsserviços na fase inicial de desenvolvimento. Para aplicativos monolíticos já existentes, os desenvolvedores devem considerar como e quais componentes eles separariam em seu aplicativo.
Apesar das desvantagens, os microsserviços continuam populares entre desenvolvedores e empresas, pois são muito vantajosos em relação às demandas de aplicativos e usuários. Através da flexibilidade que proporcionam, os desenvolvedores e empresas podem alcançar um desenvolvimento ou atualizações de maneira rápida em seus aplicativos, uma vez que contem com o nível certo de microsserviços.