Bagikan melalui


Gambaran umum dukungan WebSocket di Application Gateway

Application Gateway menyediakan dukungan asli untuk WebSocket di semua ukuran gateway. Tidak ada setelan yang bisa dikonfigurasi pengguna untuk mengaktifkan atau menonaktifkan dukungan WebSocket secara selektif.

Protokol WebSocket yang distandardisasi di RFC6455 mengaktifkan komunikasi dupleks penuh antara server dan klien melalui koneksi TCP yang berjalan lama. Fitur ini memungkinkan komunikasi yang lebih interaktif antara server web dan klien yang dapat berjalan dua arah tanpa perlu polling seperti yang diperlukan dalam implementasi berbasis HTTP. WebSocket memiliki overhead rendah tidak seperti HTTP dan dapat menggunakan kembali koneksi TCP yang sama untuk beberapa permintaan/respons yang menghasilkan pemanfaatan sumber daya yang lebih efisien. Protokol WebSocket dirancang untuk bekerja melalui port HTTP tradisional 80 dan 443.

Anda dapat terus menggunakan pendengar HTTP standar pada port 80 atau 443 untuk menerima lalu lintas WebSocket. Lalu lintas WebSocket kemudian diarahkan ke server backend yang mendukung WebSocket menggunakan pool backend yang sesuai seperti yang ditentukan dalam aturan gateway aplikasi. Server backend harus menanggapi pemeriksaan gerbang aplikasi, seperti yang dijelaskan pada bagian gambaran umum pemeriksaan kesehatan. Pemeriksaan kesehatan untuk gateway aplikasi hanya dilakukan melalui HTTP/HTTPS. Setiap server backend harus menanggapi probe HTTP agar gateway aplikasi dapat merutekan lalu lintas WebSocket ke server tersebut.

Ini digunakan dalam aplikasi yang mendapat manfaat dari komunikasi yang cepat dan real time, seperti obrolan, dasbor, dan aplikasi game.

Cara kerja WebSocket

Untuk membuat koneksi WebSocket, jabat tangan berbasis HTTP tertentu ditukarkan antara klien dan server. Jika berhasil, protokol lapisan aplikasi "ditingkatkan" dari HTTP ke WebSocket, menggunakan koneksi TCP yang sebelumnya dibuat. Setelah ini terjadi, HTTP benar-benar keluar dari gambar; data dapat dikirim atau diterima menggunakan protokol WebSocket oleh kedua titik akhir, hingga koneksi WebSocket ditutup.

Diagram membandingkan klien yang berinteraksi dengan server web, menghubungkan dua kali untuk mendapatkan dua balasan, dengan interaksi WebSocket di mana klien terhubung ke server sekali untuk mendapatkan beberapa balasan.

Catatan

Setelah koneksi ditingkatkan ke WebSocket, sebagai proksi perantara/penghentian, Application Gateway hanya akan mengirim data yang diterima dari ujung depan ke ujung belakang dan sebaliknya, tanpa kemampuan inspeksi atau manipulasi apa pun. Oleh karena itu, Web Application Firewall (WAF) tidak dapat mengurai konten apa pun dan tidak melakukan pemeriksaan apa pun pada data tersebut. Demikian pula, manipulasi apa pun seperti Penulisan Ulang Header, Penulisan Ulang URL, atau Mengganti Nama Host di Pengaturan Backend tidak akan berlaku setelah membuat koneksi WebSocket.

Elemen konfigurasi pendengar

Pendengar HTTP yang ada dapat digunakan untuk mendukung lalu lintas WebSocket. Berikut adalah cuplikan elemen httpListeners dari file template sampel. Anda memerlukan pendengar HTTP dan HTTPS untuk mendukung WebSocket dan mengamankan lalu lintas WebSocket. Demikian pula Anda dapat menggunakan portal atau Azure PowerShell untuk membuat gateway aplikasi dengan pendengar di port 80/443 untuk mendukung lalu lintas 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",
            }
        }
    ],

Konfigurasi BackendAddressPool, BackendHttpSetting, dan aturan perutean

BackendAddressPool digunakan untuk menentukan kumpulan alamat belakang dengan server yang mendukung WebSocket. BackendHttpSetting ditentukan dengan port backend 80 dan 443. Nilai batas waktu permintaan di Setelan HTTP juga berlaku untuk sesi WebSocket. Tidak ada perubahan yang diperlukan dalam aturan perutean yang digunakan untuk mengikat pendengar yang sesuai dengan kumpulan alamat ujung belakang yang sesuai.

"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')]"
        }

    }
}]

Catatan

Pastikan nilai batas waktu Anda lebih besar dari interval ping/pong yang ditentukan server Anda untuk menghindari mengalami kesalahan waktu habis sebelum ping dikirim dari klien. Nilai umum untuk WebSocket adalah 20 detik, jadi, misalnya, nilai batas waktu 40 detik akan memastikan bahwa gateway tidak mengirim kesalahan batas waktu sebelum klien mengirim ping; jika tidak, ini akan melemparkan kesalahan 1006 di sisi klien.

Backend yang mengaktifkan WebSocket

Sistem backend Anda harus memiliki server web HTTP/HTTPS yang berjalan pada port yang dikonfigurasi (biasanya 80/443) agar WebSocket dapat berfungsi. Persyaratan ini karena protokol WebSocket memerlukan jabat tangan awal agar menjadi HTTP dengan peningkatan ke protokol WebSocket sebagai bidang header. Berikut adalah contoh header:

    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

Alasan lainnya adalah probe kesehatan backend dari gateway aplikasi hanya mendukung protokol HTTP dan HTTPS. Jika server backend tidak merespons pemeriksaan HTTP atau HTTPS, server tersebut diambil dari kumpulan backend.

Langkah berikutnya

Setelah mempelajari tentang dukungan WebSocket, buka halaman membuat gateway aplikasi untuk memulai dengan aplikasi web yang menggunakan WebSocket.