代理 WebSocket 连接
WebSocket 是一种在单个 TCP 连接上提供客户端和服务器之间双向通道的协议。它彻底改变了 Web 上的实时通信,可以实时发送和接收数据。该协议广泛用于各种交互式应用程序,包括聊天应用程序、协作编辑工具、多人游戏等。
本指南将向你展示如何使用 APISIX 代理 WebSocket 连接。
前置条件
- 安装 Docker。
- 安装 cURL 以向服务发送请求进行验证。
- 安装 websocat 以建立与 WebSocket 服务器的 WebSocket 连接。
- 按照 快速入门教程 在 Docker 或 Kubernetes 中启动一个新的 APISIX 实例。
启动 WebSocket 示例服务器
启动一个支持 WebSocket 的 示例上游服务器:
- Docker
- Kubernetes
docker run -d \
-p 8080:8080 \
--name websocket-server \
--network=apisix-quickstart-net \
jmalloc/echo-server
为部署 WebSocket 服务器创建一个 Kubernetes 清单文件:
ws-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: ingress-apisix
name: websocket-server
spec:
replicas: 1
selector:
matchLabels:
app: websocket-server
template:
metadata:
namespace: ingress-apisix
labels:
app: websocket-server
spec:
containers:
- name: echo-server
image: jmalloc/echo-server
ports:
- containerPort: 8080
为 WebSocket 服务创建另一个 Kubernetes 清单文件:
ws-service.yaml
apiVersion: v1
kind: Service
metadata:
namespace: ingress-apisix
name: websocket-server
spec:
selector:
app: websocket-server
ports:
- protocol: TCP
port: 8080
targetPort: 8080
type: ClusterIP
将配置应用到你的集群:
kubectl apply -f ws-deployment.yaml -f ws-service.yaml
该服务器在 /.ws 处有一个 WebSocket 端点,它会回显收到的任何消息。
在 APISIX 中创建路由
创建一个指向示例上游服务器的路由并启用 WebSocket:
- Admin API
- ADC
- Ingress Controller
curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d '
{
"id": "ws-route",
"uri": "/.ws",
"enable_websocket": true,
"upstream": {
"type": "roundrobin",
"nodes": {
"websocket-server:8080": 1
}
}
}'
adc.yaml
services:
- name: websocket Service
routes:
- uris:
- /.ws
name: ws-route
enable_websocket: true
upstream:
type: roundrobin
nodes:
- host: websocket-server
port: 8080
weight: 1
将配置同步到 APISIX:
adc sync -f adc.yaml
- Gateway API
- APISIX CRD
ws-route.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
namespace: ingress-apisix
name: ws-route
spec:
parentRefs:
- name: apisix
rules:
- matches:
- path:
type: Exact
value: /.ws
backendRefs:
- name: websocket-server
port: 8080
ws-route.yaml
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
namespace: ingress-apisix
name: ws-route
spec:
ingressClassName: apisix
http:
- name: ws-route
match:
paths:
- /.ws
websocket: true
backends:
- serviceName: websocket-server
servicePort: 8080
将配置应用到你的集群:
kubectl apply -f ws-route.yaml
验证连接
通过路由与 WebSocket 服务器建立连接:
websocat "ws://127.0.0.1:9080/.ws"
在终端中发送一条 "hello" 消息。你应该看到 WebSocket 服务器回显相同的消息:
Request served by 1cd244052136
hello
hello
你可以继续发送更多消息,WebSocket 服务器将回显你发送的任何消息。这表明双向连接已成功并持久。
下一步
你现在已经了解了如何使用 APISIX 代理 WebSocket 连接。如果你想限制 WebSocket 连接的数量,请参阅 limit-conn 插件文档以获取 更多信息。