更新时间:2026-01-09 gmt 08:00

配置函数的websocket连接-j9九游会登录

本章节介绍通过函数工作流控制台,配置函数的websocket连接。

websocket连接概述

在functiongraph中,可以通过配置apig触发器,使函数能够响应websocket请求。配置完成后,相关联的函数可以作为一个web服务器,处理websocket连接和消息,并将结果返回给客户端。适用于长连接、实时消息收发和实时数据监控等场景,能够实现高效的实时通信和数据交互。

使用websocket的计费方式与使用http的计费方式完全一致,可以将websocket看作连接时间较长的http调用。关于计费的更多信息,请参见函数工作流计费概述

约束与限制

  • 仅http函数支持配置websocket,事件函数不支持配置。
  • websocket配置当前仅支持“华东-上海一”区域使用。
  • functiongraph在设置执行超时时间时,不区分websocket请求和http请求。若websocket连接的持续时间超过设定的执行超时时间,该连接将被强制关闭,客户端将接收到1006状态码。

步骤一:创建http函数

  1. 登录,在左侧的导航栏选择“函数 > 函数列表”。
  2. 单击右上方的“创建函数”,进入“创建函数”页面。
  3. 选择“创建空白函数”,参考表1配置函数信息。
    表1 函数配置

    参数

    说明

    取值样例

    函数类型

    选择函数类型,配置websocket连接需创建http函数:

    http函数:处理http请求的函数,可以直接发送http请求到url触发函数执行,从而使用web服务。仅functiongraph v2版本支持创建http函数。

    http函数

    区域

    选择要部署代码的区域。

    当前websocket配置仅支持“华东-上海一”区域。

    华东-上海一

    函数名称

    填写函数名称,命名规则如下:

    可包含字母、数字、下划线和中划线,长度不超过60个字符。以大/小写字母开头,以字母或数字结尾。

    websocket-demo

    企业项目

    选择函数所属的企业项目。企业项目是一种云资源管理方式,企业项目管理服务提供统一的云资源按项目管理,以及项目内的资源管理、成员管理。

    默认选择“default”,支持用户选择已创建的企业项目。如果没有开通企业管理服务,将无法看到企业项目选项。开通方法请参见。

    default

    委托

    选择函数的委托。通过委托函数工作流来访问其他云服务,例如:如果函数需要访问lts、vpc等服务,则必须选择包含所需服务权限的委托;若函数不访问任何云服务,则无需选择委托。

    默认“未使用任何委托”,支持选择已创建的委托。

    当华为云账号下无函数默认委托时,functiongraph提供快速创建默认委托“fgs_default_agency”的功能,详情请参见默认委托

    未使用任何委托

    高级设置

    • 函数访问公网:开启后允许函数访问公网上的服务,其公网访问带宽为用户间共享。
    • 函数访问vpc内资源:开启时,函数将使用配置的vpc所绑定的网卡进行网络访问同时禁用函数工作流的默认网卡。

    函数访问公网:开启

    函数访问vpc内资源:未开启

  4. 配置完成后单击“创建函数”,页面跳转至函数详情配置页面。

步骤二:配置函数代码

  1. 在函数详情页的“代码”页签下,打开“index.js”文件,使用代码编辑器复制以下代码并部署,部署完成后如图1所示。
    const websocket = require('ws'); 
    const websocketserver = websocket.server;  
    const wss = new websocketserver({     
        host: '127.0.0.1',     
        port: 8000,     
        path: '/websocket_demo' 
    });  
    // 用于存储所有已连接的客户端 
    const clients = new set(); 
    wss.on('connection', function connection(ws) {     
        // 当有客户端连接时,添加到客户端集合中     
        clients.add(ws);     
        console.log('client connected');      
        // 处理客户端发送的消息     
        ws.on('message', function incoming(message) {         
            console.log('received: %s', message);     
        });      
        // 处理连接关闭     
        ws.on('close', () => {         
            console.log('client disconnected');         
            // 从集合中移除断开连接的客户端         
            clients.delete(ws);     
        }); 
    });  
    // 定时向所有客户端发送消息 
    setinterval(() => {     
        // 遍历所有客户端并发送消息     
        for (let ws of clients) {         
            if (ws.readystate === websocket.open) {             
                ws.send('server time: '   new date().totimestring());         
            }     
        } 
    }, 2000); // 每2秒执行一次  
    console.log('websocket server is running on ws://127.0.0.1:8000/websocket_demo');
    图1 index.js文件

    websocket server监听的ip地址是127.0.0.1,监听的端口号默认值为8000端口。

  2. 在“bootstrap”文件中编写如下内容,完成后如图2所示。
    /opt/function/runtime/nodejs12.13/rtsp/nodejs/bin/node $runtime_code_root/index.js
    图2 bootstrap文件
  3. 返回函数工作流控制台,如图3所示在左侧的导航栏选择“函数 > 依赖包管理”,单击“创建依赖包”
    图3 依赖包管理
  4. “wss-nodejs12”文件,在“创建依赖包”界面如图4所示上传并配置websocket依赖包信息,填写完成后单击“创建”
    图4 创建依赖包
    表2 创建依赖包

    参数

    参数说明

    取值样例

    依赖包名称

    自定义填写依赖包的名称。

    以大/小写字母开头,以字母或数字结尾。

    可包含字母、数字、下划线、点和中划线,长度不超过96个字符。

    depend-websocket

    运行时

    选择依赖包的运行时。

    node.js 12.13

    代码上传方式

    选择代码上传方式。支持“上传zip文件”或通过obs链接“从obs上传文件”

    上传zip文件

    文件上传/obs链接

    • 代码上传方式为“上传zip文件”:单击“添加文件”上传打包为zip格式文件的依赖包。上传的zip文件大小限制为10m,超过10m请使用从obs上传文件。
    • 代码上传方式为“从obs上传文件”:填写指向代码文件对象的obs对象url,需将对象放入与函数在同一区域下的obs桶中,该对象必须为zip格式文件。可参考通过url访问obs对象复制所需的代码文件对象url。

    添加文件,并上传4下载的“wss-nodejs12”文件

    描述

    填写依赖包的描述说明。

    -

  5. 返回“websocket-demo”函数详情页,在“代码”页签最下方的“代码依赖包”模块,单击“添加依赖包”
  6. 在选择依赖包弹窗中,依赖包源选择“私有依赖包”,添加4创建的“depend-websocket”依赖包,单击“确定”完成依赖包添加。
  7. 选择“设置 > 高级设置”,如图5所示开启“websocket”参数开关。
    图5 开启websocket

步骤三:创建apig专享版实例

请根据业务需要,参考创建apig实例购买所需规格的专享版apig实例。

购买过程中请参照以下注意事项:
表3 创建apig实例注意事项

参数

说明

区域

选择与所创建函数一致的区域。

公网入口

  • 如使用步骤五:测试函数进行本地测试,则需“开启公网入口”,请根据实际需求选择入公网带宽。
  • 如在生产环境中使用vpc内访问函数的websocket特性,则无需“开启公网入口”。

网络

如在生产环境中使用可配置函数访问vpc,并在此参数中配置与函数相同的vpc与子网。

步骤四:创建apig触发器

  1. 选择“设置 > 触发器”,单击“创建触发器”,参考表4创建一个api 网关服务 (apig专享版)触发器。
    表4 apig专享版触发器参数说明

    参数

    说明

    取值样例

    触发器类型

    必选参数。

    选择“api网关服务(apig专享版)”。

    api网关服务(apig专享版)

    实例

    必选参数。

    选择apig专享版实例。若无实例,可单击“创建实例”完成创建。

    apig-ws

    api名称

    必选参数。

    填写专享版apig触发器的名称。支持汉字、英文、数字和下划线,且只能以英文和汉字开头,3-64字符。

    api_websocket_demo

    分组

    必选参数。

    选择api分组。api分组可以视为一组api的集合,api提供方以api分组为单位,管理分组内的所有api。

    若未创建分组,可单击“创建分组”完成创建,创建完成单击右侧即可。

    apigroup_ws

    发布环境

    必选参数。

    选择api的发布环境。api可以同时提供给不同的场景调用,如生产、测试或开发,选择“release”,才能调用。

    若未创建环境,可单击“创建发布环境”完成创建。

    release

    安全认证

    必选参数。

    api认证方式有以下三种方式:

    • app: 采用appkey&appsecret认证,安全级别高,推荐使用,详情请参见。
    • iam: iam认证,只允许iam用户能访问,安全级别中等,详情请参见。
    • none: 无认证模式,所有用户均可访问。
      注意:

      当前示例中安全认证选择“none”,实际业务使用推荐选择安全级别高的认证方式。

    none

    请求协议

    必选参数。

    在使用websocket时https对应wss,http对应ws。

    api的请求协议分为两种类型:

    • http:数据在传输过程中不被加密。
    • https:数据在传输过程中被加密。

    https

    请求方法

    必选参数。

    如需使用websocket协议,请求方法至少需要支持get。

    支持的请求方法:get、post、delete、put、patch、head、options、any。

    get

    后端超时(毫秒)

    必选参数。

    设置api的后端超时时间,单位为毫秒,设置范围为1~60000毫秒。

    后端超时时间表示websocket的最大空闲连接时间,例如设置为5000毫秒,即当websocket超过5000毫秒未收发消息时,连接断开。

    5000

  2. 图6所示,创建成功后单击已创建的触发器名称,进入apig服务界面。
    图6 apig触发器

    apig触发器创建成功后,访问地址不会变更。

  3. 在api实例详情界面,如图7所示单击“编辑”,进入编辑api界面 。
    图7 编辑api
  4. 单击“下一步”“默认后端”页签,如图8所示配置api参数,单击“完成”
    • 后端服务类型:选择“functiongraph”
    • 网络架构:选择“v2”。(如没有此参数,请向apig服务开启白名单配置)
    • 调用类型:选择“synchronous”。websocket场景下,api的后端调用类型只支持synchronous同步调用。
      其他参数保持默认即可。
      图8 编辑api默认后端
  5. 返回api实例详情界面,如图9所示单击“发布最新版本”
    图9 发布最新版本api

步骤五:测试函数

  1. 返回函数工作流控制台,进入函数详情页面,选择“设置 > 触发器”,复制apig触发器的访问地址。
    图10 复制apig触发器url
  2. 使用postman测试函数的正确性。
    1. 在postman中创建websocket请求。将apig触发器的调用url复制到postman中,并将scheme由https变更为wss。
    2. 根据业务需求配置params和headers参数。
    3. 连接websocket,连接成功后即可发送消息,可查看消息接收情况。
    4. 超过执行超时时间后,会断开与websocket服务器的连接。
      图11 websocket测试

websocket相关说明

  • 连接保活和超时重连

    当websocket连接建立后,除连接持续时间超过设定的执行超时时间会导致连接断开外,函数工作流不会干预任何逻辑。若在存续期间,您的websocket连接在特定时段内无数据传输,该连接可能被网络中间节点(例如nat网关)关闭。在该场景下,您需要利用websocket协议的ping、pong帧来保持连接活动或验证websocket连接的有效性。

    若业务需求超出函数工作流所能提供的最大请求超时时间,或应用需要在运行期间保持逻辑上的连接稳定,建议在客户端代码中加入超时重连机制。可使用库或库以实现该机制。

  • 会话亲和性

    functiongraph作为无服务器计算平台,其函数实例采用请求触发式生命周期管理。在高并发场景下,系统通过自动扩缩容机制创建多个实例副本以应对流量压力,但无法保证同一客户端的连续请求路由至固定实例。对于需要维持会话状态的websocket应用,推荐采用redis、kafka、数据库等外部存储系统实现跨实例的状态同步。

    例如,在聊天室应用中,由于函数工作流无法保证所有用户同时连接到同一个函数实例,因此可以利用redis的发布订阅功能来实现消息广播。当用户加入一个聊天室时,函数会订阅该聊天室对应的频道。当用户发送消息时,函数会将消息发布到redis中该聊天室对应的频道。由于同一聊天室的所有用户都已订阅了该频道,因此所有用户都会接收到该消息。

相关文档

网站地图