https://www.google.com/url?
sa=i&url=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FWebAssembly&psig=AOvVaw01ph2uPKCm79kmbF
AW&ust=1594860562007000&source=images&cd=vfe&ved=0CAIQjRxqFwoTCOCK-
dyEzuoCFQAAAAAdAAAAABAD
Desenvolvendo aplicações
Cloud Native em Go
Alvaro Viebrantz


Google Developer Expe
rt
for IoT and Founding Engineer at golioth.io


aviebrantz.com


@alvaroviebrantz
O que são aplicações


Cloud Native ?
“Tecnologias Cloud Native ajudam empresas a construir e rodar
aplicações escaláveis em ambientes dinâmicos como nuvens públicas,
privadas e híbridas.”




“Essas técnicas permitem desenvolver sistemas altamente desacoplados,
que são resilientes, gerenciáveis e observáveis.”


Cloud Native Foundation


www.cncf.io/about/who-we-are/
Cloud Native
Alguns atributos chave
• Construir e Rodar


• Empacotar aplicações de tal forma que possam rodar em qualquer
lugar


• Escaláveis e Resilientes


• Rodar múltiplas instâncias e sem muitas perdas se cair


• Uso de Recursos em Nuvem


• Conceitos que são intercambiáveis entre nuvens


• Observáveis


• Como minha aplicação se comporta ? Quais as métricas ? Onde são os
gargalos ? Está tudo rodando ?
Demo
Disponível em:


github.com/alvarowolfx/cloud-native-go
Demo
Exemplo de ponta a ponta
Demo
Exemplo de ponta a ponta
• Webserver


• Upload de arquivo via HTTP


• Salva em blob storage, publica em
fi
la de mensagens


• Aplicação Worker


• Consome
fi
la de mensageria


• Processa arquivo e salva em um Document Store


• Ambas aplicações geram métricas e tracing
Empacotando aplicações


Cloud Native
Empacotando aplicações
Como distribuir aplicações em um ambiente Cloud Native
• Containers


• Open Containers Initiative (OCI)


• Docker, CRI-O, containerd


• Apps em Go podem ser compiladas em um binário único


• Multi-stage image build


• Podemos usar imagens base mínimas


• Buildpacks
10
Docker
fi
le
Receita de bolo do seu app
11
Multi-stage build
Reduzindo o tamanho da imagem
“Ah mas no Heroku não


precisava de tudo isso”
github.com/GoogleCloudPlatform/buildpacks
Cloud Native Buildpacks
Algumas receitas já prontas de como empacotar algumas aplicações.
Onde usar Cloud Native Buildpacks ?
Ambiente de CI remoto se bene
fi
ciam disso
• Imagens e Pacotes em Cache


• Zero con
fi
guração


• Detecção automática de linguagem
Google Cloud Build
Google Container/Artifact Build
15
Comparativo
Tamanho e tempo de compilação diferentes
Primitivas em Nuvem
Go Cloud Development Kit
Captura as principais primitivas em Nuvem
• Permite desenvolver aplicações que vão ser publicadas em nuvem com
menos dor de cabeça


• Não ter que lidar Autenticação, Autorização, setup de SDK, etc


• Tem fallbacks para rodar local, sem precisar apontar pra ambiente em
nuvem ou depender dele


• Portabilidade


• Interface idiomáticas e comuns


• Quase como um database/sql para a nuvem


• Drivers plugáveis
gocloud.dev/
Go Cloud Development Kit
Baseado em URL e schemas registrados
gocloud.dev/
Go Cloud Development Kit
Baseado em URL e schemas registrados
Blob Storage
Upload/Download/Gerenciamento de arquivos
• Não guarde arquivos em banco


• Suporta vários provedores


• AWS S3


• E sistemas que suportam S3 API - Minio, Ceph, SeaweedFS, etc


• Google Cloud Storage


• Azure Blob Storage


• inMem


• Filesystem local
gocloud.dev/
Blob Storage
Exemplo Upload e Download de arquivos
Fila de Mensageria
Uma das primitivas mais importantes para escalar
• Desacoplar diferentes serviços


• Comunicação assíncrona


• Suporta vários provedores


• Kafka


• NATS


• RabbitMQ


• AWS SQS


• Google Cloud PubSub


• inMem
gocloud.dev/
Fila de Mensageria
Exemplo de publish/subscribe
Document Store
Acesso a bancos NoSQL orientados a documento
• Poucos sistemas se bene
fi
ciam de abstrações de múltiplos bancos


• Mas para uso básico facilita bastante, principalmente para testes
locais


• Um pouco limitado pela abstração


• Suporta vários provedores


• AWS DynamoDB


• Firebase/Google Firestore


• Azure CosmosDB


• MongoDB


• inMem gocloud.dev/
SQL Databases
Acesso a bancos SQL
• Normalmente requerem passos a mais


• Requisitos de segurança


• Proxy de Autenticação


• Certi
fi
cados


• Suporta MySQL e Postgres em diferentes provedores


• Google Cloud Cloud PostgreSQL e MySQL


• Azure Database for MySQL


• AWS RDS PostgreSQL e MySQL
gocloud.dev/
Monitoramento e


Observabilidade
“Monitoramento são ferramentas ou soluções técnicas que permitem a um


time olhar e entender o estado do seus sistemas.


É baseado na coleta de logs e métricas pré de
fi
nidos.


“Observabilidade são ferramentas ou soluções técnicas que permitem a um


time depurar seus sistemas ativamente.


É baseado em explorar propriedades e padrões não de
fi
nidos à priori.”


DevOps Research and Assessment (DORA)


cloud.google.com/architecture/devops/devops-measurement-monitoring-and-observability
Monitoramento e Observabilidade
Ver o que está acontecendo na aplicação
• Tópicos chave que vamos ver


• Logs


• Health Checks


• Métricas


• Tracing


• Podem ser alinhados com objetivos da empresa


• Ferramentas que ajudam a melhorar a saúde e performance do sistema


• Diagnóstico de problemas


• Planejar capacidade e recursos
Logs
Coleta Logs
Ainda existem muito nuances ao lidar com logs
• Logs estruturados


• Adicionar mais contexto aos logs


• Facilmente parseável por diferentes ferramentas - Preferencialmente use JSON


• Bibliotecas em Go


• https://github.com/Sirupsen/logrus, https://github.com/uber-go/zap, https://
github.com/apex/log
Logs estruturados
Exemplo com a github.com/apex/log
Logs estruturados
Exemplo com a github.com/apex/log
Use ferramentas de coleta de logs
Tire a responsabilidade da sua aplicação
• Pode requerer muitos recursos


• Coletores de log


• Grafana Promtail, Fluentbit, Logstash, etc


• Armazenamento de Logs


• Elasticsearch, Grafana Loki, Google Cloud Stackdriver, AWS Cloud Watch, etc


• Visualização


• Kibana, Grafana, etc
Use ferramentas de coleta de logs
Exemplo com FluentBit + Loki + Grafana
Health Checks
Health Checks
Como saber se sua aplicação está de pé
• Readiness e Liveness


• Kubernetes usa para saber se um Pod está pronto e/ou com
problemas


• Geralmente são feitos via HTTP em um endpoint /healthz


• É importante checar outras coisas


• Ping no banco de dados


• Ping em algum serviço externo que a aplicação depende


• API’s externas por exemplo


• Não apenas por motivos de alerta


• Escalabilidade e estar pronta para receber mais carga de trabalho
Health Checks
Exemplo com a Go CDK
Métricas e Tracing
Métricas e Tracing
Exemplos de atributos que podem ser capturados
• Uso de recursos - Memória, CPU, Go Routines, Trafego de rede


• Quantas requisições minha aplicação aguenta ?


• Quando levantar novas instancias e quando reduzir ?


• Quais partes do sistema demoram mais tempo ?


• Banco de dados


• Acesso a API externa
Open Telemetry
Padronização de métricas e tracing em aplicações
• Conjunto de API, bibliotecas e ferramentas para adicionar
monitoramento e observabilidade na sua aplicação


• União dos projetos Open Census e Open Tracing


• Atualmente engloba


• Metrics


• Tracing


• Logs no futuro
Open Telemetry no seu app
Como disponibilizar metricas e tracing ?
• Exporters o
fi
ciais em Go


• OTLP - Open Telemetry Protocol - Metrics e Tracing


• Prometheus - Metrics


• Jaeger - Tracing
Open Telemetry Collector
Coletor uni
fi
cado de métricas e tracing
Open Telemetry Go
Criando métricas na API
Open Telemetry Go
Criando métricas no Worker
Open Telemetry Go
Criando iniciando tracing e spans
Open Telemetry Contrib
Bibliotecas disponíveis em Go
• github.com/open-telemetry/opentelemetry-go-contrib


• Instrumentação


• Coleta de métricas e tracing de forma automática


• MongoDB, Cassandra


• net/http, gorilla/mux, gRPC


• SQLCommenter


• Adicionar comentários a consulta SQL


para monitorar performance
Instrumentando MongoDB
Usando biblioteca da open-telemetry-go-contrib
Open Telemetry Registry
Outras bibliotecas disponíveis em Go
• opentelemetry.io/registry


• Mais Instrumentações e Exporters
Arquitetura da nossa aplicação
Como dados são exportados
Exemplo de Metrics com Prometheus
Monitorando o uso da aplicação
Exemplo de Tracing com Jaeger
Analisando quais chamadas podem precisar de melhorias
Demo
Disponível em:


github.com/alvarowolfx/cloud-native-go
Demo
Exemplo de ponta a ponta
Obrigado




aviebrantz.com


youtube.com/alvaroviebrantz


twitch.tv/alvaroviebrantz


Alvaro Viebrantz


Google Developer Expe
rt
for IoT and Founding Engineer at golioth.io


aviebrantz.com


@alvaroviebrantz

Construindo aplicações Cloud Native em Go