O que é e como funciona o Cloud Native
Tags: cloud, azure, architecture
Published: 2023-03-04 23:16:27


Cloud Native é uma abordagem que permite construir software escalável, resiliente e de alta disponibilidade. Essa abordagem faz uso de tecnologias e princípios de computação em nuvem como arquitetura de microsserviços, containerização e DevOps para permitir uma rápida entrega de novas features e serviços para o usuário final. No entanto, aplicações Cloud Native não são simplesmente sistemas antigos migrados para a nuvem (Cloud Based) e sim novas aplicações e sistemas que foram desenvolvidas para a nuvem, aproveitando todas as vantagens que as plataformas de serviços Cloud oferecem. 

## Fundamentos
Muitas tecnologias são utilizadas no desenvolvimento de aplicações Cloud Native no entanto alguns conceitos são essenciais para o melhor entendimento da abordagem. Do ponto de vista computacional temos, principalmente, funções e containers. De uma perspectiva arquitetural, temos a arquitetura de microsserviços. A seguir abordarei esses temas de maneira resumida e por fim indicarei algumas fontes que podem ser úteis no processo de aprendizagem.
### Containers

> Containers são tecnologias que permitem que você isole aplicações em tempo de execução. São como pacotes prontos com todos os arquivos necessários para a aplicação rodar.

_Tradução livre de Red Hat: Understanding Linux Containers_

No diagrama abaixo podemos observar um exemplo de arquitetura de containers utilizando a ferramenta Docker.

![Arquitetura de containers](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0csgodvmeos0dn443jsr.png)
_Adaptado de: [GeekFlare](https://geekflare.com/docker-architecture/)_

#### Benefícios
* Produtividade: Criar imagens de aplicações e iniciar containers com elas é muito mais rápido do que criar máquinas virtuais para rodar as aplicações.

* Deploy independente: Utilizando containers (mais especificamente na arquitetura de microsserviços) você poderá fazer o deploy individual de certos serviços da sua aplicação o que melhora também a manutenibilidade das aplicações.

* Escalabilidade e otimização: Devido a habilidades dos containers de iniciar e parar em questão de segundos eles se tornam muito escaláveis pois podem reagir a mudanças de carga e necessidade de um sistema. Esse benefício geralmente é aproveitado com plataformas de orquestração de containers como, por exemplo, Kubernetes.

* Portabilidade: A famosa frase "Mas na minha máquina funciona" já não é mais tão importante. Como containers possuem todas as dependências necessárias para rodar um software acaba se criando um cenário agnóstico e independente para o software.  

#### Desvantagens
* Não é pra tudo: Nem todas as aplicações necessitam de containerização e algumas podem até ser prejudicadas por ela. Monolitos, por exemplo, não tem a necessidade de escalabilidade de imediato e portanto a containerização desses poderia significar um atraso na produção.

* Baixa isolação: Os containers compartilham um Kernel único e portanto se esse ficar suscetível a vírus, todos os outros serão afetados. O contrário ocorre com virtual machines, elas possuem isolação e uma não é afetada por um vírus na outra, por exemplo.

### Serverless Computing
> Serverless é um modelo de desenvolvimento de aplicações que permite que desenvolvedores criem e rodem aplicações sem precisar provisionar ou administrar servidores ou infraestrutura de backend.

_Tradução livre de IBM: What is serverless?_

É importante notar que, apesar da tradução de serverless ser "sem servidores" não é, de fato, isso. O nome serve para representar a interação que o desenvolvedor tem com servidores: nenhuma.

Atualmente, a maioria das plataformas de serviços em cloud oferecem soluções serverless:
* AWS (Amazon Web Services) – AWS Lambda
* Microsoft Azure – Azure Functions
* GCP (Google Cloud Platform) – Google Cloud Functions
* IBM Cloud – IBM Cloud Code Engine

Esses são somente alguns exemplos de serviços serverless, os exemplos acima se encaixam em FaaS (Functions-as-a-service) no entanto existem outros serviços que também são serverless porém não FaaS como por exemplo Azure Container Instances (ACI) e Azure SF Mesh.

Abaixo uma tabela para comparação de functions (funções) com containerized services (serviços containerizados).

|FaaS (Function-as-a-service)|Serviços em Container|
|---|---|
|Faz somente uma coisa| Faz mais de uma coisa|
|Não pode fazer deploy de dependências| Pode fazer deploy de dependências|
|Precisa responder a um único tipo evento| Pode responder a mais de um tipo de evento|

### Microsserviços

> A arquitetura de microsserviços permite que uma grande aplicação seja dividida em partes menores e independentes, cada uma com sua responsabilidade. 

_Tradução livre de Google Cloud: What is Microservices Architecture?_

![Exemplo arquitetura microsserviços](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k6l3f44axgx00fz5o26d.png)
_Adaptado de: Cloud native: Using containers, functions, and data to build next-generation applications_

#### Características
Abaixo estão disponíveis algumas características da Arquitetura de Microsserviços, todas as informações abaixo foram retiradas das minhas anotações pessoais de quando fiz o curso Microservices Architecture – The Complete Guide do instrutor Memi Lavi e traduzidas. O link para o curso está disponível nas referências desse artigo.

##### Componentização de serviços
* Design modular é sempre uma boa ideia pois você pode realizar mudanças específicas ao invés de mudar uma grande quantidade de código. 
* Componentes são partes que em conjunto compõem o software.
* Modularidade pode ser atingida utilizando:

Bibliotecas: chamadas diretamente dentro do processo
Serviços: chamados por mecanismos fora do processo (API Web, RPC)

##### Por que usar serviços?
* Deploy independente, usar serviços ao invés de bibliotecas faz com que seja possível realizar o deploy de somente uma parte da aplicação. Se todo o processo é uma biblioteca nós teriamos que fazer o deploy da aplicação inteira novamente (o que seria mais próximo de um monolito do que de microsserviços).
* Interface bem definida pois o componente deve ser pensado e arquitetado para exatamente o que deve fazer.

##### Decentralização
Em projetos tradicionais quase sempre há um padrão para tudo:
* Linguagem
* Bancos de Dados
* Criação de logs

Com arquitetura de microsserviços cada equipe pode fazer suas próprias decisões, baseando-se no que será melhor para aquele serviço específico.

#### Automatização de Infraestrutura
Na arquitetura de Microsserviços a automatização é essencial.
* Ciclos curtos de desenvolvimento são necessários.
* Teste e deploy não devem ser feitos manualmente.
* Muitas ferramentas para automatização: Azure DevOps, GitHub Actions, Jenkins etc.
Design for Failure
* Muitos processos e muito tráfego em redes então muita coisa pode dar errado.
* O código deve sempre assumir a falha e lidar com ela de maneira elegante.
* Observabilidade com logs, tracing é essencial.

## Arquitetura Cloud Native
Abaixo um diagrama da arquitetura Cloud Native para referência.
 
![Diagrama arquitetura cloud native](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s1ombtnsrjr9qegi002i.png)
_Adaptado de: [Alibaba Cloud ](https://www.alibabacloud.com/blog/what-is-cloud-native-and-how-to-design-cloud-native-architecture_597249)_

### Infraestrutura
A camada de infraestrutura é um elemento crucial na computação em nuvem. Ela se refere à infraestrutura física fornecida pelos provedores de serviços em nuvem, que oferecem todo o hardware necessário para a implantação de uma aplicação. Embora o hardware possa não ser visível para o usuário final, ele é vendido como um serviço, conhecido como Infrastructure-as-a-service (IaaS). Essa camada de infraestrutura fornece aos usuários acesso a recursos computacionais escaláveis, como servidores, armazenamento e redes, sem que eles precisem investir em hardware físico e infraestrutura de data center. 

### Orquestração

> Orquestração de Containers automatiza o provisionamento, implantação, networking, escalabilidade, disponibilidade e gestão do ciclo de vida de containers.

_Tradução livre de IBM: What is container orchestration?_
	
Existem diversas plataformas de orquestração de containers como Kubernetes, Docker Swarm e Apache Mesos. Nesse momento, a abordagem será feita pensando especificamente em Kubernetes.

Para compreender melhor o conceito de orquestração de containers é mais fácil pensar sobre o problema que essa tecnologia resolve: Uma empresa possui um software grande e complexo, cada serviço é um container e esse software deve ter alta disponibilidade, sempre que um container cair ou parar outro deve ser iniciado no lugar. Esse é o problema resolvido por Kubernetes, controlar esse comportamento.

Algumas vantagens de utilizar Kubernetes:
* Balanceamento de carga
* Gerenciamento de configuração e secrets
* Autocorreção
* Manutenção de escalabilidade automática

### Middleware
A camada (layer) de Middleware é uma camada intermediária entre as aplicações e a infraestrutura. Abaixo alguns exemplos que podem facilitar o entendimento:
* Bancos de Dados (JDBC, Hibernate, ODBC)
* Cache (Redis, Memcached)
* Mensageria (Apache Kafka, RabbitMQ)
* Servidores de Aplicação (Apache TomCat, Jboss, Websphere)

### Service Mesh

> Uma service mesh, como o projeto open source Istio, é uma forma de controlar como diferentes partes de uma aplicação partilham dados entre si. Ao contrário de outros sistemas de gestão desta comunicação, uma service mesh é uma camada de infraestrutura dedicada construída diretamente numa aplicação. Esta camada visível de infraestrutura pode documentar quão bem (ou não) diferentes partes de uma aplicação interagem, pelo que se torna mais fácil otimizar a comunicação e evitar downtime à medida que uma aplicação cresce.

_Tradução livre de Red Hat: What's a service mesh?_	

Essa pode parecer uma explicação complexa a primeira vista porém é mais simples do que parece. Na arquitetura de microsserviços que, como já comentamos, é importante no desenvolvimento de aplicações cloud native, cada serviço vai exercer somente a sua função. No entanto, por vezes, é possível que um serviço esteja exercendo mais do que a sua função pré-definida e por isso pode se adicionar a camada de service mesh. Ela será responsável por adicionar observabilidade, controle de tráfego e segurança nas suas aplicações, funcionando como um sidecar.

## Princípios Cloud Native
Irei abordar 4 dos princípios essenciais de Cloud Native, no entanto é importante notar que existem muitos outros que podem sim ser levados em consideração visto que ainda é um tema em constante discussão e avanço e, portanto, suscetível a mudanças.
### Automação

A automação é cada vez mais essencial em sistemas modernos. Ela vem com o objetivo de reduzir o impacto de tarefas repetitivas em implantação, configuração e gerenciamento de aplicações. A automação ajuda a manter a consistência e a segurança do ambiente e permite que desenvolvedores foquem em outras áreas.
### Escalabilidade
Possivelmente uma das palavras mais utilizadas nos dias de hoje: escalabilidade. Ela permite que os sistemas se ajustem dinamicamente às demandas em tempo real, como aumento ou diminuição do tráfego em uma aplicação. Para atender a esse requisito, os containers e orquestradores de containers oferecem soluções eficientes para escalar as aplicações. No Kubernetes, por exemplo, é possível usar o Horizontal Pod Autoscaler (HPA) e o Vertical Pod Autoscaler (VPA) para escalar horizontal e verticalmente, respectivamente.
### Resiliência
A resiliência é particularmente importante visto que aplicações em cloud são distribuídas estão em ambientes dinâmicos e instáveis. Tendo isso em mente, é necessário que as aplicações sejam projetadas para lidar com falhas e se recuperar rapidamente. As aplicações devem ser capazes de lidar com interrupções de serviços, falha de infraestrutura e problemas de rede. Portanto, se fazem também necessárias soluções de observabilidade para que seja possível detectar qualquer problema rapidamente.
### Segurança
Segurança é um aspecto crucial de aplicações cloud native. É necessário garantir criptografia, controle de acesso e também monitorar atividades suspeitas. Os grandes provedores de cloud já oferecem soluções robustas para a segurança. Abaixo estão listadas algumas das soluções da Azure para referência:

* Azure Security Center: Recomendações de segurança
* Azure Active Directory: Autenticação e gerenciamento de acesso
* Azure DDoS Protection: Proteção contra ataques de negação de serviços distribuídos
* Azure Firewall: Proteção das redes virtuais
* Azure Information Protection: Proteção de dados confidenciais

## Conclusão
Esse artigo tratou sobre ferramentas atreladas ao cloud native, arquitetura de microsserviços, computação em nuvem serverless e princípios e arquitetura de uma aplicação cloud native. Espero que tenha sido de alguma ajuda à alguém interessado no tema. Todas as referências estão listadas abaixo para consulta.
 
## Referências
Scholl, B., Swanson, T., Jausovec, P. (2019). Cloud native: Using containers, functions, and data to build next-generation applications. O'Reilly.
Microsoft Azure. Disponível em: https://azure.microsoft.com/en-us/. Acesso em: 03 mar. 2023.
Red Hat: Understanding Containers. Understanding Containers. Disponível em: https://www.redhat.com/en/topics/containers. Acesso em: 03 mar. 2023.
IBM Developer: The true benefits of moving to containers. Disponível em: https://developer.ibm.com/articles/true-benefits-of-moving-to-containers-1/. Acesso em: 03 mar. 2023.
Red Hat: What is container orchestration? Disponível em: https://www.redhat.com/en/topics/containers/what-is-container-orchestration. Acesso em: 04 mar. 2023.
Red Hat: What is a service mesh? 2023. Disponível em: https://www.redhat.com/en/topics/microservices/what-is-a-service-mesh. Acesso em: 04 mar. 2023.
IBM: Cloud Native Principles. Disponível em: https://www.ibm.com/cloud/architecture/architecture/practices/cloud-native-principles/. Acesso em: 04 mar. 2023.
Lavi, M. (2023). Microservices Architecture - The Complete Guide. Udemy
Imagem de capa disponível em: https://pixabay.com/illustrations/cloud-computing-technology-network-4246668/