Non occorrono certo dimostrazioni del fatto che Node.js esprima il meglio di sé nella scrittura di servizi di rete: l'unico limite è la fantasia; lui ci mette praticità di utilizzo e buone prestazioni. Quello che volevo presentare oggi è l'ennesimo esempio di come tali possibilità siano state sfruttate al meglio. Il progetto si chiama Bouncy ed è un modulo per Node.js che permette di scrivere tramite esso dei servizi che funzionino come load balancer o proxy/router HTTP. Funziona anche con HTTPS e protocollo Websocket. Vediamo perché è interessante.
Bouncy non è un server specializzato come può esserlo Pound, ma è una piccola libreria che permette di scrivere servizi proprio come Pound. Funziona solo in HTTP(S) e non è un generico balancer TCP. Sfrutta il parser HTTP di Node in modo che la richiesta che viene passata all'applicazione sia assolutamente identica (anche applicativamente) a quella che l'applicazione avrebbe ricevuto se non ci fosse stato il proxy davanti. Completamente trasparente, insomma.
Ecco per esempio un caso d'uso su cui sto lavorando: in un mio progetto ho 3 distinti servizi Node che ascoltano su altrettante porte TCP le connessioni Websocket che arrivano dai client (web browser e non solo). Avevo due problemi: mi dava fastidio dover esporre su Internet 3 servizi custom in balia del primo script kiddie che volesse provare a giocarci e avrei potuto trovare dei problemi con qualche firewall. Una prima soluzione alla quale sto lavorando è quella di usare un unico servizio scritto con Bouncy che accetta TUTTE le connessioni dirette a quei servizi su un'unica porta e poi instrada il traffico ai 3 servizi "privati", protetti a quel punto in modo da accettare connessioni solo da localhost.
àˆ chiaro che una cosa del genere potevo già farla con altri sistemi, ma la cosa interessante di Bouncy è che, essendo una libreria, le regole di smistamento (o di load balancing) le scrivo io, in JavaScript... posso per esempio verificare la presenza negli header HTTP di una chiave o di un valore per decidere se la richiesta è legittima o meno, oppure decidere di non far passare una certa classe di IP o addirittura controllare lo User Agent per accettare connessioni solo da browser e non, che so, da bot o crearmi un load balancer con sessioni sticky con regole scritte da me...
àˆ un ottimo strumento anche per fare debug delle connessioni HTTP/Websocket in maniera assolutamente trasparente, senza dover mettere mano ai veri server e riempirli di "console.log" che poi ci scordiamo di cancellare, oppure per fare tampering o normalizzazione di header HTTP. Secondo l'autore le prestazioni sono ragionevoli.
Non resta dunque che metterlo alla prova!