Architetture Software
Report 5000 ufficiale: fondamenti + ISO 25010, stili e pattern, microservizi, cloud-native/K8s, REST/GraphQL/gRPC, SOLID/GoF, DevOps/CI-CD + 25 numeri chiave + 15 trabocchetti.
1 Fondamenti dell'architettura software
Definizione
L'architettura software descrive la struttura di alto livello di un sistema software: componenti, relazioni, principi di progettazione, vincoli e decisioni che riguardano qualità (performance, scalabilità, manutenibilità, sicurezza). Distinta dal design (livello dettaglio) e dall'implementazione (codice).
Drivers architetturali
- Requisiti funzionali (cosa fa il sistema)
- Requisiti non funzionali / qualità (performance, sicurezza, scalabilità, usabilità)
- Vincoli (tecnologici, normativi, budget, time-to-market)
- Stakeholder concerns (utenti, business, dev, ops)
Caratteristiche di qualità ISO/IEC 25010
- Functional suitability
- Performance efficiency
- Compatibility
- Usability
- Reliability
- Security
- Maintainability
- Portability
Architectural views (4+1 — Kruchten)
- Logical (oggetti, classi)
- Process (concorrenza, sincronizzazione)
- Physical (deployment)
- Development (organizzazione moduli)
- +1 Scenarios (use case che validano le altre 4)
2 Stili e pattern architetturali
Stili classici
| Stile | Caratteristica | Quando usarlo |
|---|---|---|
| Monolithic | Tutto in un unico deployment | Piccoli sistemi, MVP |
| Layered (n-tier) | Strati orizzontali (presentation/business/data) | Sistemi enterprise tradizionali |
| Client-Server | Client richiede, server risponde | Web, DBMS |
| Pipe-and-Filter | Trasformazioni in cascata | ETL, compilatori, Unix shell |
| Event-Driven | Componenti reagiscono a eventi | UI, IoT, real-time |
| Microkernel / Plug-in | Core minimale + estensioni | IDE (Eclipse), browser |
| Microservices | Servizi piccoli, indipendenti, distribuiti | Sistemi cloud-scale |
| Service-Oriented (SOA) | Servizi riusabili tramite ESB | Integrazione enterprise |
| Serverless / FaaS | Funzioni eventi-driven gestite dal cloud | Workload sporadici, scala automatica |
Layered architecture (3-tier classico)
- Presentation Layer (UI, controller)
- Business Logic Layer (servizi, dominio)
- Data Access Layer (repository, DAO, DBMS)
Variante Hexagonal / Ports & Adapters (Cockburn, 2005): dominio al centro, dipendenze invertite verso l'esterno.
Clean Architecture (Robert C. Martin, 2017)
Cerchi concentrici: Entities → Use Cases → Interface Adapters → Frameworks/Drivers. Dependency Rule: dipendenze SOLO verso il centro.
MVC, MVP, MVVM
- MVC (Model-View-Controller): Model gestisce dati, View presenta, Controller coordina
- MVP (Model-View-Presenter): Presenter media tra View e Model, View passiva
- MVVM (Model-View-ViewModel): binding bidirezionale via ViewModel (WPF, Angular, Vue)
3 Microservizi
Caratteristiche
- Servizi piccoli e con responsabilità singola
- Database per servizio (no shared DB)
- Comunicazione via API (REST, gRPC) o messaging asincrono (Kafka, RabbitMQ)
- Deployment indipendente (CI/CD per servizio)
- Tecnologie eterogenee (polyglot persistence/programming)
- Resilienza tramite Circuit Breaker, Bulkhead, Retry
Vantaggi vs svantaggi
| Vantaggi | Svantaggi |
|---|---|
| Scalabilità orizzontale per servizio | Complessità operativa (orchestrazione) |
| Deploy indipendente | Latenza rete inter-servizio |
| Team autonomi | Consistenza dati distribuita (no ACID globale) |
| Tecnologie miste | Debugging e tracing complessi |
| Isolamento fallimenti | Costi infrastruttura più alti |
Pattern correlati
- API Gateway: punto unico ingresso, routing, autenticazione, rate limiting
- Service Discovery: registro dinamico (Consul, Eureka, Kubernetes Service)
- Circuit Breaker (Hystrix, Resilience4j): protegge da cascade failure
- Saga: transazioni distribuite tramite compensazione
- CQRS (Command Query Responsibility Segregation): separa comandi (write) da query (read)
- Event Sourcing: stato derivato da log eventi immutabili
4 Cloud-native e container
Containerizzazione
- Docker: standard de facto per packaging applicazioni
- OCI (Open Container Initiative): standard immagini e runtime
- Container vs VM: container condividono kernel host, partono in secondi, leggeri (MB invece di GB)
Kubernetes (K8s)
Orchestratore container, sviluppato Google, donato a CNCF (2014).
Componenti control plane:
- API Server — endpoint REST
- etcd — store distribuito chiave-valore (configurazione cluster)
- Scheduler — assegna pod ai nodi
- Controller Manager — riconcilia stato
Componenti node:
- kubelet — agente locale
- kube-proxy — networking
- Container runtime (containerd, CRI-O)
Oggetti chiave:
- Pod — unità minima deployabile (1+ container)
- Deployment — gestione replicas
- Service — networking stabile (ClusterIP, NodePort, LoadBalancer)
- Ingress — accesso HTTP esterno
- ConfigMap / Secret — configurazione
- PersistentVolume — storage persistente
CNCF Landscape
Cloud Native Computing Foundation, ospita 180+ progetti: Kubernetes, Prometheus, Envoy, Istio, Helm, Argo, OpenTelemetry.
Service mesh
Istio, Linkerd: gestione comunicazione inter-servizi (load balancing, mutual TLS, observability) tramite sidecar proxy.
5 API e protocolli
REST (Representational State Transfer — Fielding, 2000)
Stile architetturale basato su HTTP. Vincoli:
- Client-Server
- Stateless (no sessione lato server)
- Cacheable
- Uniform interface (URI risorse, metodi HTTP, HATEOAS)
- Layered system
- Code on demand (opzionale)
Verbi HTTP: GET (read), POST (create), PUT (update full), PATCH (update partial), DELETE.
Status code:
- 1xx informational
- 2xx success (200 OK, 201 Created, 204 No Content)
- 3xx redirection (301, 302, 304)
- 4xx client error (400, 401, 403, 404, 429)
- 5xx server error (500, 502, 503, 504)
GraphQL (Facebook, 2015)
Query language per API: il client specifica esattamente i campi richiesti, single endpoint, no over/under-fetching. Schema fortemente tipizzato.
gRPC (Google, 2015)
RPC moderno basato su HTTP/2 + Protocol Buffers. Bidirectional streaming, performance elevata, ideale comunicazione inter-servizio.
SOAP / WSDL
Protocollo XML enterprise (anni 2000), pesante ma con WS-Security/WS-Transaction. In declino, sopravvive in legacy bancari.
Webhooks
Pattern push: il server chiama un URL del client al verificarsi di un evento. Asincrono, leggero.
6 Principi di progettazione
SOLID (Robert C. Martin)
| Lettera | Principio | Significato |
|---|---|---|
| S | Single Responsibility | Una classe = una sola ragione per cambiare |
| O | Open/Closed | Aperto a estensioni, chiuso a modifiche |
| L | Liskov Substitution | Sottoclassi sostituibili a superclassi |
| I | Interface Segregation | Interfacce piccole e specifiche |
| D | Dependency Inversion | Dipendere da astrazioni, non da implementazioni |
Altri principi
- DRY (Don't Repeat Yourself)
- KISS (Keep It Simple, Stupid)
- YAGNI (You Aren't Gonna Need It)
- Separation of Concerns
- Law of Demeter (principio di minima conoscenza)
- Composition over inheritance
Design Pattern (Gang of Four, 1994)
Creational: Singleton, Factory Method, Abstract Factory, Builder, Prototype.
Structural: Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy.
Behavioral: Observer, Strategy, Command, Iterator, State, Template Method, Visitor, Mediator, Memento, Chain of Responsibility, Interpreter.
7 Deployment e DevOps
CI/CD (Continuous Integration / Continuous Delivery / Deployment)
- CI: integrazione frequente con build + test automatici (Jenkins, GitLab CI, GitHub Actions)
- CD: rilascio automatico in staging/produzione
- Pipeline tipiche: lint → test unit → build → test integration → security scan → deploy
Strategie di deployment
| Strategia | Caratteristica | Rischio |
|---|---|---|
| Recreate | Stop vecchio, deploy nuovo | Downtime |
| Rolling Update | Sostituzione graduale | Versioni miste temporanee |
| Blue-Green | 2 ambienti, switch traffic | Costi raddoppiati |
| Canary | % traffico graduale al nuovo | Monitoring critico |
| A/B Testing | Versioni diverse a segmenti utenti | Logica routing |
Infrastructure as Code (IaC)
Terraform (provisioning multi-cloud), Ansible (configuration management), Pulumi (IaC con linguaggi general purpose), CloudFormation (AWS).
Observability — 3 pilastri
- Logs (ELK stack, Loki)
- Metrics (Prometheus, Grafana)
- Traces (Jaeger, Zipkin, OpenTelemetry)
8 25 numeri chiave
| # | Dato | Valore |
|---|---|---|
| 1 | Caratteristiche qualità ISO/IEC 25010 | 8 |
| 2 | Viste 4+1 Kruchten | 5 (4 + 1 scenario) |
| 3 | Principi SOLID | 5 |
| 4 | Pattern GoF totali | 23 |
| 5 | Pattern GoF Creational | 5 |
| 6 | Pattern GoF Structural | 7 |
| 7 | Pattern GoF Behavioral | 11 |
| 8 | Anno Kubernetes (donato CNCF) | 2014 |
| 9 | Anno REST (Fielding tesi) | 2000 |
| 10 | Anno GraphQL | 2015 |
| 11 | Anno gRPC | 2015 |
| 12 | Anno Clean Architecture (Martin) | 2017 |
| 13 | Anno Hexagonal Arch (Cockburn) | 2005 |
| 14 | Tier classico architettura | 3 (presentation/business/data) |
| 15 | Verbi HTTP principali | 5 (GET/POST/PUT/PATCH/DELETE) |
| 16 | Status code 2xx | Success |
| 17 | Status code 4xx | Client error |
| 18 | Status code 5xx | Server error |
| 19 | Pattern transazioni distribuite | Saga |
| 20 | Pattern resilienza | Circuit Breaker |
| 21 | Standard immagini container | OCI |
| 22 | Unità minima Kubernetes | Pod |
| 23 | Store cluster Kubernetes | etcd |
| 24 | Service mesh popolari | Istio, Linkerd |
| 25 | Pillar observability | 3 (Logs, Metrics, Traces) |
9 15 trabocchetti d'esame
| # | Trabocchetto | Risposta corretta |
|---|---|---|
| 1 | "Microservizi condividono il database" | FALSO — pattern "database per servizio", no shared DB |
| 2 | "REST è un protocollo" | FALSO — è uno stile architetturale basato su HTTP |
| 3 | "PUT e PATCH sono equivalenti" | FALSO — PUT sostituisce intera risorsa, PATCH modifica parzialmente |
| 4 | "Kubernetes è un container runtime" | FALSO — è un orchestratore; runtime sono containerd, CRI-O |
| 5 | "Codice 304 indica errore client" | FALSO — 304 = "Not Modified" (caching), non è errore |
| 6 | "Singleton garantisce thread-safety" | FALSO — non automaticamente; serve implementazione esplicita |
| 7 | "Dependency Inversion = dipendenze invertite a runtime" | FALSO — dipendere da astrazioni, non da implementazioni concrete |
| 8 | "MVVM è un'evoluzione di MVP" | PARZIALE — concettualmente correlato, ma MVVM usa binding bidirezionale, MVP no |
| 9 | "SOAP è RESTful" | FALSO — SOAP è un protocollo XML, non è REST |
| 10 | "Container = macchina virtuale" | FALSO — container condividono kernel host (no SO completo) |
| 11 | "API Gateway è obbligatorio" | FALSO — utile ma non strettamente necessario |
| 12 | "Saga garantisce ACID" | FALSO — Saga garantisce eventual consistency via compensazione |
| 13 | "Hexagonal mette il dominio in periferia" | FALSO — il dominio è al centro, infrastruttura in periferia |
| 14 | "Pattern Strategy è Creational" | FALSO — è Behavioral |
| 15 | "Service Mesh sostituisce API Gateway" | FALSO — sono complementari (Mesh = inter-service, Gateway = ingress) |