上一篇文章介绍了 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 配置项,仅供参考

l
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

t
const url = "ws://service-mlmh4ts7-1252902543.sh.apigw.tencentcs.com";
const socket = io(url,{path:"/ws",transports:["websocket"]});

后台

至此,已经链接成功可以通信了.

# 需要注意的事

使用这种方式部署的 websocket 服务和在服务器部署的服务有一定的区别,一般我们采用服务器部署的话,socket.io 是会自动帮我们维持链接的,理论上只要连接上就不会自动断开,但是采用 API 网关部署的应用,客户端链接时间是有上限的,即我们设置的超时时间 7200 秒,大概 2 个小时后端会自动销毁,并且是从第一个客户端连接开始计算.

所以写代码的时候需要把用户掉线重连考虑进去,势必增加了我们的开发工作量.

请我喝杯[咖啡]~( ̄▽ ̄)~*

一个放羊娃 微信支付

微信支付

一个放羊娃 支付宝

支付宝