Visão geral do suporte a WebSocket no Application Gateway

O Gateway de Aplicação fornece suporte nativo para o WebSocket em todos os tamanhos de gateway. Não existe qualquer definição configurável pelo utilizador para ativar ou desativar seletivamente o suporte de WebSocket.

O protocolo WebSocket padronizado em RFC6455 permite uma comunicação full duplex entre um servidor e um cliente através de uma conexão TCP de longa duração. Este recurso permite uma comunicação mais interativa entre o servidor web e o cliente, que pode ser bidirecional sem a necessidade de sondagem, conforme exigido em implementações baseadas em HTTP. O WebSocket tem baixa sobrecarga ao contrário do HTTP e pode reutilizar a mesma conexão TCP para várias solicitações/respostas, resultando em uma utilização mais eficiente dos recursos. Os protocolos WebSocket são projetados para funcionar em portas HTTP tradicionais de 80 e 443. O Application Gateway suporta até 30.000 ligações WS simultâneas e 13.500 ligações WSS por instância.

Você pode continuar usando um ouvinte HTTP padrão na porta 80 ou 443 para receber tráfego WebSocket. O tráfego WebSocket é então direcionado para o servidor back-end habilitado para WebSocket usando o pool de back-end apropriado, conforme especificado nas regras do gateway de aplicativo. O servidor back-end deve, conforme descrito na seção Visão geral da sonda de integridade, responder às sondas do gateway de aplicações. As sondas de integridade do gateway de aplicação só suportam HTTP/HTTPS. Cada servidor de backend deve responder a sondagens HTTP para que o gateway de aplicação possa rotear o tráfego WebSocket para o servidor.

Ele é usado em aplicativos que se beneficiam de comunicação rápida e em tempo real, como aplicativos de bate-papo, painel e jogos.

Como funciona o WebSocket

Para estabelecer uma conexão WebSocket, um handshake específico baseado em HTTP é trocado entre o cliente e o servidor. Se bem-sucedido, o protocolo de camada de aplicativo é "atualizado" de HTTP para WebSockets, usando a conexão TCP estabelecida anteriormente. Uma vez que isso ocorre, HTTP está completamente fora de cena; os dados podem ser enviados ou recebidos usando o protocolo WebSocket por ambos os pontos de extremidade, até que a conexão WebSocket seja fechada.

O diagrama compara um cliente interagindo com um servidor Web, conectando-se duas vezes para obter duas respostas, com uma interação WebSocket, onde um cliente se conecta a um servidor uma vez para obter várias respostas.

Nota

Depois de uma ligação ser atualizada para WebSocket, como proxy intermediário/de terminação, o Application Gateway limita-se a enviar os dados recebidos do frontend para o backend e vice-versa, sem qualquer capacidade de inspeção nem de manipulação. Portanto, o Firewall de Aplicações Web (WAF) não consegue analisar qualquer conteúdo nem realiza inspeções a esses dados. Do mesmo modo, quaisquer alterações, como a reescrita de cabeçalhos, a reescrita de URL ou a substituição do hostname nas definições de backend, não se aplicam depois de ser estabelecida uma ligação WebSocket.

Elemento de configuração do serviço de escuta

Um ouvinte HTTP existente pode ser usado para suportar o tráfego WebSocket. O excerto seguinte mostra um httpListeners elemento de um ficheiro modelo de exemplo. São necessários ambos os ouvintes HTTP e HTTPS para suportar tráfego WebSocket e tráfego WebSocket seguro. De forma semelhante, pode utilizar o portal ou o Azure PowerShell para criar um gateway de aplicações com escutas nas portas 80 e 443 para suportar o tráfego WebSocket.

"httpListeners": [
        {
            "name": "appGatewayHttpsListener",
            "properties": {
                "FrontendIPConfiguration": {
                    "Id": "/subscriptions/{subscriptionId/resourceGroups/{resourceGroupName/providers/Microsoft.Network/applicationGateways/{applicationGatewayName/frontendIPConfigurations/DefaultFrontendPublicIP"
                },
                "FrontendPort": {
                    "Id": "/subscriptions/{subscriptionId/resourceGroups/{resourceGroupName/providers/Microsoft.Network/applicationGateways/{applicationGatewayName/frontendPorts/appGatewayFrontendPort443'"
                },
                "Protocol": "Https",
                "SslCertificate": {
                    "Id": "/subscriptions/{subscriptionId/resourceGroups/{resourceGroupName/providers/Microsoft.Network/applicationGateways/{applicationGatewayName/sslCertificates/appGatewaySslCert1'"
                },
            }
        },
        {
            "name": "appGatewayHttpListener",
            "properties": {
                "FrontendIPConfiguration": {
                    "Id": "/subscriptions/{subscriptionId/resourceGroups/{resourceGroupName/providers/Microsoft.Network/applicationGateways/{applicationGatewayName/frontendIPConfigurations/appGatewayFrontendIP'"
                },
                "FrontendPort": {
                    "Id": "/subscriptions/{subscriptionId/resourceGroups/{resourceGroupName/providers/Microsoft.Network/applicationGateways/{applicationGatewayName/frontendPorts/appGatewayFrontendPort80'"
                },
                "Protocol": "Http",
            }
        }
    ],

Configuração de BackendAddressPool, BackendHttpSetting e de regra de roteamento

Use um BackendAddressPool para definir um pool backend com servidores habilitados para WebSocket. Defina o backendHttpSetting com as portas backend 80 e 443. O valor de tempo limite da solicitação em Configurações HTTP também se aplica à sessão WebSocket. Não é necessário alterar a regra de encaminhamento, que associa o listener apropriado ao conjunto de endereços de back-end correspondente.

"requestRoutingRules": [{
    "name": "<ruleName1>",
    "properties": {
        "RuleType": "Basic",
        "httpListener": {
            "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/httpListeners/appGatewayHttpsListener')]"
        },
        "backendAddressPool": {
            "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendAddressPools/ContosoServerPool')]"
        },
        "backendHttpSettings": {
            "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendHttpSettingsCollection/appGatewayBackendHttpSettings')]"
        }
    }

}, {
    "name": "<ruleName2>",
    "properties": {
        "RuleType": "Basic",
        "httpListener": {
            "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/httpListeners/appGatewayHttpListener')]"
        },
        "backendAddressPool": {
            "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendAddressPools/ContosoServerPool')]"
        },
        "backendHttpSettings": {
            "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/applicationGateways/{applicationGatewayName}/backendHttpSettingsCollection/appGatewayBackendHttpSettings')]"
        }

    }
}]

Nota

Certifique-se de que o valor de tempo limite seja maior do que o intervalo de ping/pong definido pelo servidor para evitar erros de tempo limite antes que um ping seja enviado do cliente. Um valor típico para um WebSocket é 20 segundos, por isso, por exemplo, um valor de timeout de 40 segundos garante que o gateway não envia um erro de timeout antes do cliente enviar um ping. Caso contrário, esta condição gera um erro 1006 no lado do cliente.

Backend habilitado para WebSocket

O seu backend deve ter um servidor web HTTP/HTTPS a correr na porta configurada (normalmente 80 ou 443) para que o WebSocket funcione. Este requisito existe porque o protocolo WebSocket exige que o handshake inicial seja HTTP com uma atualização para o protocolo WebSocket como campo de cabeçalho. O exemplo seguinte mostra um cabeçalho:

    GET /chat HTTP/1.1
    Host: server.example.com
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
    Origin: https://example.com
    Sec-WebSocket-Protocol: chat, superchat
    Sec-WebSocket-Version: 13

Outra razão para este requisito é que a sonda de saúde do backend gateway da aplicação suporta apenas protocolos HTTP e HTTPS. Se o servidor backend não responder a sondas HTTP ou HTTPS, o gateway remove-os do pool backend.

Próximos passos

Depois de aprender sobre o suporte ao WebSocket, vá criar um gateway de aplicação para começar com uma aplicação web habilitada para WebSocket.