Balanceador de cargas simple con 4 servidores de 2 instancias en go y nodejs con configuracion nginx
Pequeña demostración sobre la implementación de un Load Balancer con Nginx. Este ejemplo cuenta con dos servicios: uno en Go y otro en Node.js. Ambos se exponen mediante Nginx, el cual implementa el método Round-Robin para balancear la carga de las solicitudes entre diferentes servidores.
📌 Para más información, consulta la documentación oficial de Load Balancing en Nginx.
Antes de comenzar, asegúrate de tener instaladas las siguientes herramientas:
Para ejecutar el proyecto, dirígete a la carpeta de descarga y ejecuta el archivo Makefile:
$ cd <[proyect_path]>
$ make build
⚠️ Si prefieres no instalar GNUWin, puedes copiar los comandos manualmente desde la sección #node servers en el archivo Makefile.
Una vez finalizada la instalación, accede al servidor Nginx dentro de Docker en el puerto 8080 (xxx.xxx.xxx.xxx:8080). Luego, prueba las rutas /go y /node. Si actualizas varias veces, notarás que el mensaje mostrado cambia en cada petición, lo que indica que la carga se está distribuyendo correctamente.
Para conocer la IP del entorno Docker, ejecuta:
$ docker-machine ip <MACHINE_NAME>
Si usaste la configuración predeterminada de Docker, puedes verificar la IP con:
$ docker-machine ip default
Para listar todas las máquinas virtuales en ejecución, usa:
$ docker-machine ls
./dirappContiene los servicios y archivos Docker necesarios para el enrutamiento con Nginx.
goserv - Servicio en GoEste servicio utiliza Gin Gonic para exponer un servidor REST simple.
📄 main.go
import (
	"log"
	"os"
	"github.com/gin-gonic/gin"
)
func main() {
	r := gin.Default()
	r.GET("/go", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": os.Getenv("MESSAGE"),
		})
	})
	if err := r.Run(":8080"); err != nil {
		log.Fatalf("Failed to run server: %v", err)
	}
}
Prueba el servidor localmente con:
$ go run ./main.go
Luego, accede a http://localhost:8080/go.
nodeserv - Servicio en Node.js📄 index.js
const http = require('http');
http.createServer((req, res) => {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.end(`<h1>${process.env.MESSAGE}</h1>`);
}).listen(8080);
Prueba el servidor con:
$ node index.js
./nginxEsta carpeta almacena la configuración de Nginx como balanceador de carga.
FROM nginx
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
upstream app-node {
    server 172.17.0.1:8081 weight=1;
    server 172.17.0.1:8082 weight=1;
}
upstream app-go {
    server 172.17.0.1:8083 weight=1;
    server 172.17.0.1:8084 weight=1;
}
server {
    listen 80;
    location /node {
        proxy_pass http://app-node;
    }
    location /go {
        proxy_pass http://app-go;
    }
}
El parámetro weight define la cantidad de sesiones asignadas a cada servidor. Ejemplo:
upstream app-node {
     server 172.17.0.1:8081 weight=100;
     server 172.17.0.1:8082 weight=10;
 }
En este caso, cuando el servidor 172.17.0.1:8081 alcance 100 sesiones, las siguientes solicitudes se dirigirán a 172.17.0.1:8082.
✅ TODO: Añadir configuración de balanceadores de carga dinámicos usando docker-gen.