使用指引

本文将引导如何创建第一个云托管服务,部署发布,并在小程序和 Web 端调用云托管服务。

第一步:代码容器化

代码容器化为必须步骤,否则无法将代码构建成镜像部署到容器实例上。

代码包准备

微信云托管支持多种开发语言,我们提供如下的开发语言示例代码包下载,除此以外,任意的其他开发语言也可支持。

以 Node.JS 语言为例,进行如下的步骤手动创建一个示例。

  1. 创建一个空目录,本示例中为 helloworld
mkdir helloworld
cd helloworld
  1. 安装所需依赖
npm init -y
npm install express --save
  1. 创建 index.js 并写入示例内容

示例代码返回接收到 headers,并且提供了获取用户 openid 和 unionid 的示例,可在此文档查看所有微信特殊 header。

const express = require("express");
const app = express();

app.get("/", (req, res) => {
  console.log("Hello world received a request.");

  res.send(
    JSON.stringify({
      // 查看所有的 headers
      headers: req.headers,
      // 获取用户的 openid
      // 此处使用小写访问是因为 node 中的 req.headers 默认转成了小写,原 header 输入是大写的
      openid: req.headers["x-wx-openid"],
      // 获取用户的 unionid(如果满足 unionid 获取条件)
      unionid: req.headers["x-wx-unionid"],
    })
  );
});

// 监听端口:容器需要针对一个端口监听 HTTP 请求,从而让小程序的请求访问到容器内部
const port = process.env.PORT || 80; // 此处要与新建版本时的端口号相同
app.listen(port, () => {
  console.log("Hello world listening on port", port);
});
  1. 创建 Dockerfile 并写入内容
# https://hub.docker.com/_/node
FROM node:12-slim

# Create and change to the app directory.
WORKDIR /usr/src/app

# Copy application dependency manifests to the container image.
# A wildcard is used to ensure both package.json AND package-lock.json are copied.
# Copying this separately prevents re-running npm install on every code change.
COPY package*.json ./

# Install production dependencies.
RUN npm install --only=production

# Copy local code to the container image.
COPY . ./

# Run the web service on container startup.
CMD [ "npm", "start" ]
  1. (可选)使用云托管本地调试功能在本地测试服务

到此,即可完成代码包的创建。除 Node.JS 外,云容器还支持其他的后端语言,具体可以参照 Docker 的官方文档进行镜像包的构建。

  • Dockerfile文件语法。了解更多Dockerfile文件语法可查看Dockerfile 官方文档 以及 Dockerfile 的最佳实践

  • 基础镜像。基础镜像(示例中:FROM node:12-slim)可在Docker Hub 上查找,如有符合业务的基础镜像在Dockerfile文件中直接引用即可;

  • 依赖项。尽量减少依赖项的使用,在冷启动期间加载这些模块会增加延迟时间。

配置文件

在代码的根目录下可放置 container.config.json 文件用于指定容器相关的配置,可根据业务实际需要进行修改。

{
	// 监听端口
	"containerPort": 80,
	// Dockerfile 路径
	"dockerfilePath": "Dockerfile",
	// 构建目录
	"buildDir": "",
	// 最小实例数
	"minNum": 0,
	// 最大实例数
	"maxNum": 50,
	// cpu 核数
	"cpu": 0.25,
	// 内存大小,单位:G
	"mem": 0.5,
	// 扩缩容指标类型
	"policyType": "cpu",
	// 扩缩容指标阈值
	"policyThreshold": 60,
	// 环境变量
	"envParams": {},
	// 日志采集路径
	"customLogs": "stdout",
	// 启动检测延迟
	"initialDelaySeconds": 2
}
  • 使用流水线时,配置文件必填,否则流水线会创建失败;
  • 如使用版本列表中的「新建版本」,容器配置将按照新建版本中的高级配置生效,当前配置内容不生效;

第二步:创建云托管服务

进入微信云托管控制台,扫码选择目标小程序登录,创建云托管环境;

创建成功后,将进入当前环境的服务管理页面;点击「新建服务」,如允许公网访问服务,开启即可;

第三步:创建服务版本

创建服务版本有两种方式:新建流水线、新建版本;

新建流水线

选择目标服务,点击「管理」进入服务部署发布页面中,选择「新建流水线」或进入「流水线」中点击「新建流水线」;

授权云托管拉取代码仓库权限,按需配置触发条件及发布策略等;

  • 授权后,云托管仅在流水线被触发时按代码仓库地址拉取代码,不做其他行为,请放心使用;
  • 如代码未容器化,缺少配置文件、Dockerfile 文件,流水线会新建失败或无法执行流水线任务;

流水线新建成功后将在页面生成一个流水线卡片,可点击「启动 icon」手动触发流水线生成一个任务单;流水线产物会分别显示在「镜像仓库」和「版本列表」中;

新建版本

选择目标服务,点击「管理」进入服务部署发布页面中,选择「新建版本」或进入「版本列表」中点击「新建版本」;

云托管新建版本支持选择镜像、代码库拉取、上传代码包三种方式;相关概念问题可查看云托管概念文档;

第四步:部署发布

版本新建完成后,前往「发布管理」中进行版本发布。

点击「发布」即生成一个发布单;首次发布时,全量发布即可;

非首次发布,可进入测试对目标发布版本进行验证,验证无问题后,灰度上线;

可根据需要调整流量比例,当流量比例达到 100%时可对当前发布单进行结单,回到发布管理页面。

第五步:调用云托管服务

首先,确认当前调试基础库版本为 2.13.1 以上。可以在开发者工具-详情-本地设置中查看当前的基础库版本。

img

在小程序中,使用如下的代码就可以调用云托管容器:

// 确认已经在 onLaunch 中调用过 wx.cloud.init 初始化环境
const res = await wx.cloud.callContainer({
  config: {
    env: '填入云环境 ID',
  },
  path: '/xxx', // 填入业务自定义路径和参数
  method: 'POST',
  header: {
    'X-WX-SERVICE': 'xxx', // 填入服务名称(微信云托管 - 服务管理 - 服务列表 - 服务名称)
  }
  // 其余参数同 wx.request
});

console.log(res);

在 Web 端,可以使用如下代码进行调用:

// 初始化 Cloud 实例
// 容器调用必填环境id,不能为空
var c1 = new wx.cloud.Cloud({
  resourceEnv: "云环境 ID",
});
await c1.init();

// 返回值同 wx.request
const res = await c1.callContainer({
  path: '/xxx', // 填入业务自定义路径
  method: 'POST',
  header: {
    'X-WX-SERVICE': 'xxx', // 填入服务名称(微信云托管 - 服务管理 - 服务列表 - 服务名称)
  }
  // 其余参数同 wx.request
});

console.log(res);

重新编译后,在控制台看到如下的输出,说明调用已经成功:

img

如果开通了服务的公网访问能力(微信云托管 - 服务管理 - 服务详情 - 允许公网访问),可以直接访问相应公网地址测试。

也可本地构建服务容器在本地调试

链接其他能力

  • 如已在腾讯云账号中创建数据库/Redis/存储等云资源,且对应的实例地域为上海,则在创建云托管环境时,选择私有网络并选择上海地域的VPC,则该创建的环境云资源均会分配到该VPC下,以达到同VPC下资源访问。

  • 如未在腾讯云账号创建数据库/Redis/存储等云资源,想使用更多腾讯云云服务,则创建腾讯云云服务时选择云托管目标环境下的VPC(创建云托管环境时无私有VPC,云托管会给该环境系统创建一个VPC,可在环境设置中查看VPC信息)