前言

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 中其主机与提供的某个值相匹配的任何资产都将从缓存中清除
  • 按前缀清除: 此目录中的所有资产都将从缓存中清除。

img.png

清除缓存的接口定义如下:

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 来进行缓存的删除。

参考