La vita oltre i Microservices
Monoliti modulari in Laravel
Chi sono?
Technical Coach / Founder (at)Mirai Training
Host (at) DevDojo IT
Produttore di bug da ~25 anni
Christian Nastasi
C'era una volta...
Vi presento Mario Rossi
Responsabile di un e-commerce in crescita
La piattaforma di Mario
Monolite legacy
Gestisce Autenticazione, Prodotti, Carrello, Pagamenti, ...
Gestito da un team unico
Il business vuole nuove funzionalità per spingere la crescita
Crescono gli utenti
Ma le cose cominciano a cambiare
Ovviamente in peggio
La piattaforma rallenta
Implementare nuove feature è sempre più costoso
Ci sono dei pezzi di codice che "è meglio non toccare"
Ogni tanto ci sono downtime e nessuno sa come mai
E quindi Mario pensa
Quanti Mario ci sono in questa sala?
Il team si mette al lavoro
E dopo sei mesi circa
Codebase per ogni servizio più piccola da gestire
Sistema distribuito
Comunicazione tra i servizi tramite API / Messaggi
Deploy indipendenti tra i singoli servizi
Resilienza del sistema
Tutto bello separato
E se siamo virtuosi
Non è tutto oro
quello che luccica
Insieme alle cose belle troviamo
Alta latenza di comunicazione tra un servizio e l'altro
Consistenza eventuale
Duplicazione di codice / logiche
Allineamento delle versioni
Errori di rete / Gestione dei retry
Bye bye transazionalità
Mai una gioia
Alta Latenza di comunicazione
x20.000.000
Monolite
Microservizio
Alta Latenza di comunicazione
Errori di rete / Gestione dei retry
Non c'è connessione
Troppe richieste in contemporanea
...
Chiamata in timeout
Consistenza eventuale
Duplicazione di codice / Logiche
Per i microservizi non vale il principio DRY
Ridurre l'accoppiamento forte implica duplicare logiche se sovrapposte
Allineamento delle versioni
Allineamento delle versioni
Bye Bye Transazionalità
Forse forse
Non lo chiamerei "silver bullet"
Ok ma quindi?
Come ne esco?
I monoliti modulari
Com'è il codice legacy
Come vorremmo che sia
Le componenti di un monolite
User Interface
API Rest
Business Logic
Domain Models
Data Access Layer
Database
Spesso mischiate fra di loro
Le componenti di un microservice
Microservice
Microservice
Microservice
User Interface
Le componenti di un monolite modulare
Framework
Moduli
Monoliti Modulari
In Laravel
Esistono tante ricette
Io vi darò la mia (per questioni di tempo)
Gli ingredienti
Service Providers
Composer
Tabelle con suffissi
Autodiscovery
Monorepo
Service Provider
namespace MyModule;
use Illuminate\Support\ServiceProvider;
class MyModuleServiceProvider extends ServiceProvider
{
public function register(): void { }
public function boot(): void { }
}
Tabelle con suffissi
warehouse_
payment_
cart_
product_
Un suffisso per ogni sottodominio
Composer
"repositories": [
{
"type": "composer",
"url": "https://url-to-your-repository/packages.json"
}
],
"require": {
"app/name": "^1.0"
}
Repository remoto - accesso https
Composer
"repositories": [
{
"type": "git",
"url": "git@gitlab.com:packages/path/to/repo.git"
},
],
"require": {
"app/name": "dev-main"
}
Repository remoto - accesso ssh
Composer
"repositories": [
{
"type": "path",
"url": "../modules/mymodule/composer.json"
}
],
"require": {
"app/name": "@dev"
}
Repository local - symlink
Autodiscovery
"extra": {
"laravel": {
"providers": [
"MyModule\\MyModuleServiceProvider"
],
"aliases": {
"MyAlias": "MyModule\\Facade"
}
}
}
Monorepo
Monorepo
Unico repository GIT
Repository locali
Ogni commit è una versione (di tutto)
Autodiscovery moduli
Librerie che aiutano?
nwidart/laravel-modules
cnastasi/monorepo-plugin
Conclusioni
Conclusioni
Uno "spaghetti code" trasformato in microservices diventa uno "spaghetti code" distribuito
Pensa bene prima di passare ad un sistema distribuito e sii consapevole della complessità che ne conseguirà
A prescindere, tieni ordinato e modulare il tuo codebase
That's all folks
Feedback & QA
twitch.tv/devdojo_it
youtube.com/@devdojo_it
t.me/devdojo_it
info@devdojo.it
La vita oltre i microservices: Monoliti modulari in Laravel
By Nastasi Christian
La vita oltre i microservices: Monoliti modulari in Laravel
- 25