DEV Community

Cover image for Como funciona um Load Balance e como implementar utilizando Nginx.
José Paulo Marinho
José Paulo Marinho

Posted on

10 1 1 1 1

Como funciona um Load Balance e como implementar utilizando Nginx.

O que é um Load Balance e para que serve?

Descrevendo de maneira mais técnica: o Load balance é uma técnica que distribui o tráfego entre servidores para otimizar o desempenho e a confiabilidade de uma rede ou sistema.

Dessa forma, é possível que, por exemplo, um site de comércio eletrônico distribua o tráfego entre vários servidores para lidar com um grande número de visitantes simultâneos, mantendo o site rápido e disponível.

O legal do Load Balance é a possibilidade de passar um "peso" para dizer qual servidor vai receber mais requisições de acordo com a configuração, vamos ver mais adiante.

Como implementar um Load Balance?

Para implementar um Load Balance, vamos utilizar um Software bem famoso estabilizado no mercado que permita que manipulemos um/o servidor HTTP, o Nginx.

Nginx é um servidor leve de HTTP, proxy reverso, proxy de e-mail IMAP/POP3, feito por Igor Sysoev em 2005, sob licença BSD-like 2-clause. O Nginx consome menos memória que o Apache, pois lida com requisições Web do tipo “event-based web server”; e o Apache é baseado no “process-based server”, podendo trabalhar juntos.

Nesse post não estarei ensinando a instalar o Nginx, apenas como configurar um Load Balance.

Arquitetura

Nosso desenho vai funcionar da seguinte forma:

  • Toda vez que chegar uma requisição na porta 8000 (de acordo com a configuração)
  • Vai ser redirecionado para o nosso servidor Nginx
  • Quando chegar no Nginx, ele vai fazer o redirecionamento pelo Load Balance de acordo com os servidores configurados

Architecture how works Nginx Load Balance

Implementação

Para este exemplo, estarei utilizando 2 aplicações em Spring Boot Java, mas você pode utilizar qualquer tecnologia que deseja ou framework.

Criei dois projetos no Spring Initializr só contendo a dependência do Spring Web.

Após a criação dos projetos, fiz uma controller em cada projeto bem simples:

Servidor 1:

// imports

@RestController
@RequestMapping("/")
public class Server1Controller {

    @GetMapping()
    public ResponseEntity get() {
        return ResponseEntity.status(HttpStatus.OK).body("Olá, server 1");
    }
}
Enter fullscreen mode Exit fullscreen mode

Servidor 2

// imports

@RestController
@RequestMapping("/")
public class Server2Controller {

    @GetMapping()
    public ResponseEntity get() {
        return ResponseEntity.status(HttpStatus.OK).body("Olá, server 2");
    }
}
Enter fullscreen mode Exit fullscreen mode

Não pode esquecer de trocar a porta da segunda ou primeira aplicação, vai da sua escolha:

server.port=8081
Enter fullscreen mode Exit fullscreen mode

Após rodar as duas aplicações, vamos ter as seguintes respostas rodando o comando curl:

Curl Request for two applications running

Boa, vemos que as duas aplicações estão rodando como desejado. Agora vamos para o Load Balance.

Para configurarmos o Load Balance, precisamos editar o arquivo de configuração do Nginx, o nginx.conf:

http {
  upstream spring-project {
    server localhost:8080;
    server localhost:8081;
  }

  server {
    listen 8000;
    server_name 127.0.0.1;

    location / {
      proxy_pass http://spring-project;
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Vou explicar o arquivo acima:

O bloco http é onde a configuração do servidor HTTP do Nginx é definida. Dentro desse bloco temos a definição de um grupo de servidores, chamado spring-project usando a diretiva upstream. Com isso, definimos um grupo de servidores que será usado para o balanceamento de carga, no caso temos 2 servidores:

127.0.0.1:8080
127.0.0.1:8081
Enter fullscreen mode Exit fullscreen mode

Que por acaso, são nossos dois servidores que já estão rodando nossa aplicação Spring.

Mais abaixo há um bloco de server, que é a nossa configuração do servidor que vai ouvir na porta 8000 e responder requisições que venham do host 127.0.0.1, dentro da localização padrão /. A partir disso o Nginx vai redirecionar todo o tráfego para os servidores dentro de spring-project, vamos ver?

Implementation Load Balance Running

Olha que legal! De quatro requisições realizadas, ele balanceou todas as quatro, então duas foram para o servidor 1 e duas foram para o servidor 2. Se eu quisesse modificar isso? Se eu quisesse que o servidor 1 recebesse três requisições a cada quatro?

É possível. Tem uma propriedade do nginx, chamado weight, que é o peso do balanceamento definido no servidor. Dessa forma, é possível influenciar ainda mais os algoritmos de balanceamento de carga nginx. Só alterar o arquivo nginx.conf dessa forma:

server localhost:8080 weight=3;
Enter fullscreen mode Exit fullscreen mode

Obs: se o weight não é passado, o padrão é 1

Vamos ver como ficou após as alterações.

Request Load Balancer With weight

Pronto. De cada quatro requisições, três caíram no servidor 1 e uma caiu no servidor 2.

Chegamos ao final. Espero que tenham gostado, deixarei aqui alguns links de referência.

Using nginx as HTTP load balance
Simple Load Balancing
Nginx

Um abraço e bons estudos! Até mais!

AWS Security LIVE!

Tune in for AWS Security LIVE!

Join AWS Security LIVE! for expert insights and actionable tips to protect your organization and keep security teams prepared.

Learn More

Top comments (0)

AWS Security LIVE!

Tune in for AWS Security LIVE!

Join AWS Security LIVE! for expert insights and actionable tips to protect your organization and keep security teams prepared.

Learn More