El mòdul 3 va acabar amb una frase honesta: encara no existeix el codi d'un servei complet. Abans d'escriure'l cal prendre una decisió que condiciona tota la resta: amb què es construeixen els serveis de TechCorp. En un monòlit aquesta decisió es pren un cop i per sempre; en microserveis es pot prendre servei per servei, i aquesta llibertat és alhora el gran avantatge i la gran font de caos. En aquesta lliçó fixem els criteris d'elecció, recorrem el panorama de tecnologies per categoria, prenem les decisions concretes de TechCorp (amb la regla de la Marta de les dues bases de dades com a exemple de "llibertat amb límits") i preparem el terreny pràctic: la plantilla de servei, la llibreria @techcorp/comu-http, les eines de desenvolupament local i l'organització dels repositoris. Tot el que es decideix aquí ho farem servir, tal qual, en les quatre lliçons següents.
Contingut
- Criteris d'elecció per a un microservei
- Llenguatges i frameworks
- Bases de dades i memòria cau
- Brokers de missatges, configuració, contenidors, CI/CD, observabilitat i proves
- Heterogeneïtat amb criteri: políglota, però amb llista curta
- La plantilla de servei i la llibreria
@techcorp/comu-http - Eines de desenvolupament local
- Monorepo o multirepo: l'organització del codi
- Criteris d'elecció per a un microservei
Triar tecnologia per a un microservei no és el mateix que triar-la per a una aplicació monolítica. Un monòlit arrenca un cop al dia i ocupa un servidor; un microservei es replica, es reinicia sovint (desplegaments, autoescalat, reprogramació de pods) i conviu amb dotzenes de veïns al mateix clúster. Això canvia el pes de cada criteri:
| Criteri | Què mesura | Per què pesa més en microserveis |
|---|---|---|
| Maduresa i ecosistema | Anys d'ús en producció, llibreries per a HTTP, BD, AMQP, OpenTelemetry, proves | Cada servei necessita totes les peces de la llista; una mancança es multiplica pel nombre de serveis |
| Coneixement de l'equip | Quantes persones poden escriure, revisar i operar codi en aquesta tecnologia | Amb ~25 tècnics, un servei en un llenguatge que només coneix una persona és un risc de continuïtat |
| Rendiment | Peticions per segon per rèplica, latència p99 | Importa, però menys del que sembla: 3.000 comandes/dia no exigeixen Go; els pics ×20 (01-05) tampoc |
| Temps d'arrencada | Segons des de docker run fins a /health/ready |
Amb rolling updates i autoescalat (05-04, 06-04) una arrencada de 40 s retarda cada desplegament i cada escalat |
| Consum de memòria | MB en repòs per rèplica | Deu serveis × tres rèpliques × 512 MB és un node sencer; a Kubernetes la memòria es paga per rèplica |
| Suport de contenidors | Mida de la imatge, imatges oficials, comportament davant de SIGTERM | Un procés que ignora SIGTERM perd peticions a cada desplegament (ho veurem a 04-02) |
| Observabilitat | Instrumentació de logs estructurats, mètriques Prometheus i traces OpenTelemetry disponible i estable | Sense això, depurar un flux que travessa cinc serveis (mòdul 6) és impossible |
| Velocitat de desenvolupament | Quant costa un endpoint nou, un consumidor nou | En la migració incremental (01-05) es crearan set serveis en pocs mesos |
Un consell de mètode: puntueu els criteris abans de mirar tecnologies. Si l'equip primer tria la tecnologia que li agrada i després busca criteris que la justifiquin, la taula no serveix de res.
- Llenguatges i frameworks
Panorama de les opcions habituals per a serveis HTTP + esdeveniments (valors orientatius per a un servei petit amb un endpoint i un consumidor):
| Tecnologia | Arrencada | Memòria en repòs | Rendiment | Ecosistema microserveis | Corba per a l'equip de TechCorp |
|---|---|---|---|---|---|
| Node.js 20 + Express | < 1 s | ~40-60 MB | Mitjà-alt (E/S asíncrona) | Excel·lent: pg, mongodb, amqplib, pino, OpenTelemetry, Jest |
Cap: és el llenguatge del monòlit |
| Node.js + Fastify | < 1 s | ~40-60 MB | Alt (2-3× Express en benchmarks) | Excel·lent; validació JSON Schema integrada | Baixa: mateix llenguatge, API diferent |
| Node.js + NestJS | 1-2 s | ~70-100 MB | Mitjà-alt | Molt bo; opinat (mòduls, DI, decoradors) | Mitjana: TypeScript + estructura pròpia |
| Java + Spring Boot | 5-15 s | ~250-400 MB | Alt | El més complet (Spring Cloud) | Alta: ningú de TechCorp programa en Java |
| Java + Quarkus / Micronaut | < 1 s (natiu) / 2-3 s (JVM) | ~50-150 MB | Alt | Molt bo; dissenyat per a contenidors | Alta |
| Go (net/http, Gin, Echo) | < 100 ms | ~10-20 MB | Molt alt | Bo; binari únic, imatges de 10-20 MB | Mitjana-alta: dues persones de Plataforma el coneixen |
| Python + FastAPI | 1-2 s | ~50-80 MB | Mitjà | Bo; tipat amb Pydantic, OpenAPI automàtic | Mitjana: el fa servir l'equip de dades |
| .NET 8 (Minimal APIs) | 1-2 s | ~60-100 MB | Alt | Molt bo | Alta: sense experiència a l'empresa |
Lectures de la taula:
- No hi ha una opció "correcta": Spring Boot és una elecció excel·lent en una empresa Java, i pèssima a TechCorp, on ningú el coneix i l'arrencada de 10 s complicaria l'autoescalat.
- Node.js i Go són els dos extrems habituals de "lleuger": Node per productivitat i ecosistema, Go per consum i rendiment. Moltes empreses fan servir tots dos: Node per a serveis de negoci, Go per a peces d'infraestructura o d'alt trànsit.
- Express, Fastify o NestJS és una decisió menor comparada amb la de llenguatge. Express és el més conegut i el que ja fa servir el monòlit; Fastify és més ràpid i porta validació; NestJS imposa estructura (útil en equips grans, un llast en equips petits). Com que el rendiment no és el coll d'ampolla de TechCorp i el monòlit ja és Express, el cost de canviar no compensa avui.
Decisió de TechCorp (la Marta i els quatre equips, reunió d'arquitectura): Node.js 20 LTS + Express en JavaScript per a tots els serveis de la primera onada. Es deixa escrit que Go és la segona tecnologia aprovada per a serveis amb requisits de rendiment o de consum (candidat: un futur servei de cerca del catàleg), i que TypeScript es valorarà quan el primer servei sigui en producció. La justificació en una frase: "el risc del projecte és a l'arquitectura distribuïda, no al llenguatge; no hi sumem una segona corba d'aprenentatge".
- Bases de dades i memòria cau
Aquí el mòdul 2 ja va fer la feina feixuga (02-04): base de dades per servei, PostgreSQL per a comandes, clients, pagaments i inventari; MongoDB per al catàleg. El que afegeix aquesta lliçó és el criteri general i el paper de la memòria cau:
| Tecnologia | Model | Quan triar-la en un microservei | Quan no |
|---|---|---|---|
| PostgreSQL | Relacional, transaccions ACID, JSONB | Agregats amb invariants (Comanda, Reserva, Pagament), necessitat de transacció local (outbox, esdeveniments_processats), consultes amb filtres combinats |
Documents amb estructura molt variable i sense relacions (es pot fer, amb JSONB, però MongoDB és més natural) |
| MongoDB | Documental, esquema flexible | Documents autocontinguts i heterogenis (fitxes de producte amb atributs diferents per categoria), lectura per id o per pocs índexs |
Transaccions entre col·leccions freqüents, invariants fortes (existeixen transaccions multidocument, però són senyal que el model no és documental) |
| Redis | Clau-valor en memòria, TTL, estructures (llistes, sets, sorted sets) | Memòria cau de lectures costoses (resposta de GET /v1/productes?ids=), comptadors, rate limiting del gateway (03-04), sessions |
Com a base de dades principal d'un agregat de negoci: és memòria; la persistència és opcional i les garanties, diferents |
| Altres (Cassandra, DynamoDB, Elasticsearch...) | Columnar, clau-valor gestionat, cerca | Volums o casos d'ús específics (cerca de text lliure, sèries temporals) | Abans de tenir el problema que resolen |
Sobre Redis convé una precisió: la memòria cau no compta com una base de dades més a efectes de la regla de la Marta ("màxim dues tecnologies de base de dades", 02-04) perquè no guarda la veritat de cap agregat; si Redis es buida, el sistema continua funcionant, més lent. Tot i això, TechCorp encara no l'introdueix: Cache-Control: max-age=30 a Catàleg (03-01) cobreix la necessitat actual. S'apunta com a candidat per a 06-04 (rendiment).
- Brokers de missatges, configuració, contenidors, CI/CD, observabilitat i proves
La resta de categories de l'stack ja té lliçó pròpia en aquest curs; aquí només el mapa i la decisió, perquè vegis el conjunt d'una sola vegada.
Brokers de missatges (detall a 03-02):
| Broker | Model | Punt fort | Quan triar-lo |
|---|---|---|---|
| RabbitMQ | Cues AMQP, exchanges, encaminament flexible, DLQ nativa | Semàntica de cua clara, eines madures, fàcil d'operar a escala mitjana | Esdeveniments de negoci i comandaments, volums de milers a centenars de milers de missatges/dia |
| Apache Kafka | Log particionat i persistent, consumidors que rellegeixen | Volum massiu, replay, streaming | Milions d'esdeveniments/dia, analítica en temps real, event sourcing |
| NATS / JetStream | Molt lleuger, pub-sub, cues amb JetStream | Latència mínima, operació senzilla | Comunicació interna en clústers grans, IoT |
Decisió: RabbitMQ, ja presa a 03-02, per volum (3.000 comandes/dia), per la DLQ nativa i per la topologia de cues per consumidor que vam definir.
Gestió de configuració (detall a 04-03): variables d'entorn com a interfície universal; ConfigMaps i Secrets de Kubernetes com a font en producció; Consul KV / Vault / Spring Cloud Config com a opcions centralitzades quan hi ha desenes de serveis amb configuració compartida. TechCorp: variables d'entorn, i punt.
Contenidors i orquestració (mòdul 5): Docker per construir imatges; Kubernetes per executar-les en producció; alternatives com Nomad, ECS o Cloud Run tenen sentit en contextos concrets. TechCorp: Docker + Kubernetes; en local, Docker Compose. Tots els serveis d'aquest mòdul es contenidoritzaran a 05-01, i per això els escrivim des del principi perquè arrenquin de pressa, llegeixin la configuració de l'entorn i morin netament amb SIGTERM.
CI/CD (05-03): GitHub Actions (el codi de TechCorp és a GitHub), GitLab CI i Jenkins són equivalents en capacitat; l'elecció la dicta on viu el codi.
Observabilitat (mòdul 6): logs amb pino en JSON → Loki; mètriques amb prom-client → Prometheus + Grafana; traces amb OpenTelemetry → Jaeger. L'alternativa clàssica és ELK (Elasticsearch, Logstash, Kibana). En aquest mòdul només farem servir pino com a logger mínim.
Proves (04-05): Jest o Vitest com a runner, Supertest per provar Express sense obrir port, Testcontainers per aixecar PostgreSQL/RabbitMQ reals a les proves d'integració, Pact per a contractes entre consumidor i proveïdor.
- Heterogeneïtat amb criteri: políglota, però amb llista curta
Un dels arguments de venda dels microserveis (01-02) és la llibertat tecnològica: cada equip tria el millor per al seu problema. L'experiència diu que aquesta llibertat, sense límits, produeix això al cap de dos anys: set llenguatges, quatre bases de dades, dos brokers, i un servei crític en Elixir que ningú sap tocar perquè qui el va escriure ha marxat. El cost no és a l'escriure, sinó a l'operar: cada tecnologia necessita imatges base, plantilles de CI, dashboards, alertes, guies de seguretat i persones de guàrdia que la entenguin.
La resposta madura no és prohibir l'heterogeneïtat, sinó governar-la:
flowchart LR
A[L'equip vol fer servir<br/>la tecnologia X] --> B{És a la<br/>llista aprovada?}
B -- Sí --> C[Endavant: plantilla,<br/>CI i observabilitat ja existeixen]
B -- No --> D{Resol un problema<br/>que la llista no resol?}
D -- No --> E[Es fa servir l'aprovada]
D -- Sí --> F[Proposta al comitè<br/>d'arquitectura: pilot acotat]
F --> G{El pilot justifica<br/>el cost operatiu?}
G -- Sí --> H[Entra a la llista:<br/>Plataforma crea plantilla i suport]
G -- No --> E
La llista curta aprovada de TechCorp, tal com la publica l'equip de Plataforma al seu repositori:
| Categoria | Aprovat avui | Aprovat amb justificació | Fora |
|---|---|---|---|
| Llenguatge/framework | Node.js 20 LTS + Express (JavaScript) | Go (alt rendiment/consum); TypeScript (després del primer servei en producció) | Qualsevol altre sense passar pel comitè |
| Base de dades | PostgreSQL 16 | MongoDB 7 (només Catàleg de moment) | Una tercera tecnologia: regla de la Marta, màxim dues |
| Memòria cau | — | Redis (quan 06-04 ho justifiqui) | — |
| Broker | RabbitMQ | — | Kafka mentre el volum no ho exigeixi |
| Contenidors | Docker + Kubernetes | — | — |
| Observabilitat | pino + Prometheus/Grafana/Loki + OpenTelemetry/Jaeger | — | ELK en paral·lel |
Fixa't en el detall de la regla de la Marta: no és "PostgreSQL i res més", és "dues tecnologies", cosa que va donar cabuda a MongoDB allà on el seu model encaixa (02-04) i alhora tanca la porta a una tercera. Aquest és l'esperit de la llista curta: llibertat real dins d'un perímetre que Plataforma pot sostenir.
- La plantilla de servei i la llibreria
@techcorp/comu-http
@techcorp/comu-httpAmb set serveis en la mateixa tecnologia, el que es repeteix convé resoldre-ho un sol cop, i hi ha dos mecanismes diferents per fer-ho que no s'han de confondre:
6.1 La plantilla de servei (arquetip)
És un repositori d'exemple (techcorp/plantilla-servei-node) que es copia en crear un servei nou. Conté l'estructura de carpetes, el package.json amb les dependències i els scripts acordats, el Dockerfile (05-01), el workflow de CI (05-03), la configuració d'eslint, un .env.exemple i un servei d'exemple amb /health/live i /health/ready que arrenca a la primera. Una plantilla es copia i després cada servei evoluciona pel seu compte: no hi ha acoblament, i per això pot contenir opinions (estructura de carpetes, noms d'scripts). A 04-02 construirem servei-cataleg des de zero precisament per entendre el que la plantilla donaria fet.
6.2 La llibreria @techcorp/comu-http
És un paquet npm versionat, publicat al registre privat de TechCorp, que cada servei declara com a dependència ("@techcorp/comu-http": "^1.2.0") i actualitza quan li convé. Ja l'hem anat esmentant des de 02-02; ara en fixem el contingut:
| Exporta | Què fa | On es va definir |
|---|---|---|
crearLogger({ servei }) |
Un logger pino en JSON amb els camps comuns (servei, nivell, hora, requestId) |
Aquí; format complet a 06-01 |
middlewareRequestId() |
Llegeix X-Request-Id o en genera un (req-<ulid>), el posa a req.id, a la resposta i al logger de la petició |
03-01 (correlació) |
respondreProblema(res, req, problema) |
Format RFC 7807 application/problem+json amb codi i instance |
03-01 |
middlewareErrors({ logger }) |
Últim middleware d'Express: converteix excepcions en problem+json (500 genèric o el codi de negoci) |
04-02 |
crearRutesSalut({ comprovacions }) |
/health/live i /health/ready amb timeout d'1 s per dependència i 503 durant l'aturada |
03-05 |
ErrorNegoci(codi, missatge, status) |
Classe base d'errors de domini (CLIENT_NO_EXISTEIX, PRODUCTE_NO_DISPONIBLE...) que el middleware sap traduir |
04-02 |
missatgeria/topologia (connectar, declararCuaConsumidor) i missatgeria/publicador (construirSobre, publicarEsdeveniment) |
Topologia RabbitMQ i sobre estàndard | 03-02 |
I, tan important com el que conté, el que no conté:
processarUnCopno és a la llibreria. Depèn de la base de dades de cada servei (taulaesdeveniments_processatsa PostgreSQL a Comandes; a Catàleg, si algun dia consumeix esdeveniments, seria una col·lecció de MongoDB). Posar-ho a la llibreria obligaria la llibreria a conèixerpgimongodb, i arrossegaria tots els serveis a la mateixa versió del driver. Cada servei ho implementa (són 15 línies) sobre la seva pròpia BD.- Cap model de negoci. Ni
Comanda, niProducte, ni validacions de negoci. Una llibreria amb lògica de domini compartida és el monòlit distribuït de 02-01: un canvi aComandaobligaria a redesplegar-ho tot. - Cap client d'un altre servei.
catalegClient.jsviu a Comandes, no a la llibreria: és Comandes qui decideix què necessita de Catàleg i amb quin timeout. - Cap configuració concreta. La llibreria no sap quina URL té Catàleg; rep valors.
La regla per decidir: si en canviar aquesta peça s'haurien de redesplegar diversos serveis alhora, no ha de ser a la llibreria. Tot el que hi ha a @techcorp/comu-http és tècnic, estable i opcional d'actualitzar.
- Eines de desenvolupament local
Un desenvolupador de TechCorp ha de poder arrencar el seu servei al portàtil, amb les dependències reals (una base de dades, RabbitMQ) i sense aixecar els altres sis serveis. La caixa d'eines acordada:
| Eina | Per a què | Nota |
|---|---|---|
Node.js 20 LTS (via nvm o fnm) |
Executar els serveis; mateixa versió major que la imatge de producció | .nvmrc amb 20 a cada repositori |
| npm | Dependències i scripts (npm run dev, npm test) |
Es fa servir npm ci a CI per respectar package-lock.json |
| nodemon | Reiniciar el servei en desar un fitxer en desenvolupament | Només devDependencies; en producció, node src/servidor.js |
| Docker Desktop / Podman | Aixecar PostgreSQL, MongoDB i RabbitMQ locals amb un docker run o un docker compose up |
El servei s'executa amb Node al portàtil; en contenidor només les dependències (05-01 farà el pas següent) |
| curl / HTTPie / Postman | Provar endpoints a mà | En aquest curs fem servir curl perquè els exemples es puguin copiar |
| VS Code + extensió REST Client | Fitxers .http versionats al costat del servei amb les peticions d'exemple |
Substitueix les col·leccions de Postman fora del repositori |
RabbitMQ Management (http://localhost:15672) |
Veure cues, missatges, DLQ | Ve amb la imatge rabbitmq:3-management |
| psql / mongosh | Inspeccionar dades | També serveixen les extensions de l'IDE |
Exemple de dependències locals, tal com les arrencarà cada lliçó d'aquest mòdul (una línia per a cadascuna; el docker compose complet és de 05-01):
# MongoDB per a servei-cataleg (04-02)
docker run -d --name mongo-cataleg -p 27017:27017 mongo:7
# PostgreSQL per a servei-comandes (04-04). Contrasenya fictícia només per a desenvolupament.
docker run -d --name pg-comandes -p 5432:5432 -e POSTGRES_USER=svc_comandes \
-e POSTGRES_PASSWORD=dev-comandes -e POSTGRES_DB=comandes postgres:16
# RabbitMQ amb consola d'administració (04-04)
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-managementAmb això, la variable COMANDES_DB_URL de 03-05 val en local postgres://svc_comandes:dev-comandes@localhost:5432/comandes i RABBITMQ_URL val amqp://localhost:5672. Els mateixos noms de variable, valors diferents per entorn: exactament el mecanisme que 04-03 formalitzarà.
- Monorepo o multirepo: l'organització del codi
Última decisió abans d'escriure codi: on viu cada servei.
| Aspecte | Monorepo (un repositori per a tot) | Multirepo (un repositori per servei) |
|---|---|---|
| Canvis que toquen diversos serveis | Un sol commit i una sola PR | Diverses PR coordinades |
| Autonomia dels equips | Menor: permisos, CI i convencions compartides | Màxima: cada equip decideix la seva CI, el seu ritme, els seus revisors |
| Desplegament independent | Possible, però cal evitar que un canvi a A dispari el pipeline de B (filtres per ruta) | Natural: cada repositori té el seu pipeline |
| Llibreries compartides | S'importen per ruta; sempre en l'última versió | Es publiquen en un registre i cada servei tria versió |
| Eines necessàries | Nx, Turborepo, Bazel o similars a partir d'una certa mida | Cap d'especial; sí una plantilla per no divergir |
| Risc típic | Que la comoditat de tocar-ho tot alhora recreï el monòlit | Que es dupliquin utilitats i que les convencions es dispersin |
| Exemples | Google, Meta (amb eines pròpies) | La majoria d'empreses mitjanes |
Tots dos models funcionen; el que importa és que l'elecció reforci, i no contradigui, l'arquitectura. Per a TechCorp la clau és l'autonomia de desplegament per equip que vam definir a 02-02, i la mida (set serveis, quatre equips) no justifica muntar Nx o Bazel.
Decisió de TechCorp:
- Un repositori per servei:
techcorp/servei-cataleg,techcorp/servei-comandes,techcorp/servei-inventari, etc. Cadascun amb el seuDockerfile, el seu workflow de CI i el seu equip propietari. - Un repositori de plataforma (
techcorp/plataforma): manifestos de Kubernetes, definició del gateway (03-04), dashboards, la plantilla de servei i la llista curta aprovada de l'apartat 5. - Un repositori per a
@techcorp/comu-http, publicat com a paquet al registre npm privat (GitHub Packages), amb versionat semàntic: els serveis s'actualitzen quan volen, no quan canvia la llibreria. - Els contractes (OpenAPI i AsyncAPI de 03-06) viuen al repositori del servei proveïdor, a
contractes/, perquè canviïn a la mateixa PR que el codi.
Estructura resultant, resumida:
techcorp/ ├── plataforma/ # equip Plataforma: k8s/, gateway/, plantilla-servei-node/, tecnologies-aprovades.md ├── comu-http/ # @techcorp/comu-http (paquet npm privat) ├── servei-cataleg/ # equip Experiència de compra (04-02) ├── servei-clients/ # equip Experiència de compra ├── servei-comandes/ # equip Comandes (Luis) (04-04) ├── servei-inventari/ # equip Comandes (Luis) ├── servei-pagaments/ # equip Pagaments i comunicacions ├── servei-notificacions/ # equip Pagaments i comunicacions └── techcorp-shop/ # el monòlit, que es va buidant
Errors Comuns i Consells
- Triar la tecnologia per moda o per currículum. "Volem Go perquè és el que es porta" o "Kafka perquè el fa servir Netflix". Aplica la taula de l'apartat 1 amb els números reals de TechCorp: 3.000 comandes/dia no necessiten Kafka.
- Confondre llibertat amb absència de regles. La llista curta no és burocràcia; és el que permet que Plataforma doni suport de debò. Escriu-la, publica-la i fes-la evolucionar amb pilots.
- Posar lògica de negoci a la llibreria compartida. Cada
ComandaoProductea@techcorp/comu-httpés un fil que torna a cosir els serveis entre si. Només codi tècnic, estable i amb versió. - Posar a la llibreria coses que depenen de la BD (com
processarUnCop). La llibreria acabaria depenent depgimongodbalhora. - Copiar la plantilla i no tornar-la a mirar. La plantilla evoluciona (nou linter, nou camp de log). Convé una revisió trimestral de quines millores aplicar als serveis existents, sense forçar.
- Executar en local amb versions diferents de les de producció. Node 18 al portàtil i Node 20 a la imatge amaga diferències (per exemple,
fetchnatiu)..nvmrci la mateixa versió major a tot arreu. - Un monorepo sense eines o un multirepo sense plantilla. El primer recrea el monòlit; el segon produeix set maneres diferents de fer el mateix.
Exercicis
Exercici 1. L'equip de Pagaments i comunicacions proposa escriure servei-notificacions en Python amb FastAPI perquè "només envia correus i Python té bones llibreries de plantilles". Aplica el diagrama de flux de l'apartat 5 i els criteris de l'apartat 1, i redacta la resposta del comitè d'arquitectura en cinc línies.
Exercici 2. Indica per a cadascuna d'aquestes peces si ha d'anar a @techcorp/comu-http, a la plantilla de servei o al mateix servei, i per què: (a) la funció transicionar de la màquina d'estats de la comanda; (b) el middleware que genera X-Request-Id; (c) el fitxer .eslintrc; (d) el traductorProducte; (e) declararCuaConsumidor; (f) el Dockerfile.
Exercici 3. La Marta pregunta si, per simplificar, no seria millor un únic repositori amb tots els serveis en carpetes. Enumera dos avantatges reals que hi guanyaria TechCorp i dos riscos concrets per a l'arquitectura de 02-02, i proposa una condició sota la qual la resposta seria "sí".
Solucions
Solució 1. Python no és a la llista aprovada, així que la pregunta és si resol alguna cosa que Node no resol. No: Node té llibreries de plantilles de correu equivalents (per exemple nodemailer + motors de plantilles), i el problema de Notificacions no és de rendiment ni de consum. El cost seria una segona imatge base, una segona plantilla de CI, instrumentació OpenTelemetry diferent i un servei que només dues persones podrien mantenir. Resposta del comitè: "Es rebutja per a aquest servei. Notificacions es fa en Node.js 20 + Express amb la plantilla estàndard. Si l'equip identifica una necessitat concreta que Node no cobreixi (per exemple, generació de PDF amb una llibreria específica), pot proposar un pilot acotat amb aquesta justificació."
Solució 2. (a) transicionar: al servei de Comandes, és lògica de negoci de l'agregat; compartir-la acoblaria. (b) Middleware d'X-Request-Id: a la llibreria, és tècnic, idèntic per a tothom i estable. (c) .eslintrc: a la plantilla; es copia i cada servei el pot ajustar sense afectar ningú. (d) traductorProducte: al servei de Comandes; és la seva ACL, expressa el que Comandes entén de Catàleg. (e) declararCuaConsumidor: a la llibreria (missatgeria/topologia), és tècnic i encapsula la convenció de DLQ de 03-02. (f) Dockerfile: a la plantilla; cada servei el copia i l'adapta (per exemple, Catàleg no necessita el client de PostgreSQL).
Solució 3. Avantatges: canvis transversals (per exemple, pujar la versió de @techcorp/comu-http a tots els serveis) en una sola PR; una única configuració de linter, CI i revisions. Riscos: que un desplegament n'arrossegui un altre (una PR que toca Comandes i Inventari "ja que hi som" recrea l'acoblament de desplegament); i que les importacions per ruta relativa entre serveis (../servei-cataleg/src/...) es colin sense que ningú les vegi, trencant la base de dades per servei i els contractes per la porta del darrere. La resposta seria "sí" si TechCorp adoptés una eina de monorepo (Nx/Turborepo) amb pipelines filtrats per ruta i regles de dependència que prohibeixin importar entre serveis; amb set serveis i quatre equips, aquest esforç avui no compensa.
Conclusió
Hem convertit la llibertat tecnològica dels microserveis en decisions concretes i governades: els criteris que pesen en un servei replicat i efímer (arrencada, memòria, contenidors, observabilitat, coneixement de l'equip) per sobre del rendiment brut; el panorama per categoria; la llista curta aprovada de TechCorp (Node.js 20 + Express a tots els serveis, PostgreSQL + MongoDB sota la regla de la Marta de dues bases de dades, RabbitMQ, Docker/Kubernetes, pino/Prometheus/OpenTelemetry, Jest/Supertest/Testcontainers/Pact, amb Go com a segona opció justificada); la diferència entre la plantilla que es copia i la llibreria @techcorp/comu-http que es versiona (i la regla d'or: res de negoci ni res que depengui de la BD a la llibreria); les eines de desenvolupament local; i l'organització en un repositori per servei més el de plataforma.
Amb la caixa d'eines tancada, toca obrir-la. A la lliçó següent construïm des de zero servei-cataleg, el primer servei que s'extreu del monòlit: npm init, l'estructura per capes, la separació entre app i servidor, els endpoints GET /v1/productes del contracte de 03-01 amb MongoDB al darrere, la gestió d'errors RFC 7807, la salut i l'aturada ordenada, fins a tenir-lo responent a curl al port 3001.
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
