Abans d'escriure ni una sola línia de codi, convé tenir clar de què parlem quan diem "microserveis". El terme es fa servir amb tanta lleugeresa que sovint s'aplica a sistemes que no ho són (un monòlit trossejat en diversos processos, per exemple) o es confon amb tecnologies concretes com Docker o Kubernetes. En aquesta primera lliçó fixarem una definició de treball, repassarem les característiques que distingeixen de debò un microservei, entendrem d'on ve aquesta manera de construir programari i acordarem el vocabulari que farem servir durant tot el curs. Tancarem amb un primer cop d'ull, deliberadament senzill, a com es veuria la botiga online de TechCorp dividida en serveis.
Aquesta lliçó és la base conceptual sobre la qual es recolzen totes les altres: aquí no parlarem de si els microserveis són bons o dolents (això arriba a la lliçó següent), ni de com es comparen amb detall amb un monòlit, ni de quan convé adoptar-los. Aquí només responem la pregunta "què és exactament un microservei?".
Contingut
- Què és un microservei (i què no ho és)
- Característiques definitòries
- Breu història: de la SOA als microserveis
- Vocabulari bàsic del curs
- Primer cop d'ull: la botiga de TechCorp dividida en serveis
- Errors comuns i consells
- Exercicis
- Conclusió
- Què és un microservei (i què no ho és)
Una definició de treball, prou precisa per a tot el curs:
Un microservei és un component de programari autònom, que implementa una capacitat de negoci ben delimitada, que es desplega de manera independent, que posseeix les seves pròpies dades i que es comunica amb la resta del sistema únicament a través d'interfícies ben definides (APIs o missatges).
I una arquitectura de microserveis és un sistema compost per diversos d'aquests components que col·laboren entre si per oferir una aplicació completa.
Fixa't que la definició no esmenta cap tecnologia. No diu "contenidors", ni "Kubernetes", ni "REST", ni "Node.js". Totes aquestes eines apareixeran al curs perquè faciliten enormement la feina, però no són el que defineix un microservei. Es poden tenir microserveis sense contenidors i es poden tenir contenidors sense microserveis.
Què NO és un microservei
És tan important saber què no és com saber què és. Aquestes situacions es confonen sovint amb microserveis:
| Situació | Per què no és un microservei |
|---|---|
| Un monòlit executat en diverses rèpliques darrere d'un balancejador | Continua sent una única unitat de desplegament; totes les rèpliques són el mateix codi i comparteixen la mateixa base de dades. |
| Diverses aplicacions que llegeixen i escriuen a la mateixa base de dades | No hi ha autonomia de dades: un canvi d'esquema les afecta totes alhora. És un "monòlit distribuït". |
Un mòdul o paquet dins d'un projecte (per exemple, la carpeta comandes/ del monòlit) |
Un mòdul és una bona pràctica d'organització, però es desplega juntament amb la resta. |
| Una funció serverless aïllada que fa una sola cosa tècnica (redimensionar una imatge) | Pot formar part d'un microservei, però per si sola no modela una capacitat de negoci completa. |
| Un servei "compartit" del qual tothom depèn per funcionar (per exemple, un servei d'"entitats comunes") | Trenca l'autonomia: si cau, cau tot; si canvia, cal coordinar tothom. |
Una regla pràctica: si no pots desplegar el component sense coordinar-te amb un altre equip, o si no pots canviar-ne l'esquema de dades sense avisar ningú més, probablement no tens un microservei, sinó un tros d'alguna cosa més gran.
El prefix "micro"
El "micro" no fa referència a línies de codi. No hi ha cap xifra màgica ("menys de 500 línies"). Es refereix al fet que el servei té un abast funcional petit i ben definit: fa una cosa de negoci i la fa completa. Un servei de pagaments pot tenir milers de línies i continuar sent un microservei perfectament raonable; el que importa és que la seva responsabilitat és clara i que s'hi pot raonar sense haver d'entendre tot el sistema.
- Característiques definitòries
Les set característiques següents són les que, juntes, distingeixen un microservei. Quan avaluïs un sistema, pregunta't quantes en compleix realment.
2.1 Autonomia
El servei pot funcionar, canviar i evolucionar per si mateix. Té el seu propi codi, el seu propi cicle de vida i les seves pròpies decisions internes. L'autonomia és la característica arrel de la qual deriven gairebé totes les altres.
2.2 Desplegament independent
Cada servei es construeix, es prova i es posa en producció per separat, sense necessitat de desplegar la resta del sistema. Si l'equip de Pagaments corregeix un error, puja una nova versió de servei-pagaments i ningú més no se n'assabenta. Això exigeix que les interfícies entre serveis siguin estables i estiguin versionades (ho veurem al mòdul 3).
2.3 Modelatge al voltant de capacitats de negoci
Els serveis es divideixen seguint el negoci, no les capes tècniques. A TechCorp parlem de "catàleg", "comandes" o "pagaments", no de "servei de base de dades", "servei de lògica" i "servei d'interfície". Un servei conté tot el que necessita per complir la seva capacitat: la seva API, la seva lògica i el seu emmagatzematge.
Aquesta és una diferència important respecte de les arquitectures per capes on se separava "el back-end de dades" del "back-end de negoci": allà una funcionalitat nova obligava a tocar totes les capes i a coordinar tots els equips.
2.4 Dades descentralitzades
Cada servei és propietari exclusiu de les seves dades. Ningú més no llegeix ni escriu directament a la seva base de dades; si un altre servei necessita aquesta informació, la demana a través de l'API o la rep mitjançant esdeveniments. A TechCorp, el catàleg viurà a MongoDB i les comandes al seu propi PostgreSQL, i servei-comandes no farà mai un SELECT sobre la col·lecció de productes.
Aquesta característica és la més costosa de complir quan es ve d'un monòlit, i li dedicarem una lliçó sencera al mòdul 2.
2.5 Comunicació mitjançant APIs lleugeres
Els serveis es comuniquen a través de la xarxa fent servir protocols senzills i ben coneguts: normalment HTTP/REST per a peticions síncrones i missatgeria (en el nostre cas RabbitMQ) per a esdeveniments asíncrons. La intel·ligència és als serveis, no a la infraestructura de comunicació. Se sol resumir amb la frase smart endpoints, dumb pipes ("extrems intel·ligents, canonades ximples").
2.6 Propietat per equips
Un servei pertany a un equip que el dissenya, el construeix, el desplega i l'opera ("you build it, you run it"). Aquest equip és responsable que funcioni en producció. A TechCorp, l'equip del Luis serà propietari de servei-comandes de cap a cap.
2.7 Automatització
Amb molts serveis petits és inviable fer desplegaments a mà. Els microserveis pressuposen integració i desplegament continus, infraestructura com a codi, proves automatitzades i monitoratge. Sense automatització, l'arquitectura no escala operativament.
Resum visual
mindmap
root((Microservei))
Autonomia
Codi propi
Cicle de vida propi
Desplegament independent
Sense coordinar-se amb altres
Capacitat de negoci
Catàleg, Comandes, Pagaments...
Dades descentralitzades
Una BD per servei
APIs lleugeres
REST
Esdeveniments
Propietat per equips
You build it, you run it
Automatització
CI/CD
Observabilitat
- Breu història: de la SOA als microserveis
Els microserveis no van aparèixer del no-res. Són l'evolució d'idees anteriors, corregides per l'experiència.
L'era del monòlit i la SOA
Als anys 2000, les aplicacions empresarials es construïen majoritàriament com a monòlits: una única aplicació gran desplegada en un servidor d'aplicacions. A mesura que creixien, es tornaven difícils de mantenir i d'escalar.
Com a resposta va sorgir la SOA (Service-Oriented Architecture, arquitectura orientada a serveis). La idea era bona: dividir el sistema en serveis reutilitzables. Però la implementació habitual tenia problemes:
- Els serveis es comunicaven a través d'un ESB (Enterprise Service Bus), una peça central que encaminava, transformava i orquestrava missatges. L'ESB va acabar sent un coll d'ampolla tècnic i organitzatiu: tota la intel·ligència era allà.
- Els protocols (SOAP, WS-*) eren pesants i verbosos.
- Els serveis solien compartir bases de dades i desplegar-se de manera coordinada.
- La governança era molt centralitzada: comitès que decidien quins serveis existien i com eren.
El naixement dels microserveis
Cap al 2011-2014, empreses com Netflix, Amazon o SoundCloud van començar a explicar públicament com havien dividit els seus sistemes en serveis molt petits, autònoms, amb equips propis i comunicació per HTTP. El 2014, James Lewis i Martin Fowler van publicar l'article que va popularitzar el terme i va fixar les característiques que hem vist a l'apartat anterior.
Diversos factors van fer possible aquest enfocament en aquell moment:
| Factor | Què va aportar |
|---|---|
| Núvol públic (AWS i similars) | Crear i destruir servidors en minuts, pagant per ús. |
| Contenidors (Docker, 2013) | Empaquetar cada servei amb les seves dependències de manera reproduïble. |
| Orquestradors (Kubernetes, 2014) | Gestionar centenars de contenidors automàticament. |
| Cultura DevOps i lliurament continu | Automatitzar construcció, proves i desplegament. |
| APIs REST/JSON | Comunicació lleugera i universal enfront de SOAP/XML. |
| Domain-Driven Design | Eines per dividir el negoci en contextos ben delimitats. |
En cert sentit, els microserveis són "SOA ben feta": mantenen la idea de serveis però eliminen l'ESB centralitzat, els protocols pesants, la base de dades compartida i la governança rígida.
timeline
title Evolució cap als microserveis
2000-2005 : Monòlits en servidors d'aplicacions
2005-2010 : SOA amb ESB, SOAP i governança centralitzada
2011-2013 : Netflix, Amazon i altres publiquen les seves experiències
: Docker (2013)
2014 : Article de Lewis i Fowler
: Kubernetes (2014)
2015-avui : Adopció generalitzada, service mesh, observabilitat
- Vocabulari bàsic del curs
Al llarg del curs farem servir aquests termes constantment. Aquí només en donem definicions breus; cadascun es desenvoluparà a la lliçó corresponent.
| Terme | Definició breu | Exemple a TechCorp |
|---|---|---|
| Servei | Component autònom que implementa una capacitat de negoci i es desplega per separat. | servei-comandes |
| Instància | Un procés en execució d'un servei. Un servei pot tenir diverses instàncies iguals per repartir càrrega. | Tres rèpliques de servei-cataleg per Black Friday |
| API | Conjunt d'operacions que un servei exposa a d'altres (normalment sobre HTTP). | POST /comandes, GET /comandes/{id} |
| Contracte | Descripció formal i estable d'una API o d'un missatge: rutes, camps, tipus, errors. És el que permet que serveis diferents evolucionin sense trencar-se. | Especificació OpenAPI de servei-comandes |
| Esdeveniment | Missatge que anuncia que alguna cosa ha passat en un servei, publicat perquè d'altres hi reaccionin sense acoblar-s'hi. | comanda.creada, pagament.confirmat |
| Broker de missatges | Infraestructura que rep esdeveniments dels productors i els lliura als consumidors. | RabbitMQ |
| Gateway (API Gateway) | Punt d'entrada únic per als clients externs, que encamina cada petició al servei adequat i centralitza aspectes comuns (autenticació, límits d'ús). | El gateway al port 8080 |
| Orquestrador | Plataforma que desplega, escala, reinicia i connecta les instàncies dels serveis en un clúster de màquines. | Kubernetes |
| Contenidor | Paquet executable que inclou el servei i totes les seves dependències, aïllat de la resta de la màquina. | Imatge Docker de servei-pagaments |
| Observabilitat | Capacitat d'entendre què està passant dins del sistema a partir de les seves sortides: mètriques, logs i traces. | Prometheus, Grafana, Loki, Jaeger |
| Traça distribuïda | Registre del recorregut complet d'una petició a través de diversos serveis. | Veure que "crear comanda" va trigar 800 ms i 600 ms van ser a pagaments |
No cal memoritzar la taula: l'anirem fent servir i ampliant. L'important és que, quan aparegui un d'aquests termes, sàpigues a quina família pertany.
- Primer cop d'ull: la botiga de TechCorp dividida en serveis
TechCorp és l'empresa fictícia que ens acompanyarà durant tot el curs. Opera una botiga online que avui és un únic monòlit en Node.js amb Express i una sola base de dades PostgreSQL. La presentarem amb detall a la lliçó 01-05; de moment, vegem únicament quin aspecte tindria el punt d'arribada: la botiga descomposta en serveis.
flowchart LR
Client[Navegador / App mòbil]
GW[API Gateway<br/>:8080]
subgraph Serveis de TechCorp
CLI[servei-clients<br/>:3004]
CAT[servei-cataleg<br/>:3001]
INV[servei-inventari<br/>:3006]
COM[servei-comandes<br/>:3002]
PAG[servei-pagaments<br/>:3003]
NOT[servei-notificacions<br/>:3005]
end
MQ[(RabbitMQ<br/>esdeveniments)]
Client --> GW
GW --> CLI
GW --> CAT
GW --> COM
COM -. publica comanda.creada .-> MQ
MQ -. consumeix .-> INV
MQ -. consumeix .-> PAG
MQ -. consumeix .-> NOT
Observa diverses coses al diagrama:
- El client no parla directament amb els serveis, sinó amb el gateway. Els serveis interns ni tan sols necessiten ser accessibles des d'Internet.
- Cada servei correspon a una capacitat de negoci: clients, catàleg, inventari, comandes, pagaments, notificacions. No hi ha cap "servei de base de dades" ni cap "servei de lògica".
- Hi ha dos estils de comunicació: fletxes contínues (peticions síncrones, HTTP) i fletxes discontínues (esdeveniments asíncrons a través de RabbitMQ). Quan es crea una comanda,
servei-comandesno crida un per un inventari, pagaments i notificacions: publica un esdeveniment i cada interessat hi reacciona. - Cada servei té el seu propi port perquè és un procés independent. Al mòdul 4 els aixecarem de debò.
Què exposa un servei: dos endpoints d'exemple
Perquè la idea d'"API" deixi de ser abstracta, així es veuria (en pseudo-HTTP, sense implementar) una part mínima del que servei-comandes ofereix a la resta del món.
Crear una comanda:
POST /comandes
Content-Type: application/json
{
"clientId": "c-1024",
"linies": [
{ "producteId": "p-501", "quantitat": 2 },
{ "producteId": "p-777", "quantitat": 1 }
]
}
--- Resposta ---
201 Created
Location: /comandes/com-88213
{
"comandaId": "com-88213",
"estat": "PENDENT",
"total": 149.90
}Consultar una comanda:
GET /comandes/com-88213
--- Resposta ---
200 OK
{
"comandaId": "com-88213",
"clientId": "c-1024",
"estat": "CONFIRMADA",
"linies": [
{ "producteId": "p-501", "quantitat": 2, "preuUnitari": 49.95 },
{ "producteId": "p-777", "quantitat": 1, "preuUnitari": 50.00 }
],
"total": 149.90
}Fixa't en el que no apareix en aquests exemples: no hi ha res sobre com es desa la comanda, quina base de dades fa servir el servei, ni com es calcula el total. Qui consumeix l'API només coneix el contracte: la ruta, el format d'entrada i el format de sortida. Aquesta opacitat és precisament el que permet que l'equip del Luis canviï les tripes de servei-comandes quan vulgui sense trencar res a ningú.
També convé notar que la comanda es crea amb estat PENDENT i més tard apareix com a CONFIRMADA. Entremig han passat coses en altres serveis (reservar estoc, cobrar) de les quals el consumidor no s'assabenta directament. Aquest flux, "un client fa una comanda", és el fil conductor de tot el curs i l'esmicolarem a la lliçó 01-05.
Errors Comuns i Consells
- Confondre l'eina amb l'arquitectura. Fer servir Docker i Kubernetes no converteix un sistema en microserveis. Pregunta't per les set característiques, no per l'stack.
- Pensar que "micro" vol dir diminut. Serveis excessivament petits (de vegades anomenats nanoserveis) multipliquen la comunicació i el cost operatiu sense aportar autonomia real. La mida correcta la dicta la capacitat de negoci, no un límit de línies.
- Dividir per capes tècniques. Un "servei d'accés a dades" i un "servei de lògica" no són microserveis; són un monòlit partit per la meitat que obliga a desplegar-los tots dos alhora.
- Compartir la base de dades "només al principi". És la manera més habitual d'acabar amb un monòlit distribuït. Si dos serveis comparteixen taules, a la pràctica en són un.
- Ignorar la part organitzativa. La propietat per equips i l'automatització no són detalls opcionals; sense elles l'arquitectura no s'aguanta. Ho veurem amb més detall a la lliçó 01-04.
- Consell: quan llegeixis sobre un sistema "de microserveis", intenta identificar quina és la seva unitat de desplegament i qui és propietari de cada dada. Aquestes dues preguntes desmunten la majoria de les afirmacions falses.
Exercicis
Exercici 1: És o no és un microservei?
Per a cada situació, indica si descriu un microservei i justifica-ho amb almenys una de les set característiques.
- TechCorp desplega el seu monòlit actual en quatre servidors idèntics darrere d'un balancejador de càrrega.
- L'equip de Màrqueting crea una petita aplicació independent en Python que gestiona cupons, amb la seva pròpia base de dades, la seva pròpia API REST i el seu propi pipeline de desplegament.
- L'equip de Comandes extreu la lògica de comandes a un procés Node.js separat, però aquest continua llegint i escrivint directament a les taules
productesiclientsde la base de dades del monòlit.
Exercici 2: Vocabulari en context
Relaciona cada frase amb el terme del vocabulari que descriu:
- a) "Quan es confirma un pagament, es publica un missatge perquè qui ho necessiti hi reaccioni."
- b) "Per Black Friday aixequem vuit còpies del servei de catàleg."
- c) "Totes les peticions de l'app mòbil entren pel mateix lloc, que decideix a quin servei enviar-les."
- d) "Documentem les rutes, camps i codis d'error de l'API de comandes i ens comprometem a no trencar-los."
- e) "Podem veure que la petició va passar per tres serveis i en quin es va perdre el temps."
Exercici 3: Dissenyar un contracte mínim
Seguint l'estil dels exemples de pseudo-HTTP de la lliçó, escriu dos endpoints que podria exposar servei-cataleg: un per consultar un producte pel seu identificador i un altre per llistar productes filtrant per categoria. Indica mètode, ruta, un exemple de resposta i el codi d'estat. No implementis res; només es tracta de pensar en el contracte.
Solucions
Exercici 1
- No. És el mateix monòlit replicat. La unitat de desplegament continua sent una (falla el desplegament independent) i totes les rèpliques comparteixen codi i base de dades (falla la descentralització de dades).
- Sí. Compleix autonomia, desplegament independent, capacitat de negoci pròpia (cupons), dades pròpies i API lleugera. A més, il·lustra l'heterogeneïtat tecnològica: pot estar en Python encara que la resta sigui Node.js.
- No (encara). Tot i que és un procés separat, accedeix directament a dades d'altres àrees. És un monòlit distribuït en miniatura: qualsevol canvi a
productesoclientspot trencar aquest procés, i viceversa. Per ser un microservei hauria d'obtenir aquesta informació a través de les APIs o esdeveniments de catàleg i clients.
Exercici 2
- a) Esdeveniment (i per extensió, broker de missatges).
- b) Instància (diverses instàncies del mateix servei).
- c) Gateway (API Gateway).
- d) Contracte.
- e) Traça distribuïda (observabilitat).
Exercici 3 (una solució possible)
GET /productes/p-501
--- Resposta ---
200 OK
{
"producteId": "p-501",
"nom": "Auriculars sense fil TC-Pro",
"categoria": "audio",
"preu": 49.95,
"actiu": true
}GET /productes?categoria=audio&pagina=1&mida=20
--- Resposta ---
200 OK
{
"pagina": 1,
"total": 87,
"productes": [
{ "producteId": "p-501", "nom": "Auriculars sense fil TC-Pro", "preu": 49.95 },
{ "producteId": "p-777", "nom": "Altaveu portàtil TC-Mini", "preu": 50.00 }
]
}Punts a valorar: rutes basades en substantius (/productes), ús de GET per a consultes, filtres per query string, resposta amb paginació i un 404 Not Found (no mostrat) si el producte no existeix. Tot el que fa referència al bon disseny REST es desenvolupa a la lliçó 03-01.
Conclusió
En aquesta lliçó hem establert la definició de treball de microservei: un component autònom, centrat en una capacitat de negoci, desplegable per separat, propietari de les seves dades i que es comunica per interfícies lleugeres. Hem vist que les set característiques (autonomia, desplegament independent, modelatge per capacitat de negoci, dades descentralitzades, APIs lleugeres, propietat per equips i automatització) són les que distingeixen un microservei, i que cap tecnologia concreta no el defineix. Hem situat la idea en el seu context històric, com a correcció dels errors de la SOA clàssica, i hem fixat el vocabulari que farem servir d'ara endavant. Finalment, hem fet un primer cop d'ull al mapa de serveis de TechCorp i al que significa que un servei "exposi una API".
Amb aquests fonaments, la lliçó següent aborda la pregunta que tothom es fa a continuació: què es guanya i què es paga en adoptar aquesta arquitectura? Veurem els avantatges i els desavantatges dels microserveis il·lustrats amb situacions concretes de TechCorp.
Curs de Microserveis
Mòdul 1: Introducció als Microserveis
- Conceptes Bàsics de Microserveis
- Avantatges i Desavantatges dels Microserveis
- Comparació amb l'Arquitectura Monolítica
- Quan Adoptar Microserveis: Criteris de Decisió
- El Cas Pràctic del Curs: la Botiga Online de TechCorp
Mòdul 2: Disseny de Microserveis
- Principis de Disseny de Microserveis
- Descomposició d'Aplicacions Monolítiques
- Definició de Bounded Contexts
- Gestió de Dades: una Base de Dades per Servei
- Consistència Distribuïda: Sagues, CQRS i Event Sourcing
Mòdul 3: Comunicació entre Microserveis
- APIs RESTful
- Missatgeria Asíncrona
- Protocols de Comunicació: gRPC, GraphQL
- API Gateway i Backend for Frontend
- Descobriment de Serveis i Balanceig de Càrrega
- Contractes i Versionat d'APIs
Mòdul 4: Implementació de Microserveis
- Elecció de Tecnologies i Eines
- Desenvolupament d'un Microservei Simple
- Gestió de Configuració
- Integració Pràctica: Consumir APIs i Publicar Esdeveniments
- Proves en Microserveis: Unitàries, d'Integració i de Contracte
Mòdul 5: Desplegament i Orquestració
- Contenidors i Docker
- Orquestració amb Kubernetes
- CI/CD per a Microserveis
- Estratègies de Desplegament: Rolling, Blue-Green i Canary
- Service Mesh: Istio i Linkerd
Mòdul 6: Monitoratge i Manteniment
- Monitoratge i Logging
- Traçabilitat Distribuïda amb OpenTelemetry
- Gestió d'Errors i Recuperació
- Escalabilitat i Rendiment
- SLOs, Alertes i Gestió d'Incidents
Mòdul 7: Seguretat en Microserveis
- Autenticació i Autorització
- Seguretat en la Comunicació
- Pràctiques de Seguretat
- Seguretat en Contenidors i Kubernetes
