Módulo 6 · Engenharia de Software · ES06 · Aula 9 de 10
Boas Práticas para
Arquiteturas SOA na Nuvem
O essencial para o serviço não cair: rodar em qualquer lugar, sobreviver a falhas e proteger configs
📜 12-Factor (a ideia)
♻️ Idempotência
⚡ Circuit Breaker
🐳 Containers
🚪 API Gateway
🔐 Configs seguras
DAILY · 15 MIN
15:00
⚙️ Como está o backend do projeto?
⚠️ 1 coisa que pode derrubar o serviço
🚧 1 bloqueio que estou enfrentando
🤝 Preciso de ajuda?
Cada aluno em 1 minuto · começamos em ordem alfabética
Autoestudos · Pré-aula 📚
3 tarefas individuais para chegar pronto + leituras sugeridas
📖
Tarefa 1 · Leitura
Material da Aula 9
Leitura do material com o vocabulário do dia: 12-factor (a ideia), idempotência, retry, circuit breaker e configs seguras.
📖 Material da aula
📜
Tarefa 2 · Estudo
12-Factor App (PT-BR)
Ler a introdução e 3 fatores que mais chamarem atenção. Anotar 1 que o backend do projeto já cumpre e 1 que ainda não cumpre.
Abrir 12factor.net ↗
🔍
Tarefa 3 · Análise
Mapear 1 chamada externa
No backend do projeto, escolha 1 chamada de rede e responda: o que acontece se ela falhar? E se a tela tentar de novo? Anote no caderno.
📓 Caderno de bordo

📚 Leituras sugeridas

📌 Material de chegada: 1 fator OK + 1 fator a melhorar + 1 chamada externa mapeada com cenário de falha. Esses itens alimentam o daily de abertura.

Agenda da Aula
2 horas · 35 min de conceitos + 1h de prática + checkpoint do projeto no fim
⏱️ 35 min
CONCEITOS

☁️ 6 boas práticas essenciais

As ideias que fazem um serviço não cair: 12-factor, idempotência, circuit breaker, containers, API gateway e configs seguras.

  • Linguagem direta, com analogias
  • Conexão com a arquitetura do projeto
  • Foco no que dá para aplicar já
⏱️ 1h + checkpoint
PRÁTICA · GRUPO

📝 cloud-practices.md + demo

Cada grupo escolhe 2 padrões, descreve onde aplica no projeto e atualiza o diagrama. No fim: checkpoint com demo das APIs.

  • Documento curto na pasta docs/
  • Diagrama atualizado · MR no repositório
  • Demo: mandar uma requisição e ver responder

🎯 Saída do dia: arquivo docs/cloud-practices.md + diagrama atualizado via Merge Request, e uma demo funcionando da API do grupo. Não vale ponderada — vale prática boa que ajuda na entrega final.

📜 The 12-Factor App · a ideia central
12 "regrinhas" para um app rodar bem em qualquer lugar (sua máquina, do colega, na nuvem) sem surpresa

🧠 Em 1 frase: um app bem feito não depende de mágica do ambiente — ele lê config de fora, não guarda estado na memória, e qualquer cópia dele faz a mesma coisa. Assim você pode rodar 1 ou 50 cópias sem medo.

⭐ Config
Senha e URL vêm de fora
Variável de ambiente, nunca commitado no código
⭐ Stateless
Não guarda nada na memória
Quem guarda é o banco. Qualquer cópia atende qualquer usuário
⭐ Descartável
Sobe rápido, cai sem drama
Pode ser reiniciado a qualquer hora sem perder dados
⭐ Logs
Log é "tela", não arquivo
O app só imprime; a nuvem coleta e guarda

✅ Por que isso importa pro projeto

Se a API segue essas 4 ideias, ela roda igual na sua máquina e na nuvem — e pode ter várias cópias atendendo ao mesmo tempo sem bagunçar os dados.

🚫 Sinais de que está errado

Senha escrita dentro do código · "só funciona na minha máquina" · o app salva arquivo no próprio disco e some quando reinicia.

♻️ Idempotência · porque toda chamada pode falhar e ser repetida
Na internet, requisições se perdem · a tela tenta de novo · idempotência impede cobrar/reservar 2 vezes

😱 O problema, sem rodeio

O app manda POST /pagamento, o servidor processa, mas a resposta se perde no caminho. O app acha que falhou e tenta de novo. Resultado: 2 cobranças.

Lição: não dá pra confiar em "mandei só uma vez". Toda gravação importante precisa ser idempotente.

🔑 A solução: uma "chave" por pedido

O app gera um código único e manda junto. O servidor guarda (código → resposta). Se vier de novo o mesmo código, ele devolve a resposta antiga sem reprocessar.

Ideia-chave: "repetir o mesmo pedido dá o mesmo resultado" — não soma, não duplica.

⚡ Resiliência · 4 ideias para o sistema sobreviver
Quando um serviço de fora trava ou cai, o seu não pode cair junto · destaque para o Circuit Breaker
Fechado
OK · passa
Tudo normal, chamadas passam. Vai contando as falhas.
Aberto
CORTA NA HORA
Falhou demais? Para de tentar e responde erro na hora.
Testando
1 TENTATIVA
Depois de um tempo, testa 1 chamada. Deu certo → volta ao normal.

🔌 Analogia do disjuntor: assim como o disjuntor da casa "desarma" quando há curto pra não queimar tudo, o circuit breaker para de chamar um serviço que está caindo — e tenta religar sozinho depois.

⏱️ Timeout

Toda chamada tem um limite de espera. Sem isso, 1 serviço lento trava sua tela inteira.

🔁 Retry

Falhou? Tenta de novo, esperando um pouco mais a cada vez. Só funciona com idempotência (slide anterior).

⚡ Circuit Breaker

Para de bater num serviço que já está caído. Devolve erro rápido em vez de travar esperando.

🛟 Isolar (Bulkhead)

Separe os recursos por dependência. Um problema num serviço não afunda os outros (como os compartimentos de um navio).

🐳 Containers · empacotar o app com tudo que ele precisa
Docker resolve o "funciona na minha máquina" · e deixa fácil rodar várias cópias quando a demanda cresce

🐳 O que é um container

  • Uma "caixa" com o app + tudo que ele usa
  • Roda igual na sua máquina e na nuvem
  • Isolado dos outros apps da mesma máquina
  • Acabou o "esqueci de instalar tal coisa"

📈 Escalar = rodar várias cópias

Como cada cópia é igual (lembra do stateless?), a nuvem pode subir 2, 5 ou 20 cópias conforme o número de usuários cresce — e baixar quando esvazia.

Um "porteiro" (load balancer) divide os pedidos entre as cópias.

💡 Na prática: docker build cria a caixa, docker run liga ela. A mesma caixa que roda na sua máquina é a que vai pra nuvem — zero surpresa.

🚪 API Gateway · a porta de entrada do sistema
Uma única porta entre o app (celular/web) e os serviços de trás · concentra segurança e roteamento

🤔 Sem gateway

O app precisa saber o endereço de cada serviço, cuidar de login em cada um, e tratar limites de uso em cada um. Vira bagunça quando o sistema cresce.

Cada serviço exposto = mais portas abertas = mais risco.

✅ Com gateway

O app fala só com uma porta. O gateway confere o login, controla o uso e encaminha pro serviço certo lá de trás.

Os serviços internos ficam escondidos e protegidos.

🚪 O que o gateway faz por você

🔑 Login

Confere o token uma vez, na entrada.

🚦 Limite de uso

Ex.: 100 pedidos/min por usuário.

🧭 Roteamento

/usuarios → serviço de usuários.

🔒 HTTPS

Cuida da criptografia da conexão.

Exemplos reais: AWS API Gateway, Azure API Management, Kong, NGINX. (No projeto, mesmo um backend único já pode centralizar isso.)

🔐 Configs sensíveis · senha NUNCA dentro do código
Senha de banco, chave de API, token... vivem fora do código e entram como variável de ambiente

🚫 O que NÃO fazer

  • Senha escrita direto no código
  • .env com senha enviado pro Git
  • Chave de API colada no repositório
  • Senha compartilhada no chat do grupo

Por quê: qualquer um com acesso ao repo vê tudo — e o histórico do Git guarda pra sempre.

✅ O jeito certo

  • Config vem de variável de ambiente
  • .env fica só na sua máquina (e no .gitignore!)
  • Na nuvem, o provedor injeta os valores
  • Para crescer: usar um "cofre" de segredos

Cofres: AWS Secrets Manager, Azure Key Vault, GCP Secret Manager.

✔️ Checklist rápido do projeto: o .env está no .gitignore? Tem algum .env ou senha já no histórico do Git? Se sim, troque a senha — ela já vazou.

📝 Atividade Prática · cloud-practices.md
Em grupo · 1h · escolher 2 padrões dos 6 vistos hoje · documentar + atualizar o diagrama
PARTE 1
📚

Escolher 2 padrões

Para cada um, em 2 ou 3 frases: o que é (com suas palavras) · onde no projeto faz sentido aplicar.

PARTE 2
🏗️

Atualizar diagrama

Pegar o diagrama de arquitetura da aula 3 e marcar onde cada um dos 2 padrões entra (gateway, container, config...).

PARTE 3
🎯

Ligar com os RNFs

Para cada padrão, qual requisito não funcional ele melhora? Ex.: Circuit Breaker → disponibilidade. Container → portabilidade.

📋 Entrega: arquivo docs/cloud-practices.md + diagrama atualizado, abertos via Merge Request no repositório do grupo.

⭐ Excelência: deixar 1 padrão funcionando de verdade no código — ex.: um timeout ou retry numa chamada externa da API.

🧠 6 padrões disponíveis: 12-Factor · Idempotência · Circuit Breaker · Containers · API Gateway · Configs seguras. Escolher 2.

🛠️
Mão na massa · cloud-practices.md
1h para entregar 2 padrões documentados e o diagrama atualizado. Continua na janela de dev (16h–18h), e fechamos com o checkpoint do projeto.
1️⃣ Em grupo, escolher 2 dos 6 padrões
2️⃣ Criar docs/cloud-practices.md
3️⃣ Para cada padrão: o que é · onde aplica
4️⃣ Atualizar o diagrama da aula 3
5️⃣ Ligar cada padrão a um RNF ✓
6️⃣ ⭐ Deixar 1 padrão rodando de verdade
7️⃣ Abrir MR no repositório do grupo
💡 Estratégia: comece pelos 2 padrões, depois ataque o ⭐ e prepare a demo da API.
🔎
Checkpoint do projeto · roda de conversa
Antes de fechar a aula, cada grupo responde em voz alta — e quem puder, mostra na tela. Sem slide bonito: é o sistema rodando que conta.
🏗️
Como estão as suas arquiteturas?
Mostra o diagrama atual. O que mudou desde a aula 3?
⚙️
Já temos uma versão funcional do sistema?
O que já roda de ponta a ponta? O que ainda falta?
🎯
Como está o modelo de recomendação?
Já recomenda algo? Com base em quê? Está integrado à API?
🔌
Faça a demonstração das suas APIs como serviço
Sobe o serviço aqui, ao vivo. Quais endpoints existem?
📡
Posso mandar uma requisição e ela responde?
Manda um pedido (Postman/curl/tela) e mostra a resposta.
🤝
Onde o grupo está travado?
É aqui que a gente combina os próximos passos juntos.
🎯
A aula 9 me ensinou que...
Boa SOA na nuvem não é mágica de framework — é algumas ideias simples bem aplicadas: rodar em qualquer lugar, sobreviver a falhas, proteger configs. Aula 10 fecha o módulo com monitoramento e logging — pra você enxergar o que está acontecendo.
✅ 12-Factor · a ideia central
✅ Idempotência + retry
✅ Circuit breaker · timeout · isolar
✅ Containers (Docker)
✅ API Gateway · a porta de entrada
✅ Configs seguras
✅ Checkpoint: API rodando de verdade
✅ Ponte para Observabilidade · aula 10
Módulo 6 · Engenharia de Software · Aula 9 de 10