Vai al contenuto

Load Balancer e Reverse Proxy nell’architettura a microservizi

L’architettura dei microservizi è oggi uno degli approcci più diffusi alla creazione di applicazioni complesse. Questo approccio suddivide un’applicazione di grandi dimensioni in una serie di piccoli servizi autonomi che collaborano per raggiungere un obiettivo comune.

Tuttavia, quando si lavora con i microservizi, ci sono alcune difficoltà nella gestione del carico sull’applicazione. È qui che vengono in soccorso due componenti importanti: Load Balancer e Reverse Proxy. Molto spesso sono implementati insieme in un’unica soluzione o vengono utilizzati in combinazione per ottenere una distribuzione del carico affidabile, sicurezza avanzata e gestione avanzata del traffico. Questi componenti sono fondamentali per garantire che l’architettura a microservizi sia resiliente, scalabile e sicura.

Load Balancer

Load Balancer aiuta a distribuire il carico su più istanze del servizio. Ad esempio, se disponi di più istanze di server Web, Load Balancer ne sceglierà una per elaborare le richieste dal client al fine di bilanciare il carico tra di esse. Inoltre, ha la capacità di rilevare istanze di servizio non disponibili o interrotte e reindirizzare il traffico verso istanze operative. Ciò aumenta notevolmente il livello di affidabilità e stabilità del sistema, oltre a gestire maggiori carichi di lavoro e scalare a volumi di richieste elevati, fornendo al contempo una maggiore disponibilità e tolleranza ai guasti.

Il Load Balancer funge da intermediario tra client e microservizi. Quando i client inviano una richiesta per un servizio, tale richiesta passa al Load Balancer, che quindi seleziona un’istanza di microservizio specifica che sarà responsabile dell’esecuzione di tale richiesta.

Esistono vari metodi di Load Balancer, ognuno dei quali può essere utilizzato a seconda di esigenze e attività specifiche. Ad esempio, Round Robin viene utilizzato per distribuire uniformemente il traffico tra le istanze, Least Connection viene utilizzato per selezionare l’istanza più libera e IP Hash viene utilizzato per instradare il traffico in modo più accurato in base all’indirizzo IP di origine. Con l’ausilio di questi algoritmi, si può regolare il carico su ogni istanza del servizio, distribuendo uniformemente il traffico tra di esse ed evitando così di sovraccaricarne una.

Caratteristiche:

  1. Distribuzione del carico: in un’architettura a microservizi, ci sono molteplici istanze di ciascun servizio. Un load balancer si occupa di distribuire il traffico tra queste istanze per evitare sovraccarichi e garantire una distribuzione uniforme del carico.
  2. Scalabilità orizzontale: il load balancer facilita la scalabilità orizzontale aggiungendo nuove istanze di servizi conforme alla domanda di traffico. Distribuendo equamente il carico tra le istanze, contribuisce a migliorare la capacità del sistema.
  3. Affidabilità: in caso di guasto di un’istanza di servizio, il load balancer può indirizzare il traffico alle istanze rimanenti, garantendo la continuità del servizio.

Reverse Proxy

Reverse Proxy, d’altra parte, è un intermediario tra il client e il server. Accetta una richiesta dal client e la reindirizza al servizio desiderato. Ciò consente di nascondere al mondo esterno la complessa architettura dell’applicazione. È importante notare che il proxy inverso può funzionare solo con i protocolli HTTP e HTTPS.

Il flusso di lavoro di proxy inverso è costituito dai seguenti passaggi:

  1. Il client invia una richiesta al proxy inverso.
  2. Il proxy inverso riceve la richiesta e la analizza.
  3. Il proxy inverso controlla se le informazioni o la pagina richieste sono nella cache. Se la pagina è nella cache, viene rimandata al client.
  4. Se la pagina non è nella cache, il proxy inverso invia la richiesta a un server online e riceve una risposta.
  5. Il proxy inverso analizza la risposta del server e, se necessario, la elabora.
  6. Il proxy inverso invia la risposta ricevuta dal server al client.

Caratteristiche:

  1. Protezione e sicurezza: il reverse proxy si colloca tra i client e i servizi dietro di esso. Questo strato aggiuntivo offre un punto di difesa contro attacchi e minacce di sicurezza. Il proxy può gestire autenticazione, autorizzazione e protezione contro attacchi DDoS.
  2. Gestione del traffico in ingresso: può gestire il traffico in ingresso, eseguendo operazioni di routing avanzate. Ad esempio, può indirizzare le richieste a diverse istanze di servizi in base a criteri specifici, come il percorso URL, il tipo di richiesta, ecc.
  3. Terminazione SSL: può gestire la terminazione SSL, offrendo un punto centrale per gestire certificati SSL/TLS. In questo modo, il traffico tra i client e il proxy può essere crittografato, e il proxy può comunicare con i servizi interni in chiaro o utilizzando una diversa crittografia.
  4. Cache e ottimizzazione: può implementare caching per memorizzare risposte alle richieste più frequenti. Questo può ridurre il carico sui servizi di backend e migliorare le prestazioni complessive.

Vantaggi dell’utilizzo del proxy inverso:

  • Maggiore disponibilità. Il proxy inverso elimina il singolo punto di errore e garantisce un’elevata disponibilità dei microservizi.
  • Maggiore affidabilità. Il bilanciamento del carico tra i microservizi evita il sovraccarico e gli errori di sistema.
  • Maggiore velocità. La memorizzazione nella cache e l’ottimizzazione del traffico consentono di velocizzare il sistema e migliorarne le prestazioni.
  • Maggiore livello di sicurezza. Reverse Proxy fornisce protezione del sistema contro attacchi e hack.

Creazione di un’architettura di microservizi utilizzando Load Balancer e Reverse Proxy

Nella creazione di un’architettura di microservizi, bisogna tener conto di dover distribuire il traffico tra diverse istanze dell’applicazione e tenere tutto sotto controllo. Per questi scopi, possiamo utilizzare i due componenti principali:

  • Il Load Balancer, che funge da controllore del traffico che distribuisce le richieste alle varie istanze dell’applicazione dietro di esso. Ciò massimizza l’utilizzo delle risorse e riduce i tempi di risposta.
  • Reverse Proxy, che funziona come intermediario tra il client e il server, che nasconde il vero indirizzo IP del server e fornisce anche un ulteriore livello di sicurezza e crittografia.

Diamo un’occhiata a un esempio di creazione di un’architettura di microservizi usando Docker. Supponiamo di avere 3 applicazioni in esecuzione sulle porte 5000, 6000 e 7000. Possiamo eseguire queste applicazioni nei contenitori Docker utilizzando il comando:

docker run -p 5000:5000 app_1 
docker run -p 6000:6000 app_2 
docker run -p 7000:7000 app_3

Ora, per eseguire il bilanciamento del carico, dobbiamo creare un container con Nginx che verrà configurato appunto come Load Balancer. Nel file di configurazione nginx.conf scriveremo:

http {
  upstream app_servers {
    server app_1:5000;
    server app_2:6000;
    server app_3:7000;
  }

  server {
    listen 80;
    server_name example.com;

    location / {
      proxy_pass http://app_servers;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
    }
  }
}

Nel codice sopra, stiamo configurando Nginx per utilizzare il nostro Load Balancer in ascolto sulla porta 80, che accetterà le richieste dai client. Quindi impostiamo gli indirizzi delle applicazioni e impostiamo gli attributi proxy che ci consentono di inviare richieste con le intestazioni corrette.

Possiamo utilizzare la stessa applicazione Nginx per configurare il proxy inverso. Il file di configurazione nginx.conf conterrà:

http {
  server {
    listen 80;
    server_name example.com;

    location / {
      proxy_pass http://internal-server-ip:port;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
    }
  }
}

In questo caso, abbiamo definito un server Reverse Proxy che accetta le richieste sulla porta 80 e le invia a internal-server-ip sulla porta specificata. Successivamente, impostiamo gli attributi proxy e inviamo le richieste con le intestazioni corrette.

Consideriamo adessp un altro esempio di utilizzo di Load Balancer e Reverse Proxy in un’architettura di microservizi.

Supponiamo di avere diversi microservizi eseguiti su host e porte diversi, che gestiscono Utenti, Ordini, Pagamenti. Ogni servizio è progettato per eseguire determinate attività, ad esempio il servizio Utenti è responsabile della gestione degli utenti.

Per fornire il bilanciamento del carico tra i servizi, possiamo utilizzare HAProxy come Load Balancer e Nginx come Reverse Proxy.

HAProxy è un Load Balancer professionale e ad alte prestazioni che consente di distribuire il traffico su più server. Per creare un’architettura di microservizi utilizzando HAProxy, è necessario eseguire i seguenti passaggi:

1. Configuriamo HAProxy per bilanciare il carico tra i server. Il file haproxy.cfg avrà il seguente contenuto:

frontend http_front
    bind *:80
    mode http
    option http-server-close
    default_backend http_back

backend http_back
    mode http
    balance roundrobin
    option forwardfor
    server users_service1 users-service1:80 check
    server users_service2 users-service2:80 check
    server orders_service1 orders-service1:80 check
    server orders_service2 orders-service2:80 check
    server payment_service1 payment-service1:80 check
    server payment_service2 payment-service2:80 check

Nell’esempio sopra, configuriamo la porta 80 sul front-end HAProxy per bilanciare le richieste tra più back-end, dove ogni back-end rappresenta un servizio separato.

2. Configuriamo Nginx come proxy inverso per nascondere gli indirizzi IP e fornire sicurezza e crittografia. Il file nginx.conf conterrà:

http {
  upstream users {
    server haproxy_ip:80;
  }

  server {
    listen 80;
    server_name users.example.com;

    location / {
      proxy_pass http://users;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
    }
  }
}

Quindi, abbiamo visto in pratica come Load Balancer e Reverse Proxy possono migliorare le prestazioni di un’architettura a microservizi. Bilanciando il carico tra i server e gestendo il traffico di rete, è possibile ottenere una maggiore tolleranza ai guasti e prestazioni delle applicazioni.

Reverse Proxy aiuta a evitare l’accesso diretto alle risorse interne, proteggendole da minacce esterne e semplifica anche la gestione delle richieste del server. Load Balancer, invece, risolve il problema della distribuzione del traffico reindirizzando le richieste verso risorse libere e riducendo il carico su server specifici.