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
./dirapp
Contiene 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
./nginx
Esta 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
.