配置 WebSocket 代理
WebSocket 通过单个 TCP 连接提供持久的双向通信。它常用于实时数据源、聊天、协作应用,以及其他实时交换数据的工作负载。
API7 企业版可以代理初始 HTTP 升级请求,并保持由此建立的 WebSocket 连接。本指南将配置指向 WebSocket 上游的路由,并验证通过网关的双向流量。
前置条件
- API7 企业版实例正在运行。
- 已创建网关组且网关实例正在运行。
- 按照从控制台获取 Token中的步骤准备一个 Token。
- 已在运行示例上游的环境中安装 Docker。
- 已在用于验证的客户端上安装 websocat。
- 如果使用 ADC 配置,请确保 ADC 已安装并连接到目标网关组。
启动 WebSocket 示例服务器
将 GATEWAY_CONTAINER 设置为正在运行的 API7 网关容器。创建专用网络,并将网关连接到该网络:
export GATEWAY_CONTAINER=replace-with-gateway-container-name
docker network create gateway-websocket-net
docker network connect gateway-websocket-net "$GATEWAY_CONTAINER"
在共享网络中启动固定版本的 WebSocket 示例服务器:
docker run -d \
--name websocket-server \
--network gateway-websocket-net \
jmalloc/echo-server:v0.3.7
服务器在 /.ws 公开 WebSocket 端点,并回显收到的所有消息。
对于非 Docker 部署的网关,请在网关可访问的位置运行示例服务器,并在上游配置中将 websocket-server 替换为该地址。
在路由上启用 WebSocket
WebSocket 代理按路由启用。将 enable_websocket 设置为 true 后,网关会处理初始 HTTP Upgrade 握手并维持连接。
为示例上游创建服务,并创建将 enable_websocket 设置为 true 的路由:
对于 Admin API 配置,请导出控制台 Token,并将 {gateway_group_id} 替换为目标网关组 ID。快速入门创建的网关组使用 default。
export API_KEY=replace-with-dashboard-token
- Admin API
- ADC
创建服务:
curl -k "https://localhost:7443/apisix/admin/services/websocket-service?gateway_group_id={gateway_group_id}" -X PUT \
-H "X-API-KEY: ${API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"name": "websocket-service",
"upstream": {
"type": "roundrobin",
"nodes": [
{
"host": "websocket-server",
"port": 8080,
"weight": 1
}
]
}
}'
创建路由:
curl -k "https://localhost:7443/apisix/admin/routes/websocket-route?gateway_group_id={gateway_group_id}" -X PUT \
-H "X-API-KEY: ${API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"name": "websocket-route",
"paths": ["/.ws"],
"service_id": "websocket-service",
"enable_websocket": true
}'
adc.yaml
services:
- name: websocket-service
labels:
docs-example: websocket-proxy
upstream:
nodes:
- host: websocket-server
port: 8080
weight: 1
routes:
- name: websocket-route
uris:
- /.ws
enable_websocket: true
ADC 将服务协调为期望状态。预览本示例拥有的变更,并确认差异中没有非预期的更新或删除:
adc diff -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=websocket-proxy
同步已审查的服务配置:
adc sync -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=websocket-proxy
验证连接
通过 API7 网关建立连接:
websocat "ws://127.0.0.1:9080/.ws"
发送 hello。服务器应回显该消息:
Request served by <container-id>
hello
hello
成功建立连接并收到回显消息,表明网关已完成协议升级,并在两个方向上代理流量。
后续步骤
WebSocket 流量可以使用应用于 HTTP 升级请求的相同身份认证、流量管理和可观测性功能。
- 配置 gRPC 代理——了解如何处理 gRPC 流量和转码。
- 配置 GraphQL 代理——探索感知 GraphQL 的流量管理。