最近体验了天某云对象存储的功能,作为一名资深开发者,开发体验差强人意,与阿里云存在一定的差距。
首先在开发文档上居然没有基于nodejs的代码示例,只有java,c#,go等的代码示例,虽然有javascript的,但那也只适用于浏览器端。难道nodejs就这么不受待见,阿里腾讯的云服务开发我都用过不少,nodejs也是和几大主流语言,有自己一席之地,甚至当年阿里函数计算出来时都是只支持nodejs,这么到这里连个名字都没见,失败。
然后看到也提供api调用的方式,就改用这个来实现对象存储的访问,结果调试发现,有明显的时延,做一次预签名下载链接生成,从发起调用到返回居然平均要1秒多,咨询技术支持,他说不清楚api调用,都是用的sdk访问,甩给我一个java写的demo,平均耗时不到600~800毫米,说仅预签名调用才几十毫秒。(??建立网络连接的开销占比这么大?后来判断估计是他那边的网络不行),但至少给了我一个思路方向:
如果你的应用对oss的性能要求高,不要考虑它的api调用,一定是用sdk方式。
这就回到原来的问题上,要么我用其他语言的sdk,要么我自己想办法在nodejs实现sdk的调用方式。最开始我以为javascript的sdk可以拿来用在nodejs上,结果被打脸,用了下根本没法跑。后来看了下技术给的java文档,这不就是aws的库吗?还是S3的标准,上chatgpt赶紧问问,果不其然原来aws官网就已经给出了详尽的演示代码,天某云你做啥子嘛,好歹直接在开放者文档上给个链接也行啊,害得老子转了一大圈用了你的api调用。
这是aws的预签名链接Create a presigned URL for Amazon S3 using an AWS SDK - Amazon Simple Storage ServiceCreate a presigned URL for Amazon S3 using an AWS SDKhttps://docs.aws.amazon.com/AmazonS3/latest/userguide/example_s3_Scenario_PresignedUrl_section.html
然后copy了下拿到本地开发调试,半小时不到跑通搞定,爽!!!
经过实测,从建立连接到生成一个预签名下载链接,平均不到50毫秒。这个速度完全满足了应用到需要。
初始化client注意的点:
*region字段要有,但值无所谓,按技术支持说的不用填,但不写的话,代码会报错。
*ak, sk到某某云的对象存储管理页面里去查。
* endpoint的话,创建一个bucket,然后点击bucket查看详情,外网的和内网都在。
其他的代码部分就直接参考aws的官网的就行了,为了方便小伙伴,我贴出自己的完整示例
const { S3Client, GetObjectCommand} = require("@aws-sdk/client-s3");
const { getSignedUrl} = require("@aws-sdk/s3-request-presigner");const client = new S3Client({region: '1111',credentials: {accessKeyId: '<ak>',secretAccessKey: '<sk>'},endpoint: 'https://xxxx.xxx.xx.cn',forcePathStyle: true,sslEnabled: true});const signurl = async () =>{const Key ='test.jpg'const Bucket = 'test-bucket';const command = new GetObjectCommand({ Bucket, Key });const url = await getSignedUrl(client, command, { expiresIn: 3600 ,ResponseCacheControl: 'max-age=3600', // 设置HTTP缓存控制头});console.log(url);}signurl().catch(console.error);
另外吐槽下管理权限这块,很容易让人搞晕,概念太多,用户,用户组,策略,委托,当时想和另外一个小伙伴一起使用,发现子用户总是无法看到主账户的资源,后来才知道关键点是这个。