跳到主要内容

云引擎游戏后端开发指南

提供 TCP 或 UDP 服务

在 leanengine.yaml 中可以配置额外的端口:

leanengine.yaml
extraPorts:
- name: echo
protocol: udp
containerPort: 4000
- name: game
protocol: tcp
containerPort: 4000

最多可以配置 5 个端口。

外网连接

你需要使用 REST API 小节中的接口来获取到外网连接的 IP 和端口,然后可以使用客户端连接,这里我们以 nc 为例:

$ nc -u 106.75.70.96 11348
hello
hello

平滑关闭

在版本更新、容量调整、系统自动进行调度,你的应用进程需要被关闭时,云引擎会向你的进程发送 SIGTERM 信号,并等待最长 60 分钟的时间。

你的程序应该处理 SIGTERM 信号(否则默认行为是立即退出),根据业务逻辑(如是否还有客户端连接)尽快主动退出。

func main() {
go func() {
sigTermChan := make(chan os.Signal, 1)
signal.Notify(sigTermChan, syscall.SIGTERM, syscall.SIGINT)
sig := <-sigTermChan

log.Println("Received signal", sig)

// 等待现有业务逻辑(如客户端连接)运行结束
time.Sleep(60 * time.Second)

// 主动退出程序
os.Exit(0)
}()

// 其他业务代码
}

如果你的程序没有在 60 分钟内主动退出,则云引擎会强制停止你的程序。

如果有 3 倍以上于常规实例数量的实例处于平滑关闭状态(terminating),再进行部署时会失败,你需要额外传入一个 forceStopOldInstances 选项来强制关闭最早的几个处于平滑关闭状态的实例:

$ tds deploy --options 'forceStopOldInstances=true'

REST API

接口鉴权功能
GET /1.1/engine/containers仅开发者可用获取正在运行的实例列表
GET /1.1/engine/gateway/route客户端可用随机返回一个实例的连接信息

所有接口 都需要发送 X-LC-Id 头,如 X-LC-Id: SJjoXHWuhewHKV4Ojw

仅开发者可用 的接口需要在 Authorization 头中发送 Access Token,如 Authorization: Bearer 14d1c1ff-908b-4a2c-baec-427cbde3bf05

GET /containers

这个接口会返回所有运行中的实例列表,开发者可以基于这个接口来实现自定义的路由逻辑,比如将特定的用户分配到同一个实例上。

$ curl -H 'X-LC-Id: SJjoXHWuhewHKV4Ojw' \
-H 'Authorization: Bearer 14d1c1ff-908b-4a2c-baec-427cbde3bf05'\
'https://shared.cloud.tds1.tapapis.cn/1.1/engine/containers?groupName=udp&prod=1'

[
{
"name": "web3-219ebd3e",
"prod": 1,
"status": "running",
"extraPorts": [
{
"name": "game",
"protocol": "udp",
"publicPort": 19766,
"publicIp": "106.75.70.96"
}
],
"versionTag": "20220606-152341"
},
{
"name": "web3-b102392b",
"prod": 1,

"createdAt": "2022-06-06T07:23:47.000Z",
"forceStopAfter": "2022-06-06T07:24:27.000Z",

"status": "terminating",
"extraPorts": [
{
"name": "game",
"protocol": "udp",
"publicPort": 18288,
"publicIp": "106.75.70.96"
}
],
"versionTag": "20220606-144209"
}
]

响应中会同时包含正常运行(running)和正在平滑关闭(terminating)的容器,其中 extraPorts 部分就是可供终端设备连接的外部 IP 和端口。

GET /gateway/route

这个接口不需要鉴权,会随机返回一个 running 状态的容器的连接信息,用于开发者不希望自行开发路由接口时直接在客户端使用。

$ curl -H 'X-LC-Id: SJjoXHWuhewHKV4Ojw' \
'https://shared.cloud.tds1.tapapis.cn/1.1/engine/gateway/route?groupName=udp&prod=1'

[
{
"name": "game",
"protocol": "udp",
"publicPort": 19766,
"publicIp": "106.75.70.96"
}
]