微信云托管能力特性之腾讯云服务互联实践:连接腾讯云Redis
在使用微信云托管时,可以通过内网连接其他腾讯云产品以满足场景的需求。云托管中的腾讯云VPC目前支持腾讯云上海地域。
实践任务: 本次实践将在云托管中部署一个连接腾讯云Redis数据库一个计数器。具体步骤有:购买云资源、本地调试代码、部署。
实践说明: 实践侧重于对云资源的相关操作,计数器项目的简介会在补充资料,部分未覆盖到的产品可以自行寻找相应资料 。步骤设计为讲述方便,实际操作时可以先在本地测试完毕后再前往购买云资源。本次使用官方express框架模板进行构建,在开始前,请下载本次过程的代码“Redis计算器”:
- 官方项目仓库:微信云托管 express 框架模版 (github.com)
- Redis计算器:express-counter-redis (gitee.com)
实践环境要求:
其中,Git和Redis都是可选的,如果您当前本地开发环境没有Git,就使用代码包上传;如果没有Redis,可以跳过实践中的本地测试环节;
- Docker:Get Docker | Docker Documentation
- NodeJS:下载 | Node.js (nodejs.org)
- (可选)Git:Git - Downloads (git-scm.com)
- (可选)Redis:Redis
一、创建环境、购买Redis数据库资源
(一)部署示例项目、创建数据库
本节供参考的文档:
- 如何创建多个环境:创建环境
如当前存在生产环境,可以在控制台中创建一个测试环境
选择express示例项目,该步的目的是使用官方模板部署脚本协助创建数据库。
(二)购买同VPC下的Redis数据库资源
创建数据库时需要区分云托管环境的VPC及业务可用区。在本实践中选择把Redis连接在当前环境VPC的MySQL数据库子网中。
本节供参考的文档:
- VPC简介:私有网络VPC-腾讯云 (tencent.com)
- 腾讯云Redis数据库:腾讯云Redis数据库
1. 获取当前环境VPC及MySQL数据库相关信息
本示例的环境中VPC的ID为:vpc-0mmb1azq
在控制台左侧边栏中点击:“设置” -> “环境设置”,记录显示信息中的“网络”内容。
在控制台左侧边栏中点击:“MySQL”,记录网络信息中的“网络”内容
本示例的MySQL所处的VPC子网ID为:vpc-0mmb1azq/subnet-5gnv1tp9
数据库连接:
- sh-cynosdbmysql-grp-7lchxweu.sql.tencentcdb.com:26760
- 10.0.224.9:3306
2. 进入当前账号的腾讯云的Redis实例控制台
在控制台左侧边栏中点击:“费用中心” -> “充值与账单” 进入腾讯云控制台,然后在控制台左上角点击"云产品" ,找到“云数据库Redis”。
3. 在腾讯云的私有网络控制台中查看VPC所在地域信息
此步骤为获取微信云托管为我们创建的VPC子所在可用区的信息
当前数据库子网VPC的ID为:vpc-0mmb1azq/subnet-5gnv1tp9
可用区为:上海二区
在私有网络控制台中,找到当前云环境VPC的ID,点击列表中子网的数字进入当前VPC的子网列表,找到当前环境VPC下MySQL数据库的子网ID,查看列表中的“可用区”一项信息
4. 选购对应的腾讯云Redis资源
此步骤较为重要,请仔细阅读。购买Redis时,将IPv4选择在当前环境VPC的MySQL数据库子网中。进入Redis控制台的步骤可以参照上面第2步,Redis实例的配置清单如下:
选购及选购清单说明:
- 选购的性能规格视实际而定,此处为测试选购价格最低的
本节供参考文档:
Redis控制台: Redis-实例列表
- 选择对应的可用区及VPC网络
当前数据库子网VPC的ID为:vpc-0mmb1azq/subnet-5gnv1tp9
可用区为:上海二区
- 选择安全组,放开Redis的端口,免密码认证
因为此处VPC不对外暴露,选择默认安全组或在自定义安全组配置中放开相应端口即可
本节供参考文档:
- 安全组文档:云服务器 安全组问题
- 安全组控制台:安全组控制台 (tencent.com)
在Redis实例控制台中获取实例内网IP:
购买完毕后,会有弹窗前往控制台。创建完毕后在实例列表的“网络”项会显示Redis的内网地址。我们保存一下地址
二、配置云托管及本地测试中的环境变量
(一)在微信云托管服务列表中配置环境变量:
本实践中配置变量主要为了让应用获取不同运行环境中的数据库信息,此处的几个变量及描述如下:
- REDIS_HOST:Redis的主机ipv4地址;
- REDIS_PORT:Redis的端口;
- REDIS_PASSWORD:Redis的密码;
在本实践中,使用了腾讯云的Redis数据库,部署在同一VPC内网中,根据上一步骤中获取的Redis地址填写;
(二)配置本地模拟测试项目的环境变量测试
具体的数据库信息配置取决于您当前的开发环境,MySQL需要连接到微信云托管的数据库中,连接信息在上面已经获取,同时,因为root账号不允许通过远程连接,需要创建子账号,可参考以下资料,在本项目中提供了Windows开发环境中的临时环境变量配置。
本节供参考文档:
- 创建可供远程访问的子账号:创建数据库并创建子账号-(二)数据库创建-创建数据库并创建子账号
- 在VS-Code中安装云托管调试插件:本地调试
- 通过VS-Code插件打通线上VPC测试:六、本地打通线上-VPC-调试 | 微信开放文档 (qq.com)
配置项目测试启动脚本
在测试项目中根目录的 run.bat
文件中补充数据库信息,该文件仅为了模拟在一定环境变量下启动项目,您可以根据当前开发环境对启动方式进行变更,Windows环境下示例:
set MYSQL_USERNAME=crmeb
@REM MySQL数据库用户名
set MYSQL_PASSWORD=xeWmJ466
@REM MySQL数据库密码
set MYSQL_ADDRESS=sh-cynosdbmysql-grp-dl*w.sql.tencentcdb.com:29151
@REM MySQL数据库地址
set REDIS_HOST=localhost
@REM Redis数据库主机IP
set REDIS_PORT=6379
@REM Redis数据库端口
set REDIS_PASSWORD=
@REM Redis数据库密码
if not exist package-lock.json (
npm install && node ./index.js
) else (
node ./index.js
)
使用官方VS-Code插件接入VPC
在项目container.config.json
中配置数据库连接信息
{
//...省略
"envParams": {
"MYSQL_ADDRESS" : "10.0.224.16:3306",
"MYSQL_USERNAME" : "crmeb",
"MYSQL_PASSWORD" : "xeWmJ466",
"REDIS_HOSTNAME" : "",
"REDIS_PORT" : "",
"REDIS_PASSWORD" : "",
"REDIS_SELECT" : 0
},
//...省略
}
三、 本地测试及部署
(一)本地测试
1. 运行测试
通过脚本启动
完成配置后,Windows下运行命令
./run.bat
工作正常,进行构建测试
2. 构建测试
docker build -t counter:1.0 .
本地构建测试成功,现在可以通过官方VS-Code插件模拟线上环境测试
3. 模拟线上环境测试
使用官方VS-Code插件接入VPC前需要先按照官方教程配置VSCode插件,除必要的配置外,还需要以下操作配置模拟启动的环境变量
在插件中配置VPC中的代理节点, 启动完成后,将本地项目启动即可
工作正常,可以将代码拉到云托管
默认端口为:
27081
,即访问http://127.0.0.1:27081/
,端口可以在插件设置中进行更改。在访问时,明显感觉到了网络延迟。
(二)在微信云托管部署
部署过程可以参考自身情况选择合适方式,下图通过Git仓库拉取源码,在云托管中构建。
本节供参考资料:
- 部署及发布过程:部署发布 | 微信开放文档 (qq.com)
效果:
四、补充资料
(一)Redis计数器说明
本文代码中的Redis连接方式仅为参考、练习使用
该计数器在官方Express框架示例项目 基础上进行了修改,通过 [ioredis](ioredis - npm (npmjs.com)) 库对Redis进行操作,细节可以参考仓库文件,改变文件有两处:
- 在
db.js
中获取全局变量中的redis连接信息,并返回Redis操作实例; - 在
index.html
及index.js
中进行调整以展示及操作数据;
(二)拓展练习
在我发布的上一个lab中,留下了两个影响使用及扩缩容的问题:
- MySQL数据库版本不适当;
- Redis应独立;
两个问题均可以通过本文的方式进行优化,最后附上修改的思路:
- 修改
.env
文件,使其读取系统环境变量中的数据库配置信息
- 修改项目中的
container.config.json
{
//...省略
"envParams": {
"MYSQL_HOSTNAME" : "10.0.224.16",
"MYSQL_HOSTPORT" : 3306,
"MYSQL_USERNAME" : "crmeb",
"MYSQL_PASSWORD" : "xeWmJ466",
"MYSQL_DATABASE" : "crmeb",
"REDIS_HOSTNAME" : "",
"REDIS_PORT" : "",
"REDIS_PASSWORD" : "",
"REDIS_SELECT" : 0
},
//...省略
}
- 别忘了在
Dockerfile
及启动文件run.sh
中去掉与redis
相关内容