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
- 221