# Primeiros passos com Load Balancer

Este guia orienta você a distribuir as requisições do seu primeiro connector entre dois servidores de origem com [Load Balancer](/pt-br/documentacao/plataforma/connectors/#load-balancer).

- Ative Load Balancer no connector e adicione um segundo endereço, com um peso para cada endereço.
- Envie requisições repetidas pelo seu workload e veja respostas dos dois servidores.
- Tire um endereço da rotação e veja toda requisição chegar ao outro.

Quatro partes formam a cadeia, listadas na ordem em que este guia as usa:

1. O **connector** dos [Primeiros passos com Connectors](/pt-br/documentacao/plataforma/connectors/primeiros-passos/) recebe Load Balancer e o método *Round Robin*.
2. Os **endereços** do connector passam a ser dois: `httpbin.org`, com peso `2`, e `httpbingo.org`, com peso `1`.
3. A **regra** que envia toda requisição sob `/anything` para o connector fica como está.
4. O **workload** que atende a sua aplicação recebe as requisições. O deployment dele não precisa de alteração.

Os dois servidores são serviços públicos que respondem a uma requisição para `/anything/get` com uma cópia em JSON dessa requisição. Cada um se identifica no header de resposta `server`, então a resposta mostra qual endereço respondeu. Para usar os seus próprios servidores, substitua os dois hostnames por servidores que guardam o mesmo conteúdo.

---

Os pré-requisitos e as três etapas mostram os passos de uma interface por vez. Selecione a sua:

## Pré-requisitos

- O resultado dos [Primeiros passos com Connectors](/pt-br/documentacao/plataforma/connectors/primeiros-passos/): o connector `my-connector` e uma regra que envia toda requisição sob `/anything` para ele.
- O workload domain do [workload](/pt-br/documentacao/plataforma/workloads/) que atende a aplicação, no formato `<id>.map.azionedge.net`. Este guia o escreve como `<workload-domain>`.
- `curl`, para enviar as requisições ao workload domain.

**Console**

- Acesso ao [Azion Console](https://console.azion.com/).

**CLI**

- A [Azion CLI](/pt-br/documentacao/devtools/cli/) na sua máquina, autorizada com um personal token.
- O ID do connector.

**API**

- Um personal token para o header `Authorization`.
- O ID do connector.

---

## Ative Load Balancer e adicione um endereço

Um connector contém um endereço até que Load Balancer esteja ativado. Com Load Balancer ativado, ele contém até 15 endereços, e um método de balanceamento escolhe um deles para cada requisição. *Round Robin* usa os endereços em sequência. Para os limites, consulte [Limites de Connectors](/pt-br/documentacao/plataforma/connectors/limites/#load-balancer).

Cada endereço carrega um peso de 1 a 100, e um peso maior destina mais tráfego a esse endereço. O peso define a proporção de requisições, não uma divisão exata. Cada endereço também carrega uma função do servidor. Os dois endereços deste guia são *Primary*. Um endereço *Backup* recebe requisições apenas quando todos os endereços primários falham, e o método *IP Hash* o recusa. Para mais informações, consulte [Função do servidor](/pt-br/documentacao/plataforma/connectors/load-balancer/metodos-de-balanceamento/#funcao-do-servidor).

Todo endereço de um connector recebe o mesmo header `Host` e o mesmo protocolo de transporte. Duas alterações nas opções de conexão fazem uma única configuração funcionar para os dois servidores:

- O header `Host` passa a ser `${host}`, o host que o cliente requisitou, em vez de `httpbin.org`. Um `httpbin.org` fixo enviaria a `httpbingo.org` um header `Host` que nomeia outro servidor.
- O connector alcança os dois servidores por HTTP. Por HTTPS, `httpbingo.org` aceita apenas conexões para o próprio nome.

**Console**

Para ativar Load Balancer no Azion Console:

1. **Abra a página Connectors**

   Acesse [Azion Console](https://console.azion.com/) > **Connectors**.

2. **Abra o seu connector**

   Selecione `my-connector`, o connector dos Primeiros passos com Connectors.

3. **Envie o host requisitado no header Host**

   Em **Host**, insira `${host}`.

4. **Conecte-se aos servidores por HTTP**

   Em **Transport Protocol Policy**, selecione *Force HTTP*.

5. **Ative Load Balancer**

   Em **Modules**, ative **Load Balancer**.

6. **Selecione o método de balanceamento**

   Em **Load Balancer Configuration**, defina **Method** como *Round Robin*.

7. **Configure o primeiro endereço**

   Em **Address Management**, em `httpbin.org`, defina **Server Role** como *Primary* e insira `2` em **Weight**.

8. **Selecione Add Address**

9. **Insira o segundo endereço**

   No novo **Address**, insira `httpbingo.org`, sem protocolo e sem porta.

10. **Configure o segundo endereço**

    Defina **Server Role** como *Primary* e insira `1` em **Weight**.

11. **Selecione Save**

Azion Console mostra `Connector has been updated`. O connector tem Load Balancer ativado e dois endereços ativos.

**CLI**

Para ativar Load Balancer com a Azion CLI, coloque o connector inteiro em um arquivo JSON. O comando de atualização precisa do corpo completo, com todos os campos que o connector mantém. Salve este corpo como `connector.json`:

```json
{
  "name": "my-connector",
  "active": true,
  "type": "http",
  "attributes": {
    "addresses": [
      {
        "address": "httpbin.org",
        "modules": { "load_balancer": { "server_role": "primary", "weight": 2 } }
      },
      {
        "address": "httpbingo.org",
        "modules": { "load_balancer": { "server_role": "primary", "weight": 1 } }
      }
    ],
    "connection_options": {
      "transport_policy": "force_http",
      "host": "${host}"
    },
    "modules": {
      "load_balancer": { "enabled": true, "config": { "method": "round_robin" } }
    }
  }
}
```

`modules.load_balancer` em cada endereço guarda a função e o peso dele. `modules.load_balancer` sob `attributes` ativa Load Balancer, e `config` deve conter pelo menos uma chave.

Atualize o connector a partir do arquivo. Substitua `<connector-id>` pelo ID do seu connector. O comando precisa de `--type`, mesmo que o arquivo nomeie o tipo:

```bash
azion update connector --connector-id <connector-id> --type http --file connector.json
```

A saída confirma a atualização:

```text
Updated Connector with ID <connector-id>
```

O connector tem Load Balancer ativado e dois endereços ativos. As configurações que `config` deixa de fora recebem os padrões da API: `max_retries` `0`, `connection_timeout` `60` e `read_write_timeout` `120`.

**API**

Para ativar Load Balancer com a API, envie uma requisição `PATCH` para o connector. Substitua `<connector-id>` pelo ID do seu connector e `[TOKEN VALUE]` pelo seu personal token:

```bash
curl --request PATCH \
  --url https://api.azion.com/v4/workspace/connectors/<connector-id> \
  --header 'Accept: application/json' \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{
  "attributes": {
    "addresses": [
      {
        "address": "httpbin.org",
        "modules": { "load_balancer": { "server_role": "primary", "weight": 2 } }
      },
      {
        "address": "httpbingo.org",
        "modules": { "load_balancer": { "server_role": "primary", "weight": 1 } }
      }
    ],
    "connection_options": {
      "transport_policy": "force_http",
      "host": "${host}"
    },
    "modules": {
      "load_balancer": { "enabled": true, "config": { "method": "round_robin" } }
    }
  }
}'
```

`addresses` substitui a lista de endereços, e `modules.load_balancer` em cada um guarda a função e o peso dele. `modules.load_balancer` sob `attributes` ativa Load Balancer, e `config` deve conter pelo menos uma chave. Um `PATCH` mantém as opções de conexão que o corpo deixa de fora.

A API responde com `202` e `"state": "pending"`. O connector tem Load Balancer ativado e dois endereços ativos. As configurações que `config` deixa de fora recebem os padrões da API: `max_retries` `0`, `connection_timeout` `60` e `read_write_timeout` `120`.

---

## Confirme que os dois endereços respondem

A verificação é a mesma, qualquer que seja a interface que alterou o connector. Nos comandos, substitua `<workload-domain>` pelo workload domain do seu workload.

Uma alteração em um connector leva vários minutos para chegar à infraestrutura distribuída da Azion, e os data centers a aplicam em momentos diferentes. Até lá, algumas requisições ainda chegam apenas a `httpbin.org`, e algumas podem retornar uma página de erro `502`. Repita as requisições até que os dois servidores respondam. Para mais informações, consulte [Propagação](/pt-br/documentacao/plataforma/connectors/como-funciona/#propagacao).

Envie uma requisição para um caminho sob `/anything` e imprima os headers de resposta com o corpo:

```bash
curl -s -D - https://<workload-domain>/anything/get
```

Envie a mesma requisição várias vezes. Uma resposta de `httpbin.org` traz este header `server`:

```text
HTTP/2 200
…
server: gunicorn/19.9.0
…
```

Uma resposta de `httpbingo.org` traz este:

```text
HTTP/2 200
…
server: Fly/<version>
via: 1.1 fly.io, 1.1 fly.io
…
```

Os dois servidores respondem pelo mesmo caminho, então o connector distribui as requisições entre os dois endereços.

As respostas não chegam em uma ordem fixa. Cada data center faz o balanceamento por conta própria, então uma sequência de requisições pode favorecer um endereço, e a proporção varia de uma execução para outra. Para mais informações, consulte [Load Balancer](/pt-br/documentacao/plataforma/connectors/como-funciona/#load-balancer).

---

## Tire um endereço da rotação

Um endereço com **Active** desativado continua no connector e não recebe requisições. Use isso para tirar um servidor de operação antes de uma manutenção, sem excluir o endereço. Esta etapa tira `httpbingo.org` da rotação.

**Console**

Para tirar o endereço da rotação no Azion Console:

1. **Abra o seu connector**

   Acesse [Azion Console](https://console.azion.com/) > **Connectors** e selecione `my-connector`.

2. **Desative o segundo endereço**

   Em **Address Management**, em `httpbingo.org`, desative **Active**.

3. **Selecione Save**

Azion Console mostra `Connector has been updated`. O endereço `httpbingo.org` está inativo.

**CLI**

Para tirar o endereço da rotação com a Azion CLI, edite o `connector.json` que você salvou. Adicione `"active": false` ao endereço `httpbingo.org`:

```json
{
  "name": "my-connector",
  "active": true,
  "type": "http",
  "attributes": {
    "addresses": [
      {
        "address": "httpbin.org",
        "modules": { "load_balancer": { "server_role": "primary", "weight": 2 } }
      },
      {
        "address": "httpbingo.org",
        "active": false,
        "modules": { "load_balancer": { "server_role": "primary", "weight": 1 } }
      }
    ],
    "connection_options": {
      "transport_policy": "force_http",
      "host": "${host}"
    },
    "modules": {
      "load_balancer": { "enabled": true, "config": { "method": "round_robin" } }
    }
  }
}
```

Atualize o connector a partir do arquivo:

```bash
azion update connector --connector-id <connector-id> --type http --file connector.json
```

A saída confirma a atualização:

```text
Updated Connector with ID <connector-id>
```

O endereço `httpbingo.org` está inativo e mantém a função e o peso dele.

**API**

Para tirar o endereço da rotação com a API, envie uma requisição `PATCH` com os dois endereços e `"active": false` em `httpbingo.org`:

```bash
curl --request PATCH \
  --url https://api.azion.com/v4/workspace/connectors/<connector-id> \
  --header 'Accept: application/json' \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{
  "attributes": {
    "addresses": [
      {
        "address": "httpbin.org",
        "modules": { "load_balancer": { "server_role": "primary", "weight": 2 } }
      },
      {
        "address": "httpbingo.org",
        "active": false,
        "modules": { "load_balancer": { "server_role": "primary", "weight": 1 } }
      }
    ]
  }
}'
```

O corpo lista todos os endereços que o connector mantém, porque `addresses` substitui a lista. A API responde com `202` e `"state": "pending"`. O endereço `httpbingo.org` está inativo e mantém a função e o peso dele.

A alteração chega aos data centers em momentos diferentes, como quando você adicionou o endereço. Por vários minutos, algumas requisições ainda chegam a `httpbingo.org`. Envie esta requisição várias vezes:

```bash
curl -s -D - https://<workload-domain>/anything/get
```

Quando todos os data centers tiverem a alteração, toda resposta traz o header de `httpbin.org`:

```text
HTTP/2 200
…
server: gunicorn/19.9.0
…
```

Nenhuma resposta traz o header `Fly`. O connector envia toda requisição ao endereço ativo, e `httpbingo.org` continua no connector com a função e o peso dele.

---

## Próximos passos

- [Métodos de balanceamento](/pt-br/documentacao/plataforma/connectors/load-balancer/metodos-de-balanceamento.md): Compare Round Robin, Least Connections e IP Hash, e veja como o peso e a função do servidor influenciam a escolha.
- [Balanceie o tráfego entre múltiplas origens](/pt-br/documentacao/guias/performance-e-confiabilidade/disponibilidade/configure-multiplas-origens.md): Planeje servidores primários e de backup para uma aplicação que precisa continuar respondendo durante uma indisponibilidade.
- [Limites de Connectors](/pt-br/documentacao/plataforma/connectors/limites.md#load-balancer): Os limites de endereços, peso, novas tentativas e timeouts com Load Balancer ativado.
- [Configurações de connector](/pt-br/documentacao/plataforma/connectors/configuracoes.md#load-balancer): Cada campo de Load Balancer, com o padrão dele na API e no Console.
