WebSocket是一種網路傳輸協議,可在單個TCP串連上進行全雙工系統通訊,位於OSI模型的應用程式層。WebSocket允許服務端主動向用戶端推送資料。遵守WebSocket協議的服務即為WebSocket服務。本文通過樣本介紹如何通過ASM入口網關訪問網格內的WebSocket服務。
前提條件
步驟一:部署樣本應用
通過kubectl串連叢集。具體操作,請參見通過KubeConfig、CloudShell或Workbench串連叢集。
使用以下內容,建立名為tornado的YAML檔案。
apiVersion: v1 kind: Service metadata: name: tornado labels: app: tornado service: tornado spec: ports: - port: 8888 name: http selector: app: tornado --- apiVersion: apps/v1 kind: Deployment metadata: name: tornado spec: replicas: 1 selector: matchLabels: app: tornado version: v1 template: metadata: labels: app: tornado version: v1 spec: containers: - name: tornado image: registry.cn-beijing.aliyuncs.com/aliacs-app-catalog/tornado:lastest imagePullPolicy: Always ports: - containerPort: 8888 ---執行以下命令,建立tornado應用。
kubectl apply -f tornado.yaml
步驟二:設定路由規則
登入ASM控制台。
在左側導覽列,選擇。
在網格管理頁面,找到待配置的執行個體,單擊執行個體的名稱或在操作列中單擊管理。
建立網關規則。
在網格詳情頁面左側導覽列,選擇,然後在右側頁面,單擊使用YAML建立。
設定命名空間為default,將以下內容複寫到文字框中,單擊建立。
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: tornado-gateway spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*"設定
number為80,使WebSocket服務通過80連接埠接收傳入或傳出的HTTP或TCP串連。
建立虛擬服務。
在網格詳情頁面左側導覽列,選擇,然後在右側頁面,單擊使用YAML建立。
設定命名空間為default,將以下內容複寫到文字框中,單擊建立。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: tornado spec: hosts: - "*" gateways: - tornado-gateway http: - match: - uri: prefix: / route: - destination: host: tornado weight: 100設定
hosts為*,表示任意請求都可以訪問WebSocket服務。
步驟三:擷取入口網關的地址
方式一:通過ASM控制台
登入ASM控制台,在左側導覽列,選擇。
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇。
在入口網關頁面,擷取服務地址。
方式二:通過Container Service管理主控台
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在服務頁面頂部,選擇命名空間為istio-system,在External IP列,查看istio-ingressgateway對應的80連接埠的IP地址。
步驟四:驗證通過入口網關訪問WebSocket服務
在四個不同類型的瀏覽器中輸入http://<入口網關地址>。

分別執行以下命令,請求WebSocket服務。
curl "http://<入口網關地址>/api?id=8&value=300"curl "http://<入口網關地址>/api?id=5&value=600"curl "http://<入口網關地址>/api?id=1&value=200"curl "http://<入口網關地址>/api?id=3&value=290"可以看到,四個瀏覽器的WebSocket服務頁面資料同時被更新,且頁面顯示結果一致。
步驟五:切換使用wss協議訪問
為上述網關設定伺服器憑證和私密金鑰。具體操作,請參見步驟一:為多個主機準備伺服器憑證和私密金鑰。
請確保在ACK叢集下的istio-system命名空間中,已經建立了包含認證和私密金鑰的Secret,且Secret名稱為myexample-credential。
修改步驟二:設定路由規則中建立的路由規則。
YAML樣本如下:
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: tornado-gateway spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" - hosts: - "*" port: name: https number: 443 protocol: HTTPS tls: credentialName: myexample-credential mode: SIMPLE
步驟六:驗證使用wss協議訪問WebSocket服務
修改原生hosts檔案,將a.aliyun.com解析到ASM網關的IP地址,確保可以通過步驟五.1中設定的認證中的網域名稱訪問到ASM網關。
在四個不同類型的瀏覽器中輸入https://a.aliyun.com。

分別執行以下命令,請求WebSocket服務。
curl -k "https://<入口網關地址>/api?id=8&value=300"curl -k "https://<入口網關地址>/api?id=5&value=600"curl -k "https://<入口網關地址>/api?id=1&value=200"curl -k "https://<入口網關地址>/api?id=3&value=290"可以看到,四個瀏覽器的WebSocket服務頁面資料同時被更新,且頁面顯示結果一致。