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.

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 responder às sondas de gateway de aplicativo, descritas na seção Visão geral da sonda de integridade. As sondas de integridade do gateway de aplicativo são somente HTTP/HTTPS. Cada servidor back-end deve responder a testes HTTP para gateway de aplicativo para 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 que uma conexão é atualizada para WebSocket, como um proxy intermediário/terminador, o Application Gateway simplesmente enviará os dados recebidos do frontend para o backend e vice-versa, sem qualquer capacidade de inspeção ou manipulação. Portanto, o Web Application Firewall (WAF) não pode analisar nenhum conteúdo e não executa nenhuma inspeção nesses dados. Da mesma forma, quaisquer manipulações como Regravações de cabeçalho, Regravações de URL ou substituição de nome de host nas configurações de back-end não serão aplicadas após o estabelecimento de uma conexão WebSocket.

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

Um ouvinte HTTP existente pode ser usado para suportar o tráfego WebSocket. A seguir está um trecho de um elemento httpListeners de um arquivo de modelo de exemplo. Você precisaria de ouvintes HTTP e HTTPS para suportar WebSocket e tráfego WebSocket seguro. Da mesma forma, você pode usar o portal ou o Azure PowerShell para criar um gateway de aplicativo com ouvintes na porta 80/443 para dar suporte ao 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 da regra BackendAddressPool, BackendHttpSetting e Routing

Um BackendAddressPool é usado para definir um pool de back-end com servidores habilitados para WebSocket. O backendHttpSetting é definido com uma porta de back-end 80 e 443. O valor de tempo limite da solicitação em Configurações HTTP também se aplica à sessão WebSocket. Não há nenhuma alteração necessária na regra de roteamento, que é usada para vincular o ouvinte apropriado ao pool 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 é de 20 segundos, portanto, por exemplo, um valor de tempo limite de 40 segundos garantirá que o gateway não envie um erro de tempo limite antes que o cliente envie um ping; caso contrário, isso lançaria um erro 1006 no lado do cliente.

Back-end habilitado para WebSocket

Seu back-end deve ter um servidor Web HTTP/HTTPS em execução na porta configurada (geralmente 80/443) para que o WebSocket funcione. Esse requisito ocorre porque o protocolo WebSocket requer que o handshake inicial seja HTTP com atualização para o protocolo WebSocket como um campo de cabeçalho. Segue-se um exemplo de 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 isso é que a investigação de integridade do back-end do gateway de aplicativo suporta apenas protocolos HTTP e HTTPS. Se o servidor de back-end não responder a testes HTTP ou HTTPS, ele será retirado do pool de back-end.

Próximos passos

Depois de aprender sobre o suporte a WebSocket, vá para criar um gateway de aplicativo para começar a usar um aplicativo Web habilitado para WebSocket.