上一篇文章介绍了 Nest 集成 socket.io 和 redis 适配器,不过只适用于在服务器进行部署,如果我们想部署到 serverless 平台上,那么还需要使用 API 网关来代理 ws 协议,这篇就来测试用腾讯云 API 网关来代理 ws 协议与部署到 serverless 的 nest 程序进行通信.
# 创建 API 网关
一般来说,我们部署一个新的 serverless 应用时候就自动为我们创建了一个 API 网关.
前面 manager
项目已经为我们创建过一个 API 网关了,我们在其中添加一个 api 路由.
在 管理API - 新建
中,前端类型选择 ws/wss
, 支持 cors 需要勾选,点击下一步
第二步我们要选择一个 web 函数
# 创建新的云函数用以监听 websocket 协议
这里需要创建一个新的云函数,将之前的代码上传上去用以监听 websocket 协议
需要注意的是,创建云函数时需要指定 WebSocket支持
为 已启用
, WebSocket空闲时间
为 7200
秒, 执行超时时间
也设置为 7200
秒,内存可以尽量大一些,我这里给了 512MB
, 为了节省函数调用次数,在请求多并发这里可以相应设置高一点的并发量.
下面是我的 serverless.yml 配置项,仅供参考
app: testwebsocket | |
stage: dev | |
component: scf | |
name: testwebsocket | |
inputs: | |
src: | |
dist: ./ | |
hook: npm run build | |
exclude: | |
- .env | |
- node_modules | |
- layer | |
src: ./ | |
name: testwebsocket | |
namespace: default | |
entryFile: ./dist/main.js | |
type: web | |
runtime: Nodejs16.13 | |
region: ap-shanghai | |
vpcConfig: # 私有网络配置 | |
vpcId: 'vpc-b5776770' # 私有网络的 Id | |
subnetId: 'subnet-asy3z93z' # 子网 ID | |
layers: #layer 配置 | |
- name: manager-layer # layer 名称 | |
version: 7 # 版本 | |
ignoreTriggers: true |
随后在 API网关
设置里将 /ws
路由的 websocket
转发到该云函数,即完成了所有的配置.
# 测试 websocket
链接
拿第 10 篇文章的代码来测试,将路径改为 API 网关网址 ws://service-mlmh4ts7-1252902543.sh.apigw.tencentcs.com
const url = "ws://service-mlmh4ts7-1252902543.sh.apigw.tencentcs.com"; | |
const socket = io(url,{path:"/ws",transports:["websocket"]}); |
至此,已经链接成功可以通信了.
# 需要注意的事
使用这种方式部署的 websocket 服务和在服务器部署的服务有一定的区别,一般我们采用服务器部署的话,socket.io 是会自动帮我们维持链接的,理论上只要连接上就不会自动断开,但是采用 API 网关部署的应用,客户端链接时间是有上限的,即我们设置的超时时间 7200 秒,大概 2 个小时后端会自动销毁,并且是从第一个客户端连接开始计算.
所以写代码的时候需要把用户掉线重连考虑进去,势必增加了我们的开发工作量.