Una aplicació cloud-native no és simplement una aplicació que s'executa al núvol: és una aplicació dissenyada per aprofitar el núvol, és a dir, pensada des del principi per escalar horitzontalment, tolerar fallades, desplegar-se de forma freqüent i automatitzada, i executar-se en entorns dinàmics (contenidors, orquestradors, plataformes gestionades). Per aconseguir-ho, la comunitat ha consolidat una sèrie de patrons i principis provats que eviten reinventar la roda i els errors típics. Aquesta lliçó recull els més importants: la metodologia dels 12 factors, els patrons de contenidors sidecar i ambassador, el patró de migració strangler fig, l'autoescalat i la configuració externalitzada. Dominar-los et permet dissenyar sistemes resilients, portables i operables, que són just les qualitats que el núvol premia.
Contingut
- La metodologia dels 12 factors (resum).
- Patró Sidecar.
- Patró Ambassador.
- Patró Strangler Fig (estrangulador).
- Autoescalat (horitzontal i vertical).
- Configuració externalitzada.
- Errors comuns i consells.
- Exercicis i solucions.
- La metodologia dels 12 factors
The Twelve-Factor App és un conjunt de bones pràctiques per construir aplicacions SaaS portables i escalables. Aquí un resum agrupat:
| # | Factor | En una frase |
|---|---|---|
| 1 | Codi base | Un únic repositori versionat per aplicació |
| 2 | Dependències | Declarades i aïllades explícitament |
| 3 | Configuració | A l'entorn, mai al codi |
| 4 | Serveis de suport | Bases de dades, cues, etc. com a recursos adjunts intercanviables |
| 5 | Construir, alliberar, executar | Etapes separades i estrictes |
| 6 | Processos | L'app s'executa com a processos sense estat |
| 7 | Assignació de ports | El servei s'exposa a través d'un port |
| 8 | Concurrència | Escala mitjançant el model de processos (horitzontal) |
| 9 | Descartabilitat | Arrencada ràpida i aturada elegant |
| 10 | Paritat entre entorns | Desenvolupament, proves i producció el més iguals possible |
| 11 | Registres (logs) | Tractats com a fluxos d'esdeveniments a la sortida estàndard |
| 12 | Processos d'administració | Tasques puntuals com a processos efímers |
Els tres que més impacte tenen en arquitectura cloud-native: (3) configuració a l'entorn (ho veurem en detall), (6) processos sense estat (permet escalar i reemplaçar instàncies lliurement) i (9) descartabilitat (les instàncies han de poder morir i néixer sense drama, base de la resiliència i l'autoescalat).
- Patró Sidecar
El patró sidecar (literalment, el "sidecar" d'una motocicleta) consisteix a desplegar un contenidor auxiliar al costat del contenidor principal de l'aplicació, al mateix Pod, compartint cicle de vida, xarxa i volums. El sidecar afegeix funcionalitat transversal (logging, proxy, seguretat, sincronització) sense modificar l'aplicació principal.
apiVersion: v1
kind: Pod
metadata:
name: app-amb-sidecar
spec:
containers:
- name: aplicacio # contenidor principal
image: lamevaapp:1.0
volumeMounts:
- name: logs
mountPath: /var/log/app
- name: log-shipper # sidecar: envia logs a un sistema central
image: fluentbit:latest
volumeMounts:
- name: logs
mountPath: /var/log/app # comparteix el mateix volum
volumes:
- name: logs
emptyDir: {} # volum compartit entre tots dosExplicació: el Pod té dos contenidors. aplicacio escriu els seus logs a /var/log/app. El sidecar log-shipper (Fluent Bit) llegeix d'aquest mateix volum compartit (emptyDir) i els envia a un sistema central. L'aplicació no sap res de com s'exporten els seus logs: aquesta responsabilitat transversal viu al sidecar. És la base de les service meshes com Istio, on un sidecar proxy gestiona tota la comunicació de xarxa.
- Patró Ambassador
El patró ambassador (ambaixador) és un tipus especial de sidecar que actua com a proxy de sortida: l'aplicació parla amb l'ambaixador com si fos el servei remot, i l'ambaixador s'encarrega dels detalls de la connexió externa (reintents, circuit breaker, xifratge TLS, sharding, monitoratge). Així, l'aplicació se simplifica i la lògica de xarxa es centralitza.
graph LR
APP[Aplicacio] -->|localhost:6379| AMB[Ambaixador / Proxy]
AMB -->|reintents, TLS, routing| EXT[(Servei remot: BD / Cache)]Explicació del diagrama: l'aplicació es connecta sempre a localhost (a l'ambaixador), ignorant on és realment el servei remot. L'ambaixador resol la connexió real, afegeix reintents, xifratge i enrutament. Diferència clau amb el sidecar genèric: el sidecar sol afegir funcions que acompanyen l'app (logging, mètriques); l'ambassador s'especialitza a gestionar les connexions sortints cap a serveis externs.
- Patró Strangler Fig (estrangulador)
El patró strangler fig (figuera estranguladora, per la planta que envolta i reemplaça l'arbre que la sosté) és l'estratègia recomanada per migrar un sistema monolític heretat a microserveis de forma incremental, sense reescriure-ho tot de cop (cosa que seria arriscadíssima). La idea: col·loques un proxy/enrutador davant del monòlit i vas redirigint funcionalitats, una a una, cap a nous serveis, fins que el monòlit queda buit i es retira.
graph TB
USER[Usuari] --> ROUTER[Router / Facana]
ROUTER -->|/pagaments nou| MS[Microservei Pagaments]
ROUTER -->|resta, heretat| MONO[Monolit heretat]Explicació: el router rep tot el trànsit. La funcionalitat de "pagaments" ja s'ha extret a un microservei nou, així que el router envia /pagaments al microservei i tota la resta segueix anant al monòlit. Amb el temps, més rutes migren cap al costat nou fins a buidar el monòlit. Avantatge: migres amb risc controlat, podent revertir cada pas, i lliures valor de forma contínua en lloc d'en una arriscada migració "big bang".
- Autoescalat (autoscaling)
L'autoescalat ajusta automàticament la capacitat segons la demanda. Hi ha dues dimensions:
| Tipus | Què fa | Quan fer-lo servir |
|---|---|---|
| Horitzontal (scale out/in) | Afegeix o treu instàncies/rèpliques | El preferit en cloud-native; requereix apps sense estat |
| Vertical (scale up/down) | Dona més/menys CPU i RAM a una instància | Quan no es pot escalar horitzontalment |
A Kubernetes, el Horizontal Pod Autoscaler (HPA) ajusta el nombre de Pods segons mètriques:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: lamevaapp-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: lamevaapp-deployment # a quin Deployment escala
minReplicas: 2 # mai menys de 2
maxReplicas: 10 # mai mes de 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70 # objectiu: 70% d'us de CPUExplicació: l'HPA vigila el Deployment lamevaapp-deployment. Manté entre 2 i 10 rèpliques i el seu objectiu és que l'ús mitjà de CPU voregi el 70%. Si la CPU puja per sobre, crea més Pods; si baixa, els redueix (sense baixar de 2). Perquè això funcioni, l'aplicació ha de ser sense estat (factor 6 i 9 dels 12 factors): qualsevol rèplica ha de poder atendre qualsevol petició.
- Configuració externalitzada
El factor 3 dels 12 factors diu: la configuració no va al codi. Les credencials, URLs i paràmetres que canvien entre entorns (desenvolupament, proves, producció) s'han d'injectar des de fora, normalment com a variables d'entorn o fitxers muntats. Així, la mateixa imatge immutable es promociona entre entorns canviant només la configuració, i no hi ha secrets hardcodejats al repositori.
A Kubernetes això es fa amb ConfigMap (configuració no sensible) i Secret (dades sensibles):
apiVersion: v1
kind: ConfigMap
metadata:
name: lamevaapp-config
data:
LOG_LEVEL: "info"
FEATURE_NOU_DASHBOARD: "true"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: lamevaapp-deployment
spec:
template:
spec:
containers:
- name: lamevaapp
image: lamevaapp:1.0
envFrom:
- configMapRef:
name: lamevaapp-config # injecta totes les claus com a env vars
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef: # secret, no en text pla al manifest
name: lamevaapp-secret
key: db-passwordExplicació: el ConfigMap guarda paràmetres no sensibles (LOG_LEVEL, feature flags). Al Deployment, envFrom.configMapRef injecta totes les seves claus com a variables d'entorn del contenidor. La contrasenya de base de dades s'obté d'un Secret mitjançant secretKeyRef, de manera que no apareix en text pla al manifest de desplegament. La imatge lamevaapp:1.0 no canvia entre entorns; només canvien el ConfigMap i el Secret. Recorda que els Secret de Kubernetes estan només codificats en base64 per defecte: per a dades veritablement sensibles, convé un gestor de secrets dedicat i validar l'enfocament amb l'equip de seguretat.
Errors Comuns i Consells
- Guardar estat a la instància. Sessions o fitxers en memòria local trenquen l'escalat horitzontal: fes servir emmagatzematge extern (BD, memòria cau, emmagatzematge d'objectes). És el factor 6.
- Configuració hardcodejada o secrets al repositori. Externalitza sempre la configuració. Un secret pujat a Git és un incident de seguretat.
- Migració big bang. Reescriure un monòlit de zero sol acabar malament. Fes servir el patró strangler per migrar de forma incremental i reversible.
- Autoescalar una app amb estat. Si l'app no és stateless, afegir rèpliques no resol la càrrega i pot corrompre dades.
- Abusar de sidecars. Cada sidecar consumeix recursos al Pod; afegeix-los quan aportin valor transversal clar, no per moda.
- No dissenyar per a la descartabilitat. Implementa aturada elegant (atendre el
SIGTERM, tancar connexions) perquè l'escalat i els desplegaments no tallin peticions a mitges.
Exercicis
- Per què el principi "processos sense estat" (factor 6) és un requisit previ perquè l'autoescalat horitzontal funcioni bé?
- El teu equip ha de modernitzar un gran monòlit d'assegurances sense poder aturar el servei. Descriu com aplicaries el patró strangler fig en els primers passos.
- Diferencia amb un exemple el patró sidecar del patró ambassador.
Solucions
- Perquè en escalar horitzontalment el trànsit es reparteix entre moltes rèpliques intercanviables, i qualsevol petició pot caure en qualsevol rèplica. Si una rèplica guardés estat local (la sessió de l'usuari, dades en memòria), les peticions següents del mateix usuari podrien anar a una altra rèplica que no té aquest estat, provocant errors. Amb processos sense estat, totes les rèpliques són equivalents i es poden afegir, treure o reemplaçar lliurement.
- Passos inicials: (1) col·locar un router/façana davant del monòlit que rebi tot el trànsit sense canviar el comportament; (2) triar una funcionalitat acotada i de baix risc (per exemple, consulta d'un catàleg) i extreure-la a un nou servei; (3) configurar el router perquè aquesta ruta vagi al servei nou i la resta segueixi al monòlit; (4) verificar, mesurar i, si tot va bé, repetir amb la funcionalitat següent. Cada pas és reversible.
- Sidecar: contenidor auxiliar que acompanya l'app aportant una funció transversal; exemple, un log-shipper que recull i envia els logs de l'aplicació. Ambassador: sidecar especialitzat que actua de proxy de sortida cap a serveis externs; exemple, un proxy al qual l'app es connecta per
localhosti que gestiona reintents i TLS contra una base de dades remota.
Conclusió
Has recorregut els patrons que defineixen una arquitectura cloud-native: la disciplina dels 12 factors (sense estat, configuració externa, descartabilitat), els sidecars i ambassadors per afegir capacitats sense tocar l'app, el strangler fig per migrar monòlits amb seguretat, l'autoescalat per adaptar-se a la demanda i la configuració externalitzada amb ConfigMaps i Secrets. Tots comparteixen un objectiu: aplicacions resilients, portables i operables. A l'última lliçó del mòdul veurem com crear i gestionar tota aquesta infraestructura de forma reproduïble i versionada amb la Infraestructura com a Codi (IaC).
Curs d'Arquitectura d'Aplicacions
Mòdul 1: Fonaments de l'Arquitectura d'Aplicacions
- Què és l'Arquitectura d'Aplicacions?
- El Rol de l'Arquitecte de Programari
- Atributs de Qualitat i Requisits No Funcionals
- Decisions Arquitectòniques i Compromisos (Trade-offs)
- Documentació d'Arquitectura: Vistes i el Model C4
Mòdul 2: Principis i Tàctiques de Disseny
- Acoblament, Cohesió i Separació de Responsabilitats
- Principis SOLID Aplicats a l'Arquitectura
- DRY, KISS, YAGNI i Altres Principis de Disseny
- Tàctiques Arquitectòniques per als Atributs de Qualitat
- Gestió del Deute Tècnic
Mòdul 3: Estils i Patrons Arquitectònics
- Arquitectura Monolítica
- Arquitectura en Capes (N-Tier)
- Arquitectura Client-Servidor
- Arquitectura Hexagonal (Ports i Adaptadors)
- Arquitectura Neta i Ceba (Clean & Onion)
Mòdul 4: Arquitectures Distribuïdes i Microserveis
- Introducció als Sistemes Distribuïts
- Arquitectura de Microserveis
- Descomposició de Serveis i Bounded Contexts
- API Gateway, Service Discovery i Comunicació entre Serveis
- Patrons de Resiliència: Circuit Breaker, Retry i Bulkhead
- El Teorema CAP i la Consistència de Dades
Mòdul 5: Arquitectures Dirigides per Esdeveniments i Missatgeria
- Fonaments de l'Arquitectura Orientada a Esdeveniments
- Missatgeria Asíncrona: Cues i Brokers
- Patrons d'Esdeveniments: Event Sourcing i CQRS
- Gestió de Transaccions Distribuïdes: Patró Saga
- Streaming de Dades en Temps Real
Mòdul 6: Disseny Dirigit pel Domini (DDD)
- Conceptes Fonamentals del DDD
- Disseny Estratègic: Bounded Contexts i Llenguatge Ubic
- Disseny Tàctic: Entitats, Agregats i Repositoris
- Mapatge de Contextos (Context Mapping)
Mòdul 7: Dades i Persistència
- Estratègies de Persistència: SQL vs NoSQL
- Patrons d'Accés a Dades: Repository, Unit of Work i DAO
- Base de Dades per Servei i Gestió de Dades Distribuïdes
- Cau i Estratègies d'Invalidació
Mòdul 8: Arquitectura al Núvol i Desplegament
- Fonaments del Cloud Computing (IaaS, PaaS, SaaS)
- Contenidors i Orquestració amb Docker i Kubernetes
- Arquitectura Serverless
- Patrons de Disseny Cloud-Native
- Infraestructura com a Codi (IaC)
Mòdul 9: Qualitat, Seguretat i Observabilitat
- Escalabilitat: Horitzontal vs Vertical i Balanceig de Càrrega
- Alta Disponibilitat i Tolerància a Fallades
- Seguretat per Disseny i Autenticació/Autorització
- Observabilitat: Logging, Mètriques i Traçabilitat
- Rendiment i Proves de Càrrega
