文件上传至公有云Nos及对接CDN

news2024/11/27 2:38:01
项目开发中,需要将图片文件上传至网易公有云的Nos,并且结合CDN做加速服务,记录一下开发过程。

流程图:
在这里插入图片描述

1. 文件上传到公有云Nos

网易对象存储服务(Netease Object Storage,简称NOS)是网易数帆提供的高可用、高可靠、高性能的云端存储服务。

本次项目由于是和外部企业合作,上传文件是上传到公有云Nos,但和部门之前上传到私有云Nos的方式一样。都是采用计算token的方式,前端直传。(私有云和公有云签名计算方式一样)

需要注意的点有:

前端私有云上传文件的请求地址是:https://wanproxy-web.127.net。而公有云的上传请求地址是:https://nosup-eastchina1.126.net。如果请求地址不对的话,则会一直返回"AccessDenied"。

配置桶名及ak_sk的时候,一定要仔细检查,是否有错误,例如多个空格啥的。这种也会返回错误信息"AccessDenied"。

2. 认识CDN

内容分发网络(Content Delivery Network,简称CDN)是建立并覆盖在承载网之上,由分布在不同区域的边缘节点服务器群组成的分布式网络。一般应用场景在于:网页、小文件加速;大文件下载加速;视频点播加速等。

在这里插入图片描述

可以这样理解,cdn的作用就是将源站内容发布到不同区域的边缘节点,这样在不同地方的用户请求都能被分配最适合他的节点,就近获取节点上缓存的资源。

一方面防止每个用户请求都访问源站,避免造成网络拥塞、缓解源站压力。

另一方面,使用户可以以最快的速度取得他所需的内容,解决网络带宽小、用户访问量大、网点分布不均等问题,提高用户访问的响应速度。

3. 接入CDN

关于对接网易cdn,基本参考官方文档:https://sf.163.com/help/documents/68827624361873408。
首先是在控制台配置好加速域名,回源地址等信息;
其次由于此次项目中不仅是想完成回源访问,更想着主动预热到cdn各节点,所以需要在代码里,调用CDN提供的接口。

CDN接口功能介绍:

  • 刷新:把CDN所有节点上对应的缓存资源标记为失效,当用户再次请求时,CDN会直接回源站获取对应的资源并返回给用户,同时将资源重新缓存到CDN节点。刷新功能会降低缓存命中率。
  • 预热:源站主动将对应的资源缓存到CDN节点,当您首次请求资源时,即可直接从CDN节点获取到最新的资源,无需再回源站获取。预热功能会提高缓存命中率。调用接口肯定需要鉴权,

这次开发中,在签名认证上花了较多时间,官方文档上没有示例,所以在格式上耽误了许久,下面给出签名格式代码:

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.*;

@Service
@Slf4j
public class CdnAuthorizationServiceImpl implements CdnAuthorizationService {

    @Value("${cdn.config.accessId}")
    private String accessId;

    @Value("${cdn.config.secretKey}")
    private String secretKey;

    @Value("${cdn.config.domainName}")
    private String domainName;

    @Resource
    private CdnAuthorizationService cdnAuthorizationService;

    @Override
    public String getAuthorization(String signature) {
        return "NCDN " + accessId + ":" + signature;
    }

    @Override
    public String getSignnature(String httpVerb, String contentMd5, String contentType, String date, String canonicalizedResource) throws NoSuchAlgorithmException, InvalidKeyException {
        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
        SecretKeySpec secret_key = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
        sha256_HMAC.init(secret_key);
        String message = httpVerb + "\n" + contentMd5 + "\n" + contentType + "\n" + date + "\n" + canonicalizedResource;
        byte[] bytes = sha256_HMAC.doFinal(message.getBytes(StandardCharsets.UTF_8));
        return java.util.Base64.getEncoder().encodeToString(bytes);
    }

    @Override
    public String getRfctime() {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
        simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
        return simpleDateFormat.format(new Date());
    }

    @Override
    public String getPreheatAuthorization() throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {
        String canonicalizedResource = "/domain/" + domainName;
        String rfctime = cdnAuthorizationService.getRfctime();
        String signnature = cdnAuthorizationService.getSignnature("PUT", "", "application/json", rfctime, canonicalizedResource);
        return cdnAuthorizationService.getAuthorization(signnature);
    }

    @Override
    public String getPreheatResultAuthorization(String orderType, Integer pageNum, Integer pageSize, String status) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {
        String canonicalizedResource = "/domain/" + domainName + "?orderType=" + orderType + "&pageNum=" + pageNum + "&pageSize=" + pageSize + "&status=" + status;
        String rfctime = cdnAuthorizationService.getRfctime();
        String signnature = cdnAuthorizationService.getSignnature("GET", "", "application/json", rfctime, canonicalizedResource);
        return cdnAuthorizationService.getAuthorization(signnature);
    }
}

注意点:

  1. 每个接口调用时,所需要的Authorization中内容是不同的,要看文档去分别改动签名计算内容。
  2. 获取预热结果列表接口,Authorization里的参数需要和调用接口时的参数保持一致,否则会返回签名不匹配的报错信息。
  3. 头信息除了Authorization之外,还需要Content-Type以及Date。注意Content-Type也要与签名里的Signnature保持一致。Date也要保持格式的统一。

鉴权通过后,就可以调用接口了,这里给出调用成功后的返回信息。

预热接口调用成功后会返回prehot-id:
在这里插入图片描述
预热结果列表调用成功后会返回全部预热个数以及每个预热url的结果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/577868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pycharm环境下打开Django内置的数据库Sqlite出错问题解决

问题描述 在数据库库文件中写入一条记录后,在pycharm的terminal终端下执行查看表的命令出错 执行语句为: 连接数据库报错 python manage.py dbshell CommandError: You appear not to have the sqlite3 program installed or on your path. Error:…

JavaScript之DOM基础

1. 初识DOM DOM: 文档对象模型 是W3C组织推荐的处理可扩展标记语言(HTML或者XML)的标准编程接口。 w3c已经定义了一系列的DOM接口,通过这些DOM接口可以改变网页的内容,结构和样式。 DOM树:文档:一个页面就是一个文档, DOM中使用d…

Android逆向猿人学2022年app比赛第四题grpc与Protobuf使用(步步验证)

教程 前言一、起步二、抓包三、分析四、验证五、HOOK借鉴 前言 前面2-3题和第一题解题思路基本上一样的,这里就不出教程了,这篇文章比较繁琐,基本上描述了我做这题的思路,有很多走不通的地方也有对应的方法,所以会比较…

linux网络初探

linux网络 1.1查看本机ip IP地址 IP地址网络地址主机地址,网络地址(网络号)相同的主机为本地网络中的主机,可以直接相互通信,而网络地址不同的主机为远程网络中的主机,相互通信必须通过本地网关&#xf…

Flutter Windows开发环境搭建教程与学习资料推荐

Windows应用软件开发有很多框架可以选择,例如比较流行的Electron、Qt、CEF、WPF、WinForm、MFC、DuiLib、SOUI等等。Flutter是近几年流行的全平台应用开发框架,可以进行Android、IOS、Web、MacOS、Windows、Linux等平台的应用软件开发。 一、Flutter介绍…

启动U盘制作工具Rufus 4.0.2035

Rufus是是一款小巧实用免费开源的帮助格式化和创建可启动USB闪存驱动器的工具,如USB钥匙/软盘、记忆棒等,可快速制作linux系统或者win启动u盘,可快速的将ISO镜像文件制作成可引导启动的USB启动盘,支持ISO镜像、GPT和UEFI&#xff…

设置参考文献编号与文中插入引用的具体步骤

目录 一、前言 二、操作步骤 (一)参考文献设置编号 (二)文章中引用参考文献方式 一、前言 本教程使用的软件是WPS 二、操作步骤 (一)参考文献设置编号 1.把引用文献的这个编号全部删掉 2.右键点击段…

学习笔记——vue中使用el-dropdown组件报错

今天在工作中,发现使用el-select做的下拉框,下拉菜单展开后,鼠标点击下拉框之外的区域时,下拉菜单没有收起。然后,我打开控制台,发现了这个错误。 Uncaught TypeError: Cannot read properties of null (re…

《Linux0.11源码解读》理解(四) head之重新设置IDT/GDT

上节提到,现在cs:ip指向0地址,此处存储着作为操作系统核心代码的system模块,是由head.s和 main.c以及后面所有源代码文件编译链接而成。head.s(以下简称head)紧挨着main.c,我们先执行head。 重新设置内核栈 _pg_dir: _startup_3…

堆(堆排序 模拟堆)

目录 一、堆的数据结构二、堆的操作方法往下调整的示意图往上调整的示意图相关功能的实现思路1.插入一个数2.求最小值3.删除最小值4.删除任意一个元素5.修改任意一个元素 三、堆的实战运用堆排序模拟堆 一、堆的数据结构 堆是一个完全二叉树:除了最后一层结点以外&…

C语言三子棋,五子棋,n子棋的代码实现

C语言三子棋,五子棋,n子棋的代码实现 这里以五子棋为例,来说明开发过程开发思路菜单打印棋盘的打印棋子的打印电脑下棋(随机数)判断输赢代码整合注意事项 这里以五子棋为例,来说明开发过程 其中该项目包含…

《用户增长方法论》从产品、渠道、营销创意等多个维度,搭建了一套完整的用户增长方法体系

关于作者 黄永鹏,目前在阿里巴巴担任高级用户增长专家。黄永鹏是一个典型的 “ 斜杠青年 ” ,十年前从广告咨询行业转战互联网,在 BAT 三家 公司都待过,负责过多款用户和日活过亿的产品,比如腾讯手机管家、百度地图…

chatgpt赋能python:Python练手:提高你的SEO技能

Python练手:提高你的SEO技能 在当今数字化时代,搜索引擎优化(SEO)成为了网站和企业在线成功的关键。优化技巧既可以提高网站的排名,还可以增加网站的可见性,从而吸引更多的流量和潜在客户。Python是一个适…

网络通信协议-ARP协议

目录 一、ARP协议 二、ARP协议通信过程 应用情景一:同一广播域内通信 (1)第一步:ARP协议通信 1.交换机接受消息 2.电脑2接收到广播消息 3.电脑2回复 4.交换机转发回复给电脑1 5.电脑1记录 (2)第二…

Go快速上手之基础语法 | 青训营笔记

Go快速上手之基础语法 | 青训营笔记 文章目录 Go快速上手之基础语法 | 青训营笔记系列介绍本文摘要1. Go 介绍2. Go 的环境配置2.1 :sparkles: IDE2.2 Gitpod 和 Jetbrians Gateway 的使用 3. Go的基础语法3.1 Hello World3.2 变量与常量3.3 条件控制语句…

Linux(进程间通信)

目录: 1.进程间通信的介绍 2.管道通信 3.管道的原理 ------------------------------------------------------------------------------------------------------------------------------- 1.进程间通信的介绍 2.管道通信 当我们在创建子进程时,我们的…

chatgpt赋能python:Python生成pyc文件的介绍

Python生成pyc文件的介绍 Python是一种解释型语言,但是在执行某些操作时,它会生成缓存文件,以便提高执行效率。这些缓存文件以 .pyc 扩展名保存在同一目录中。 在本文中,我们将重点介绍Python生成pyc文件,并探讨它们…

使用Python绘制M2货币供应率曲线

M2广义货币供应量:流通于银行体系之外的现金加上企业存款、居民储蓄存款以及其他存款,它包括了一切可能成为现实购买力的货币形式,通常反映的是社会总需求变化和未来通胀的压力状态。近年来,很多国家都把M2作为货币供应量的调控目…

Fedora安装并配置开启SSH服务相关命令

Ubuntu参考我这篇:虚拟机里安装ubuntu-23.04-beta-desktop-amd64,开启SSH(换源、备份),配置中文以及中文输入法等 一、过程 1、检测是否安装了openssh-server $ rpm -qa | grep openssh-serveropenssh-server-7.9p1-5.fc30.x86_642、如果上…

【web框架】——Django——如桃花来

目录索引 web框架介绍:常见软件的架构:*CS架构:**BS架构:* 网络通信:socket知识复习:*服务端代码逻辑:**客户端代码逻辑:* socket代码演示:*服务端代码演示:*…