文档中心>Serverless 应用中心>实践教程>部署互动直播房间服务

部署互动直播房间服务

最近更新时间:2023-07-10 18:06:02

我的收藏

应用介绍

互动直播房间服务是一套业务房间后台服务,可以实现房间列表、房间成员列表、房间用户状态同步等功能。通过 Serverless 方式进行快速部署,配合实时音视频 TRTC、直播、IM 等音视频能力,可以快速搭建社交泛娱乐行业各种场景。

使用场景

腾讯云在 秀场直播/电商直播 提供端云一体的低代码解决方案,通过云函数模板 LiveRoom 创建业务后台、配合移动直播 SDK、即时通信 IM 低门槛快速实现登录、注册、开播、连麦一整套在线直播业务场景。

架构原理


image



应用优势

快速部署:采取云函数模板一键部署,快速实现互动直播房间服务。
定制灵活:根据需要选择对应功能,灵活方便。
使用方便:通过 api 接口的形式直接调用,快速高效。

应用资源

TRTC:提供音视频服务。
IM:提供消息服务。
Redis:存储用户状态。
数据库:存储用户信息。
VPC:保障网络通畅。

注意事项

所有资源要在同一个 VPC 内部,无需使用 VPC 的资源最好在同一个区域。
该服务是 aPaas 的后台服务,需要结合 aPaas 的客户端代码一起使用。

操作步骤

前提条件

您已 注册腾讯云账号,并完成 实名认证

步骤1:新建相关云资源

1. 新建 TRTC 服务 登录 实时音视频控制台,新建一个 TRTC 应用,并记录 SDKAppID 信息。操作详情见 新建应用
说明
TRTC 与 IM 采用同一个 SDKAPPID,在 TRTC 控制台新建应用后会同步在 IM 控制台新建一个应用并开通体验版。
2. 新建 VPC 服务 登录 私有网络控制台,新建私有网络。操作详情见 新建私有网络
3. 新建数据库服务 本文的数据库服务以 Mysql 为例。登录 MySQL 购买页,根据实际需求选择各项配置后进行购买。操作详情见 创建 MySQL 实例
4. 新建 Redis 服务 登录 Redis 控制台,新建 Redis。操作详情见 创建 Redis 实例
说明
通过命令行创建互动直播房间服务时,默认创建 TD SQL。因此您无需新建数据库服务、Redis 服务和 VPC。

步骤2:进行权限授权

1. 配置部署账号权限。详情见 账号和权限配置
2. 配置 运行角色 权限,角色名称为 SCF_QcsRole。
3. 互动直播房间服务要和其他服务关联使用,需要添加以下策略:QcloudRedisFullAccess、QcloudVPCFullAccess、QcloudSCFFullAccess、QcloudAccessForScfRole 权限。详情请参见 策略绑定

步骤3:新建互动直播房间服务

1. 通过以下两种方式部署服务

方案1:通过控制台创建
方案2:通过命令行创建
2. 单击新建应用 ,进入项目创建页面。
3. 选择互动直播房间服务,单击下一步。如下图所示:
image


4. 填写应用基本信息。如下图所示:
image


应用名:新建的应用名称,这里可以自定义。
地域:服务的区域,可以根据实际情况选择
私有网络:VPC 名称。
SDKappid:TRTC 的应用名称,可以在 TRTC 控制台获取。
密钥:TRTC 的密钥,可以在跑通 demo 界面获取到。
数据库地址:用来存储用户信息,这里一般使用 mysql,和 mysql 的地址保持一致即可。
数据库名称:指数据库应用名,保持一致即可。
redis 地址:redis 数据库的访问地址,该数据用来保存用户状态。
5. 单击完成,将为您自动部署应用。
通过命令行创建互动直播房间服务时,默认创建 TD SQL。 基于 腾讯云云函数 环境,小直播提供了一套部署简单、定制性更加灵活的开源服务,只需要四步即刻快速跑通“小直播”后台程序:
1. 下载源码:
git clone https://github.com/TencentServerlessApps/live-room.git
说明
您也可以直接进入我们的 GitHub 仓库 进行下载。
2. 部署准备: 安装最新版本的 Serverless Cloud Framework,详情见 安装 Serverless Cloud Framework
npm i -g serverless-cloud-framework
npm install
说明
Node 安装方法请参见 Node.js,在 Windows 下请使用 Administrator 权限启动 Node.js command prompt,不支持 PowerShell。
3. 开始部署服务:
3.1 live-room 目录下,创建环境变量文件 .env,并输入如下内容:
TRTC_TIM_APPID=xxxxxxxxxxxxxxxx // 此处即上一章节中的记录的SDKAppID;
TRTC_TIM_SECRET=xxxxxxxxxxxxxxxx // 此处即上一章节中的记录的SecretKey
3.2 创建成功后,启动发布,需要扫码授权或配置 本地密钥授权
npm install
sls deploy
说明
Windows 用户,请使用 Administrator 权限启动 Node.js command prompt,否则扫码认证会失败。

2. 检查服务是否部署成功

应用部署成功后,您可以查看项目的部署日志。 从发布日志中获取 API 网关地址,例如 https://service-xxxyyzzz-1001234567.gz.apigw.tencentcs.com,在浏览器中直接打开您的网关地址。如下图所示,即恭喜您,后台服务部署成功!

image


说明
默认 api 接口是免鉴权的,如果对于安全性有较高的要求,可以在网关控制台更改鉴权模式,详情见 选择鉴权方式,建议选择应用鉴权,鉴权算法详情见 应用鉴权

步骤4:apaas 最佳实践

详情见结合互动直播房间 快速跑通小直播

常见问题

如何查看云函数的日志?

查看云函数的日志,请参见 日志检索教程

为何网关返回的是 SystemError (99): Invalid TRTC config

请检查是否正确配置了 TRTC 的 SdkAppId (TRTC_TIM_APPID) 和 Secret (TRTC_TIM_SECRET)。

为何网关和函数无法访问?

请确认是否开通服务,请确认是否账户欠费。

为何 Windows 无法发布云函数?

请使用系统管理员 (Administrator) 启动 Node.js command prompt,请不要用 PowerShell。

如何确认网关新建成功?

在函数详情页中获取 API 网关访问路径,若能在浏览器访问,则网关正常。API 网关访问路径如下所示:
# 链接地址需要为已创建的接口地址
https://service-xxxyyzzz-1001234567.gz.apigw.tencentcs.com/helloworld

如何确认函数新建成功?

在函数详情页中获取函数访问路径,若能在浏览器访问,则网关正常。函数访问路径如下所示:
# 链接地址需要为已创建的接口地址
https://service-xxxyyzzz-1001234567.gz.apigw.tencentcs.com

接口说明

详情见 接口说明

Token 登录

Token 登录可以实现客户端一定时间免登录。客户端可以将 Token 存储在本地,下次使用 Token 登录,避免每次都需要输验证码。
接口地址:/base/v1/auth_users/user_login_token**
请求参数:用户信息,例如:
{
// 用户 (user) 信息
"userId": "xxx-1000019",
"token": "dd243f4.......c32742af3bf6cb",
"apaasUserId": "xxx-1000019" // 多租户
}
特别说明
apaasAppId:若登录到默认租户,可以不传。若非默认租户,必须设置为指定租户。
userId 和 token 是用户的账号(手机号或邮箱等)信息,后台会返回 apaasUserId。
token 有效期是 30 天。
返回值:错误码和鉴权信息
若数据操作失败,返回 ServiceDBFailed (103)。
若 Token 已过期,返回 UserTokenExpired (203)。
若 Token 不正确,返回 UserTokenInvalid (204)。
返回新的 token 和 expire 过期 UTC 时间。
以下信息给 SDK 鉴权使用。
{
"errorCode": 0,
"errorMessage": "login done",
"data": {
"userId": "xxx-1000019",
"sdkAppId": 1400544182,
"sdkUserSig": "eJwtjMEKwjA.............bKC9S",
"token": "9d0dk28r31........c327id192k9f",
"expire": "2021-08-22 06:42:54",
"phone": "+8615800001111",
"email": "xxx@xxx.com",
"name": "", // 新用户用户名为空字符串
"avatar": "https://xxx",
"apaasAppId": "xxx", // 多租户
"apaasUserId": "xxx-1000019" // 多租户
}
}
具体错误码详情见 错误码

注销登录

客户端请求注销登录,会在数据库清除 session 和 token 等信息,但用户信息会保留。
接口地址:/base/v1/auth_users/user_logout**
请求参数:用户信息,例如:
{
"userId": "xxx-1000019",
"token": "dd243f4.......c32742af3bf6cb",
"apaasUserId": "xxx-1000019" // 多租户
}
返回值:错误码和鉴权信息
若数据操作失败,返回 ServiceDBFailed (103)。
若用户不存在,Token 过期,Token 不存在,都返回成功(已经成功注销)。
{
"errorCode": 0,
"errorMessage": "user logout ok"
}
具体错误码详情见 错误码

删除用户

客户端请求删除账号,在数据库清除用户相关的账户和临时登录信息。
接口地址:/base/v1/auth_users/user_delete**
请求参数:用户信息,例如:
{
"userId": "xxx-1000019",
"token": "dd243f4.......c32742af3bf6cb",
"apaasUserId": "xxx-1000019" // 多租户
}
返回值:错误码和鉴权信息
若数据操作失败,返回 ServiceDBFailed (103)。
若 Token 已过期,返回 UserTokenExpired (203)。
若 Token 不正确,返回 UserTokenInvalid (204)。
若用户不存在,返回成功(已经成功删除)。
{
"errorCode": 0,
"errorMessage": "user delete ok"
}
具体错误码详情见 错误码

修改用户信息

用户可以修改用户信息,例如设置用户名,或者绑定邮箱(手机登录),或设置手机号(邮箱登录)。新用户直接登录后,用户名为空,也可以用这个来判断用户是新用户。 客户端请求注销登录,用户的临时信息。
接口地址:/base/v1/auth_users/user_update**
请求参数:用户信息,例如:
{
"userId": "xxx-1000019",
"token": "dd243f4.......c32742af3bf6cb",
"name": "Alice", // 可选
"tag": "im", // 可选
"tag2": "mlvb", // 可选
"avatar": "https://xxx", // 可选
"apaasUserId": "xxx-1000019" // 多租户
}
特别说明
name,用户名,昵称。限制 125 个字符。可以是中文。
tag,用户标签,用户类型等,用作分类用户。
tag2,用户标签 2,用户类型 2 等,用作分类用户。
返回值:错误码和鉴权信息
若数据操作失败,返回 ServiceDBFailed (103)。
若 Token 已过期,返回 UserTokenExpired (203)。
若 Token 不正确,返回 UserTokenInvalid (204)。
若 name/tag/tag2 全部为空,返回 UseInfoEmpty (205)。
若 name 和之前一致,返回成功(设置成功)。
{
"errorCode": 0,
"errorMessage": "update ok"
}
具体错误码详情见 错误码

获取用户信息

用户登录后,可以查询自己以及其他用户的信息。
接口地址:/base/v1/auth_users/user_query**
请求参数:用户信息,例如:
{
"userId": "xxx-1000019",
"token": "dd243f4.......c32742af3bf6cb",
"searchUserId": "200001", // 可选
"searchPhone": "+8618500002222", // 可选
"apaasUserId": "xxx-1000019" // 多租户
}
特别说明
userId 和 token 用来鉴权。若 search 参数没有指定,则获取用户自己的详细信息。
searchUserId:获取指定的用户的信息,按用户 ID(userId)查询。
searchPhone:获取指定的用户的信息,按手机号(phone)查询。
返回值:错误码和鉴权信息
若数据操作失败,返回 ServiceDBFailed (103)。
若 Token 已过期,返回 UserTokenExpired (203)。
若 Token 不正确,返回 UserTokenInvalid (204)。
注意
由于涉及数据安全,该接口不返回 phone 和 email 字段。
{
"errorCode": 0,
"errorMessage": "query done",
"data": {
"userId": "xxx-1000019",
"name": "", // 新用户用户名为空字符串
"avatar": "https://xxx",
"apaasUserId": "xxx-1000019" // 多租户
}
}
具体错误码详情见 错误码

心跳和保活

用户登录后,每隔 10 秒向服务器保活 (KeepAlive)。
用户若掉线,会根据不同的业务定义,更新相关的状态,例如 KTV 会在房主和主播掉线后,将房间设置为不可见。
IM 用户状态回调,也会更新用户的在线状态。
接口地址:/base/v1/auth_users/user_keepalive**
请求参数:用户信息,例如:
{
"userId": "xxx-1000019",
"token": "dd243f4.......c32742af3bf6cb",
"apaasUserId": "xxx-1000019" // 多租户
}
特别说明 userId 和 token 用来鉴权。
返回值:错误码。
若数据操作失败,返回 ServiceDBFailed (103)。
若 Token 已过期,返回 UserTokenExpired (203)。
若 Token 不正确,返回 UserTokenInvalid (204)。
{
"errorCode": 0,
"errorMessage": "keep alive done"
}
具体错误码详情见 错误码

OAuth:用户签名注册

一般客户有自己的用户管理系统,包括用户注册和认证,在 Demo 中也提供了一种注册用户签名的方式,这样可以使用用户签名登录。
接口地址:/base/v1/oauth/register**
请求参数:用户信息,例如:
{
"username": "alice",
"salt": "1e80a39bf9e1cb8e97cdaee2ace85281"
}
特别说明
username:用户名,也可说是 ID 信息,邮箱,或者手机号等等。
salt:使用 password 生成 salt,例如:md5 (username-password)
登录验证时,用 salt 作为 secret:signature=md5 (username-tag-ts-nonce-salt)
生成 salt 和 signature 的 nodejs 例子:
const md5 = require ('md5');
const username = 'user', password = 'xxx';
const salt = md5 (`${username}-${password}`);
const tag = '', ts = '', nonce = '';
const signature = md5 (`${username}-${tag}-${ts}-${nonce}-${salt}`);
返回值:错误码和鉴权信息
以下信息给 SDK 鉴权使用。
{
"errorCode": 0,
"errorMessage": "register ok"
}
具体错误码详情见 错误码

OAuth:用户签名登录

使用固定的 Secret,以及必要的用户信息,对消息签名后,就可以登录系统。
接口地址:/base/v1/oauth/signature**
请求参数:用户信息,例如:
{
"username": "alice",
"signature": "b081b396acc4948019e124294c313396",
"tag": "player", // 可选
"ts": "1634543466000", // 可选
"nonce": "o29dmek", // 可选
"hash": "md5", // 可选
"nickname": "Guest", // 可选
"avatar": "http://tencent.com/xxx.png" // 可选
}
特别说明
username:用户名,也可说是 ID 信息,邮箱,或者手机号等等。
tag:签名的 secret 的标签,可以根据 tag 使用不同的 secret。
ts:签名时的时间戳。例如:1634543466000
nonce:签名使用的随机字符串,也可是自定义 hash。例如:o29dmek
hash:签名使用的算法。例如:md5。
signature:使用 secret 对这些参数签名,例如:md5 (username-tag-ts-nonce-secret)
nickname:用户昵称,例如用来设置到 IM 的。
返回值:错误码和鉴权信息
以下信息给 SDK 鉴权使用。
{
"errorCode": 0,
"errorMessage": "signature ok",
"data": {
"userId": "xxx-1000019",
"sdkAppId": 1400544182,
"sdkUserSig": "eJwtjMEKwjA.............bKC9S",
"token": "9d0dk28r31........c327id192k9f",
"expire": "2021-08-22 06:42:54",
"apaasAppId": "xxx", // 多租户
"apaasUserId": "xxx-1000019" // 多租户
}
}
具体错误码详情见 错误码

获取房间列表

客户端登录后,可以根据 ID 获取房间的详细数据。
接口地址:/base/v1/rooms/query_room**
请求参数:用户信息和房间,例如:
{
// 用户 (user) 信息
"appId": "1400000212",
"userId": "xxx-110016",
"token": "ju121772Kd1n39",
// 房间查询信息
"category": "liveRoom", // 可选
"roomIds": ["xxx-905449688"], // 可选
"startUtc": "2021-09-12 16:00:00", // 可选
"endUtc": "2021-09-13 16:00:00", // 可选
// 分页查询信息
"offset": 0, // 可选
"limit": 100, // 可选
// 多租户
"apaasUserId": "xxx-110016"
}
特别说明
appId:为 TRTC/TIM 的 sdkAppId。由于不同的 sdkAppId 之间的 category 可能重复,因此必须带 sdkAppId 参数。
category,roomIds,startUtc/endUtc,查询参数。
offset,查询的起始索引,默认 0。
limit,查询的最多房间数目,默认 10,不超过 100。
返回值:错误码和房间 ID
{
"errorCode":0,
"errorMessage":"",
"data": [
{
"roomId": "xxx-905449688",
"category": "liveRoom",
"title": "A live room",
"ownBy": "xxx-110016",

错误码

错误码
描述
含义
98
SystemVerifyError
验证用户操作或参数错误。
99
SystemError
后端未知的系统错误。
100
ServiceUnavailable
后端依赖的服务不可用。
101
ServiceResponseInvalid
后端服务返回的结果不符合规范。
102
ServiceSmsFailed
SMS 发送短信服务失败。
103
ServiceDBFailed
DB 错误,SQL 语句执行失败。
104
ServiceUnknownError
服务未知错误。
200
UserCodeInvalid
用户登录失败,错误的验证码。
201
UserCodeExpired
用户登录失败,验证码已过期。
202
UserCodeConsumed
验证码已经使用过了,请重新获取。
203
UserTokenExpired
用户 Token 已经过期,请重新登录。
204
UserTokenInvalid
用户 Token 不正确,请重新登录。
205
UseInfoEmpty
用户的信息为空。
206
UserNotExists
用户不存在。
207
UserEmailInvalid
给用户发送邮件时参数错误。
208
UserQueryParams
用户查询时参数错误。
209
UserQueryLimit
用户查询数据过多,触发限流。
210
UserOAuthParams
用户 OAuth 参数异常。
211
UserAlreadyInRooms
用户已经在房间中。
2000
RoomCreateParams
新建房间时参数错误。
2001
RoomDestroyParams
删除房间时参数错误。
2002
RoomQueryParams
查询房间时参数错误。
2003
RoomLeaveParams
退出房间时参数错误。
2004
RoomNotExists
房间不存在。
2006
RoomsUserExists
用户已经在房间中。