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