本文主要介绍了,用COS和CDN存储静态资源,以及腾讯云API的使用。
COS
对象存储(Cloud Object Storage,COS)是腾讯云提供的一种存储海量文件的分布式存储服务,具有高扩展性、低成本、可靠安全等优点。
“对象”是指用户上传的文件,文件除了本身的数据信息,还有文件类型、名称、尺寸等等,这些就是对象的“属性”。我们只需要关心把一个个对象存储到“存储桶”中,其物理上是怎么存储的我们不需要关心。
CDN
CDN的工作原理,就是将源站的资源,缓存在CDN各个节点上,当请求命中某个节点的缓存时,直接返回客户端,从而提高访问效率,缓解源站的压力。
更深一步的原理,可以参考下面两篇文章。
《CDN工作原理及其在淘宝图片业务中的应用》
《高性能利器:CDN我建议你好好学一下!》
腾讯云COS和CDN
为了提高我们页面的体验,我们可以选择结合腾讯云的对象存储COS和内容分发网络CDN来托管我们的静态资源。
对象存储的使用,如果是面向设计的同学的话,有个比较好的工具就是COS的可视化工具COSBrowser。
对开发人员,API Axplorer是个极好的API文档,API能整理成这样真的厉害。
腾讯云API的使用
接下来,我们结合使用腾讯云COS和CDN时候的一个痛点,来介绍下怎么封装一个腾讯云的CDN,从而解决我们的痛点。
现状:设计同学的切图是传到腾讯云COS,然后我们为COS链接配置CDN域名,前端直接请求资源的CDN链接。
痛点:设计同学直接用COSBrowser管理COS上的资源,每次替换资源后,CDN的更新有延时,需要手动触发一下腾讯云的CDN刷新,但是COSBrower客户端上没有可以刷新的地方,每次需要登录腾讯云的网页管理端去刷新,就很麻烦,因为网页端没多久就需要登录,而且腾讯云账号太多人共用也不安全。
方案:封装CDN刷新的接口,提供一个工具,给设计同学进行CDN刷新。
接下来我们借助这个案例,来看看怎么使用腾讯云的API和SDK。
API文档
CDN刷新URL的API
我们可以看到只需要简单调用腾讯云nodejs sdk。
代码语言:javascript复制// Depends on tencentcloud-sdk-nodejs version 4.0.3 or higher
const tencentcloud = require("tencentcloud-sdk-nodejs");
const CdnClient = tencentcloud.cdn.v20180606.Client;
const clientConfig = {
credential: {
secretId: "SecretId",
secretKey: "SecretKey",
},
region: "",
profile: {
httpProfile: {
endpoint: "cdn.tencentcloudapi.com",
},
},
};
const client = new CdnClient(clientConfig);
const params = {};
client.PurgeUrlsCache(params).then(
(data) => {
console.log(data);
},
(err) => {
console.error("error", err);
}
);
ExpressJS服务端
我们结合ExpressJS封装一个刷新CGI的接口
代码语言:javascript复制const express = require('express');
const tencentcloud = require('tencentcloud-sdk-nodejs');
const { getHost } = require('./host');
const { getSecret } = require('./secret');
const app = express();
let client = null;
app.all('*', (req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Content-Type,Content-Length, Authorization, Accept,X-Requested-With');
res.header('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS');
res.header('X-Powered-By', '3.2.1');
res.header('Content-Type', 'application/json;charset=utf-8');
next();
});
// 刷新CDN url
app.get('/refresh_cdn/url', (req, res) => {
client.PurgeUrlsCache(JSON.parse(req.query.cgiparams)).then(
(data) => {
res.json({ code: 0, msg: '请求成功', data });
},
(err) => {
res.json({ code: 0, msg: '请求失败', data: err });
},
);
});
function initCDNClient({secretId, secretKey}){
const CdnClient = tencentcloud.cdn.v20180606.Client;
const clientConfig = {
credential: {
secretId,
secretKey,
},
region: '',
profile: {
httpProfile: {
endpoint: 'cdn.tencentcloudapi.com',
},
},
};
return new CdnClient(clientConfig);
}
async function run() {
// 获取腾讯云API密钥,不直接写在代码中,因为不安全
secret = await getSecret();
mHost = await getHost();
// 初始化操作对象
client = initCDNClient(secret);
const server = app.listen(8088, mHost, () => {
const host = server.address().address;
const { port } = server.address();
console.log('地址为 http://%s:%s', host, port);
});
}
run();
接口测试
代码语言:javascript复制curl -G -d 'cgiparams={"Urls":["https://img.yuanmabao.com/zijie/pic/2023/04/22/h0bpueksrqm.png"]}' http://x.x.x.x:8088/refresh_cdn/url
返回
代码语言:javascript复制{"code":0,"msg":"请求成功","data":{"RequestId":"11758bee-1e93-4062-b54f-54216999755f","TaskId":"389136129565192861"}}
测试一下,图片资源确实更新了。
进一步优化
除了刷新URL的接口,我们可以进一步封装刷新目录、查看刷新历史、查看刷新限额的接口,实现和腾讯云网页管理端一样的体验,但是我们不需要登录腾讯云账号。
总结
今天主要是介绍了怎么使用腾讯云的API接口,CDN刷新只是一个很小众的功能,其他像对象上传、图像视频处理等等比较常用的功能,也是差不多的用法,一通百通,希望本文对大家能有点帮助。