# Configure múltiplas origens com load balancing

import Tabs from '~/components/tabs/Tabs'
import Apiv4Rollout from '~/includes/snippets/apiv4Rollout/pt/snippet.mdx'
import Code from '~/components/Code/Code.astro'

<Apiv4Rollout />

Quando você [cria uma application](/pt-br/documentacao/produtos/comecar-com-um-template/), você precisa definir uma origem. No entanto, infraestruturas mais complexas e robustas podem precisar de múltiplas origens para a mesma aplicação. O módulo [Load Balancer](/pt-br/documentacao/produtos/secure/connectors/load-balancer/) permite que você use algoritmos de balanceamento de carga para gerenciar altos números de acesso e controlar os comportamentos de sua origem.

:::caution[atenção]
Se o **Load Balancer** estiver ativado, a transferência de dados pode gerar custos relacionados ao uso. Verifique a [página de preços](/pt-br/documentacao/produtos/precos/) para mais informações.
:::

Existem instruções separadas para API v3 usando configurações legadas de [Origin](/pt-br/documentacao/produtos/build/applications/origins/) e API v4 usando o novo produto [Connector](/pt-br/documentacao/produtos/secure/connectors/).

:::tip
Se você não tem certeza de quais etapas se aplicam à sua conta, veja [o guia Verificar migração da conta](/pt-br/documentacao/produtos/guias/verificar-migracao-conta/) para determinar se sua conta já foi migrada.
:::

Os seguintes passos irão descrever um caso de uso onde a default origin deve ser do tipo Load Balancer com o [algoritmo Round-Robin](/pt-br/documentacao/produtos/secure/connectors/load-balancer/#metodo-de-balanceamento). Sinta-se à vontade para interpretar e modificar as instruções passo a passo de acordo com o seu caso de uso específico.

As seguintes regras de negócio de diferentes servidores de origem devem ser configuradas com balanceamento de carga:

- A aplicação deve ter três origens.
  - O servidor primário deve ter uma maior capacidade de carga.
  - O servidor secundário deve ter uma capacidade de carga média, suficiente para lidar com grandes picos de tráfego de entrada.
  - O servidor de backup deve ter uma baixa capacidade de carga e só deve ser ativo em circunstâncias especiais.
- Cada um desses servidores deve ser hospedado em um provedor de armazenamento ou serviço de nuvem diferente, já que as falhas de servidor não ocorrem frequentemente ao mesmo tempo.
- Todas as origens devem conter o mesmo conteúdo e ser configuradas da mesma forma para a application.

Portanto, as configurações necessárias são:

| Origem | Função | Endereço | Capacidade de carga | Status |
| --- | --- | --- | --- | --- |
| 1 | Servidor primário | `example.com` | Alta capacidade de carga | Deve estar sempre ativo. |
| 2 | Servidor secundário | `example.net` | Capacidade de carga média | Deve estar sempre ativo. |
| 3 | Servidor de backup | `example.org` | Baixa capacidade de carga | Deve estar ativo apenas em caso de manutenção ou picos de tráfego. |

---

<Tabs client:visible>
    <Fragment slot="tab.consoleedgeconnector">Console - Connector</Fragment>
    <Fragment slot="tab.consoleorigins">Console - Origens</Fragment>
    <Fragment slot="tab.apiv4">API v4</Fragment>
    <Fragment slot="tab.apiv3">API v3</Fragment>

<Fragment slot="panel.consoleedgeconnector">

Agora você precisa configurar um novo **Connector** para vincular sua aplicação ao seu bucket do Object Storage. Para isso:

1. [Acesse o Azion Console](/pt-br/documentacao/produtos/guias/como-acessar-o-azion-console/) > **Connectors**.
2. Clique no botão **+ Connector**.
3. Na seção **General**, dê ao seu Connector um nome único e descritivo (por exemplo, `Multiple Origins Connector`).
4. Na seção **Connector Type**, selecione **HTTP**.
5. Ative o switch **Load Balancer**, que permite adicionar múltiplos endereços.
6. No campo **Method**, selecione **Round-Robin**.
7. No primeiro campo **Address**, especifique o servidor primário. Por exemplo, `example.com`.
8. Como esta origem tem uma maior capacidade de carga, no campo **Weight**, adicione um peso de `3` para esta primeira origem.
9. No campo **Server Role**, mantenha **Primary** selecionado.
10. Mantenha este endereço **Active**.
11. No segundo campo **Address**, especifique o servidor secundário. Neste caso, `example.net`.
12. Devido à sua menor capacidade, no campo **Weight**, adicione um peso de `2` para este endereço.
13. No campo **Server Role**, selecione **Primary**. Como este endereço tem menor peso, o primeiro endereço será priorizado nas conexões.
14. Mantenha este endereço **Active**.
15. Adicione uma terceira origem clicando no botão **+ Add Address**.
16. No campo **Address**, especifique a origem de backup. Neste caso, `example.org`.
17. Mantenha o campo **Weight** em branco. Ele assumirá um valor padrão de `1`.
18. No campo **Server Role**, selecione **Backup**.
19. Desative este endereço desligando o switch **Active**.
20. Clique no botão **Save**.

Para ativar o Connector na sua application:

1. Acesse a aba **Rules Engine**.
2. Edite a regra padrão ou adicione uma nova regra de request.
3. Na seção **Criteria**, para aplicar o Connector para toda a aplicação, defina o critério como `If ${uri} starts with /`.
4. Na seção **Behavior**, selecione o comportamento **Set Connector**.
5. Selecione o Connector que deseja aplicar.
6. Clique no botão **Save**.
7. Aguarde alguns minutos para que as mudanças se propaguem para o edge. Em seguida, acesse sua aplicação ou use a linha de comando para fazer uma requisição e verificar se as mudanças foram feitas.

</Fragment>

<Fragment slot="panel.consoleorigins">

Primeiro, para habilitar o módulo **Load Balancer**:

1. Acesse o [Azion Console](/pt-br/documentacao/produtos/guias/como-acessar-o-azion-console/) > **Applications**.
2. Clique na application para a qual você quer configurar uma nova origem com balanceador de carga.
3. Na aba **Main Settings**, em **Modules**, ative o **Load Balancer**.
4. Clique no botão **Save**.

:::caution[atenção]
Nesta seção, você modificará sua default origin, que é do tipo **Single Origin**, para uma origem do tipo **Load Balancer**. Editar sua default origin substituirá a origem que você configurou ao criar a application. Para criar uma origem diferente, veja [como definir origens](/pt-br/documentacao/produtos/guias/build/definir-origens/).
:::

Para modificar a origem de acordo com o cenário descrito acima:

1. Selecione a aba **Origins**.
2. Na aba **Origins**, clique na **Default Origin** da lista.
3. Dê um nome para sua nova origem.
4. Em **Type**, selecione **Load Balancer**.
5. No campo **Method**, selecione **Round-Robin**.
6. No primeiro campo **Address**, especifique o servidor primário. Por exemplo, `example.com`.
7. Como esta origem tem uma maior capacidade de carga, no campo **Weight**, adicione um peso de `3` para esta primeira origem.
8. No campo **Server Role**, mantenha **Primary** selecionado.
9. Mantenha esta origem **Active**.
10. No segundo campo **Address**, especifique o servidor secundário. Neste caso, `example.net`.
11. Devido à sua menor capacidade, no campo **Weight**, adicione um peso de `2` para esta origem.
12. No campo **Server Role**, selecione **Primary**. Esta origem tem um valor de peso menor, a origem preferida para conexões será a primeira.
13. Mantenha esta origem **Active**.
14. Adicione uma terceira origem clicando no botão **+ Add Origin**.
15. No campo **Address**, especifique a origem de backup. Neste caso, `example.org`.
16. Mantenha o campo **Weight** em branco. Ele assumirá um valor padrão de `1`.
17. No campo **Server Role**, selecione **Backup**.
18. Desative esta origem desligando o interruptor **Active**.
19. Clique no botão **Save**.

Aguarde alguns minutos para que as mudanças se propaguem. Em seguida, acesse sua aplicação ou use a linha de comando para fazer uma requisição e verificar se as mudanças foram feitas.

</Fragment>

<Fragment slot="panel.apiv4">

1. Execute a seguinte requisição `POST` em seu terminal, substituindo `[TOKEN VALUE]` pelo seu [personal token](/pt-br/documentacao/produtos/guias/personal-tokens/) para criar um Connector.

<Code lang="bash" code={`curl --request POST \
  --url https://api.azion.com/v4/edge_connector/connectors \
  --header 'Accept: application/json' \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "Multiple Origins Connector",
    "active": true,
    "type": "http",
    "attributes": {
      "addresses": [
        {
          "active": true,
          "address": "example.com",
          "http_port": 80,
          "https_port": 443,
          "modules": {
            "load_balancer": {
              "server_role": "primary",
              "weight": 3
            }
          }
        },
        {
          "active": true,
          "address": "example.net",
          "http_port": 80,
          "https_port": 443,
          "modules": {
            "load_balancer": {
              "server_role": "primary",
              "weight": 2
            }
          }
        },
        {
          "active": false,
          "address": "example.org",
          "http_port": 80,
          "https_port": 443,
          "modules": {
            "load_balancer": {
              "server_role": "backup"
            }
          }
        }
      ],
      "connection_options": {
        "dns_resolution": "preserve",
        "transport_policy": "preserve",
        "http_version_policy": "http1_1",
        "host": "\${host}",
        "path_prefix": "",
        "following_redirect": false,
        "real_ip_header": "X-Real-IP",
        "real_port_header": "X-Real-PORT"
      },
      "modules": {
        "load_balancer": {
          "enabled": true,
          "config": {
            "method": "round_robin",
            "max_retries": 0,
            "connection_timeout": 60,
            "read_write_timeout": 120
          }
        },
        "origin_shield": {
          "enabled": false,
          "config": null
        }
      }
    }
  }'
  `} />

2. Você deve receber uma resposta confirmando a criação do Connector, copie o campo ID. Ele será usado no próximo passo.
3. Execute a seguinte requisição `POST` em seu terminal para criar uma regra no **Rules Engine**, vinculando o Connector à sua Application. Substitua a variável `<application_id>` pelo ID da Application e `<connector_id>` pelo ID do Connector copiado anteriormente:

<Code lang="bash" code={`curl --request POST \
  --url https://api.azion.com/v4/edge_application/applications/<application_id>/request_rules \
  --header 'Accept: application/json' \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "string",
  "active": true,
  "criteria":
    [
      {
        "conditional": "if",
        "variable": "\${uri}",
        "operator": "starts_with",
        "argument": "/"
      }
    ],
  "behaviors": [
    {
      "type": "set_edge_connector",
      "attributes": {
        "value": "<connector_id>"
      }
    }
  ]
}'
`} />

</Fragment>

<Fragment slot="panel.apiv3">

1. Execute a seguinte requisição `GET` em seu terminal, substituindo `[TOKEN VALUE]` pelo seu [personal token](/pt-br/documentacao/produtos/guias/personal-tokens/) e a variável `<application_id>` pelo [ID da sua application](/pt-br/documentacao/produtos/guias/build/definir-configuracoes-principais/) para recuperar a `<origin_key>` da sua origem padrão, que é um valor UUID:

<Code lang="bash" code={`curl --location 'https://api.azionapi.net/edge_applications/<application_id> \
--header 'Accept: application/json; version=3' \
--header 'Authorization: Token [TOKEN VALUE]'
`} />

2. Você receberá uma resposta semelhante a esta:

<Code lang="json" code={`{
    "results": {
        "origin_id": <origin_id>,
        "origin_key": "<origin_key>",
        "name": "Default Origin",
        "origin_type": "single_origin",
        ...
    }
}
`} />

3. Copie o valor `<origin_key>`.
4. Execute a seguinte requisição `PATCH` para modificar a origem padrão como segue, substituindo a chave e o id da aplicação na URL:

<Code lang="bash" code={`curl --location --request PATCH 'https://api.azionapi.net/edge_applications/<application_id>/origins/<origin_key>' \
--header 'Accept: application/json; version=3' \
--header 'Content-Type: application/json' \
--header 'Authorization: Token [TOKEN VALUE]' \
--data '{
    "name": "Default Origin RR3",
    "origin_type": "load_balancer",
    "addresses": [
        {
            "address": "example.com",
            "weight": 3,
            "server_role": "primary",
            "is_active": true
        },
        {
            "address": "example.net",
            "weight": 2,
            "server_role": "primary",
            "is_active": true
        },
        {
            "address": "example.org",
            "weight": 1,
            "server_role": "backup",
            "is_active": false
        }
    ],
    "host_header": "\${host}",
    "method": "round_robin"
}'
`} />

5. Você receberá uma resposta semelhante a esta, confirmando que as mudanças foram feitas:

<Code lang="json" code={`{
    "results": {
        "origin_id": <origin_id>,
        "origin_key": "<origin_key>",
        "name": "Default Origin (RR3)",
        "origin_type": "load_balancer",
        "addresses": [
            {
                "address": "example.com",
                "weight": 3,
                "server_role": "primary",
                "is_active": true
            },
            {
                "address": "example.net",
                "weight": 2,
                "server_role": "primary",
                "is_active": true
            },
            {
                "address": "example.org",
                "weight": 1,
                "server_role": "primary",
                "is_active": false
            }
        ],
        "host_header": "\${host}",
        "method": "round_robin"
        ...
    }
}
`} />

6. Aguarde alguns minutos para que a propagação ocorra.

:::tip
Consulte a [documentação da API da Azion](https://api.azion.com/) e a [especificação OpenAPI](https://github.com/aziontech/azionapi-openapi/) para saber mais sobre todas as funcionalidades disponíveis via API.
:::

</Fragment>

</Tabs>