全部產品
Search
文件中心

API Gateway:雲端式原生API Gateway實現WebSocket服務的轉寄

更新時間:Jan 11, 2025

WebSocket協議實現了用戶端與伺服器間的持續、雙向通訊,確保了串連的持久性和低延遲。在Kubernetes叢集外部存取WebSocket服務時,雲原生API Gateway承擔了請求接收和轉寄的角色,根據預定的路由規則將請求分發到相應的後端服務。本文介紹了如何在Container Service for Kubernetes叢集部署WebSocket應用,並通過雲原生API Gateway進行流量轉寄。

前提條件

步驟一:使用Container Service部署WebSocket應用

應用部署的具體操作,請參見建立無狀態工作負載Deployment

在本樣本中,使用Container ServiceK8s原生的服務發現方式,即通過聲明式Service API資源將後端服務註冊到CoreDNS。樣本中的後端服務提供了多個WebSocket介面,在Container ServiceACK中應用如下資源:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: sockbin
  name: sockbin-app
  namespace: default
spec:
  progressDeadlineSeconds: 600
  replicas: 2
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: sockbin
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: sockbin
    spec:
      containers:
        - image: therebelrobot/sockbin
          imagePullPolicy: Always
          name: sockbin
          ports:
            - containerPort: 4080
              protocol: TCP
          resources:
            limits:
              cpu: 500m
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: sockbin
  name: sockbin-service
  namespace: default
spec:
  ports:
    - name: http
      port: 4080
      protocol: TCP
      targetPort: 4080
  selector:
    app: sockbin
  sessionAffinity: None
  type: NodePort

步驟二:使用雲原生API Gateway作為WebSocket的路由分發

添加ACK叢集作為網關的服務來源並添加Sockbin服務。

添加服務來源

  1. 登入雲原生API Gateway控制台

  2. 在左側導覽列,選擇執行個體,並在頂部功能表列選擇地區。

  3. 執行個體頁面,單擊目標網關執行個體名稱。

  4. 在左側導覽列,選擇服務,並單擊來源頁簽。

  5. 單擊建立來源並配置相關參數,配置完成後單擊確定

    配置項

    描述

    來源類型

    選擇Container Service服務來源。

    ACK/ACK Serverless叢集

    選擇後端服務所在的叢集。

    監聽K8s Ingress

    開啟監聽Ingress配置後,雲原生API Gateway會自動監聽Ingress資源的變化,並生效Ingress資源中網域名稱、路由的相關配置。

    關閉監聽Ingress配置後,雲原生API Gateway會放棄監聽Ingress資源,同時,之前已監聽的Ingress資源中網域名稱、路由相關配置會失效。

    說明

    通過管控手動設定的網域名稱、路由的相關配置的優先順序高於Ingress資源。

添加服務

  1. 登入雲原生API Gateway控制台

  2. 在左側導覽列,選擇執行個體,並在頂部功能表列選擇地區。

  3. 執行個體頁面,單擊目標網關執行個體名稱。

  4. 在左側導覽列,選擇服務,並單擊服務頁簽。

  5. 單擊建立服務並配置相關參數,然後單擊確定

    配置項

    說明

    服務來源

    選擇Container Service

    命名空間

    選擇目的地組群的命名空間。

    服務列表

    在服務列表中選擇服務。

添加網關到Sockbin服務的路由

  1. 建立HTTP API,具體操作,請參見建立HTTP API

  2. 單擊目標API,在左上方單擊建立路由

  3. 建立路由面板配置相關參數,然後單擊儲存並發布

    配置項

    說明

    路由名稱

    設定為sockbin-route

    網域名稱

    選擇預設關聯網域名稱*。

    路徑(Path)

    選擇匹配條件為首碼是,Path以/開頭。

    使用情境

    選擇使用情境為單服務

    後端服務

    選擇目標服務以及服務連接埠

結果驗證

本文為您提供兩種方式來驗證WebSocket服務可用性。

方式一:通過Sockbin服務的介面直接進行測試

網關會根據WebSocket握手時攜帶的網域名稱和Path進行路由,使用如下配置訪問網關即可得到Sockbin服務的介面。sockbin服務的介面

方式二:使用各種語言的WebSocket用戶端進行測試

例如,使用Python的WebSocket用戶端來得到一個延遲1秒的服務端響應。

#!/usr/bin/env python

import asyncio
import websockets

async def hello():
    async with websockets.connect("ws://ip_addr/delay/1000") as websocket:
        await websocket.send("Hello Test")
        text = await websocket.recv()
        print(text)

asyncio.run(hello())