前言
cdn 刷新是 cdn 使用过程中的一项重要的功能,通过刷新功能,您可以删除CDN节点上已经缓存的资源,并强制CDN节点回源站获取最新资源,适用于源站资源更新和发布、违规资源清理、域名配置变更等。
接下来将分别讲述 阿里云CDN、AWS cloudfront 、Cloudflare cdn 使用 go 语言进行 cdn 的刷新操作的。
阿里云刷新 cdn
如何刷新 阿里云 cdn 的缓存呢? 只需使用 阿里云 openapi 的 go sdk 即可,通过查阅文档,我们只需使用 RefreshObjectCaches API即可刷新阿里云 cdn 的缓存,RefreshObjectCaches 有以下参数:
ObjectPath: 刷新的url ,多个 url 使用换行符进行分隔
ObjectType: 刷新任务的类型,有以下类型
File(默认值):文件刷新。
Directory:目录刷新。
Regex:正则刷新。
IgnoreParams:去参数刷新。去参数指的是去除请求 URL 中?及?之后的参数,去参数刷新指的是用户先通过接口提交去参数后的 URL,然后用户提交的待刷新 URL 将会与已缓存资源的 URL 进行去参数匹配,如果已缓存资源的 URL 去参数以后与待刷新 URL 匹配,那么 CDN 节点将对缓存资源执行刷新处理。
Force: 当回源内容和源站资源对比后不一致时,是否刷新对应目录下的资源。默认为 false。
下面是一个例子:
package main
import (
cdn20180510 "github.com/alibabacloud-go/cdn-20180510/v4/client"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
"os"
)
func CreateClient(accessKeyId *string, accessKeySecret *string) (result *cdn20180510.Client, err error) {
config := &openapi.Config{
AccessKeyId: accessKeyId,
AccessKeySecret: accessKeySecret,
}
config.Endpoint = tea.String("cdn.ap-southeast-1.aliyuncs.com")
result = &cdn20180510.Client{}
result, err = cdn20180510.NewClient(config)
return result, err
}
func main() {
client, err := CreateClient(tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")), tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")))
if err != nil {
return
}
refreshObjectCachesRequest := &cdn20180510.RefreshObjectCachesRequest{
ObjectPath: tea.String("http://example.com/image/1.png\\\n\t\thttp://aliyundoc.com/image/2.png"),
}
runtime := &util.RuntimeOptions{}
_, err = client.RefreshObjectCachesWithOptions(refreshObjectCachesRequest, runtime)
if err != nil {
return
}
return
}
aws cloudfront
接下来讲解 aws cloudfront 如何刷新 cdn,cloudfront 刷新缓存的操作叫使文件失效,通过查阅 cloudfront 的API文档,发现可以使用 CreateInvalidation 来创建失效。可以使用 aws go sdk 来进行操作。
这个 API 有以下参数:
InvalidationBatch: 必填
CallerReference: 用来表示请求唯一的值,防止发送重复的请求。
Paths: 失效的路径
API 的 go实现如下:
func (c *Client) CreateInvalidation(ctx context.Context, params *CreateInvalidationInput, optFns ...func(*Options)) (*CreateInvalidationOutput, error) {
if params == nil {
params = &CreateInvalidationInput{}
}
result, metadata, err := c.invokeOperation(ctx, "CreateInvalidation", params, optFns, c.addOperationCreateInvalidationMiddlewares)
if err != nil {
return nil, err
}
out := result.(*CreateInvalidationOutput)
out.ResultMetadata = metadata
return out, nil
}
接下来讲解 cloudflare 刷新 cdn 缓存。
cloudflare
cloudflare 提供了以下方式来清除缓存:
- 单文件清除
- 清除全部
- 标记清除: 由与提供的某个值相匹配的 Cache-Tag 响应标头提供服务的任何资产都将从缓存中清除。
- 按主机名清除: URL 中其主机与提供的某个值相匹配的任何资产都将从缓存中清除
- 按前缀清除: 此目录中的所有资产都将从缓存中清除。
清除缓存的接口定义如下:
https://api.cloudflare.com/client/v4/zones/{identifier}/purge_cache
有以下参数:
tags: 标记
hosts:
prefixes:
下面是一个例子:
package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.cloudflare.com/client/v4/zones/identifier/purge_cache"
payload := strings.NewReader("{\n \"tags\": [\n \"some-tag\",\n \"another-tag\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
req.Header.Add("X-Auth-Email", "")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(res)
fmt.Println(string(body))
}
除了使用 http 请求的方式,我们还可以使用 sdk 来进行缓存的删除。
参考
- https://next.api.aliyun.com/api/Cdn/2018-05-10/RefreshObjectCaches
- https://developers.cloudflare.com/cache/how-to/purge-cache/
- https://developers.cloudflare.com/api/operations/zone-purge
- https://github.com/aws/aws-sdk-go-v2/blob/service/cloudfront/v1.32.6/service/cloudfront/api_op_CreateInvalidation.go#L16
- https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateInvalidation.html
- https://github.com/cloudflare/cloudflare-go