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.