公司之前开发一个网盘系统, 可以上传文件, 打包压缩下载文件, 但是在处理大文件的时候, 服务器遇到了性能问题, 主要是这个项目是单机部署.......(离谱), 然后带宽只有100M, 现在用户比之前多很多, 然后所有人的压缩下载请求都给到这一台服务器了, 比如多个人下载的时候带宽问题, 服务器内存占用问题, 下载速度和没开会员的百度云网盘有一拼, 用户苦不堪言,
所以考虑到使用阿里的 serverless 函数计算, 把从OSS的下载和压缩, 以及压缩后的客户端对文件下载, 这些压力全给到 serverless
阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
使用之前我们需要开发一个传统的 springboot 项目, 代码没什么保密的东西, 都是抄的chatgpt, 项目地址 : GitHub - canxiusi/zip-to-oos
拉下来就可以直接运行的那种, 需要在配置文件里补全你的OSS信息
1. 之后我们把项目打成jar包, 并压缩成zip
2. 之后登录阿里云的 serverless, 再服务列表点击创建服务
3. 然后在自动弹出的页面中点击创建函数
4. 选择第二个, 使用springboot项目, 的zip压缩包上传
5. 这里一定要勾选 处理HTTP请求, 因为我们这是传统的 springboot 项目, 手白了就是 controller 层要接收上游系统的请求
6. 运行环境选择 java8, 把项目的zip压缩上传上去, 启动命令就是 java -jar, 注意带上 jvm 的运行参数
7. 高级配置这里直接把配置拉满, 市区选择北京/上海时间
8. 触发器这里选择支持的请求方式, 就是接口上 @PostMapping, @GetMapping 一类的, 签名根据自己的需要配置
9. 在函数详情页面点击测试函数, 这里就是请求 controller 我们定义的接口
10. 在触发器管理页面, 我们可以看到函数的外网请求地址, 这样我们就可以在其他项目调用接口了
11. 调用方系统请求serverless的部分代码
因为这里要压缩的文件比较大, 所以在请求头这里设置了异步请求
异步请求 serverless, 把OSS的文件路径和调用方系统回调地址作为参数
后续就是等待 serverless 从OSS下载并压缩文件后, 通过http请求, 把 zip 文件在 serverless 的临时路径返回给调用方系统, 调用方系统进行入库处理, (这里没在内存做压缩, 因为文件过大会OOM)
调用方系统通过客户端轮询请求, 查询临时文件路径存不存在, 在拿到临时文件的路径后, 再重定向到 serverless 直接下载文件
下图的 controller 其实就是 serverless 在处理完 zip 文件后的回调地址, 逻辑就是把 serverless 的 zip 文件的路径入库
下图的 downloadZipFile 就是前面的 serverless 的外网请求地址, 加上 serverless 部署的代码的 controller 层, 根据文件路径下载文件的接口路径
经过测试, serverless 的请求处理速度还是很快的, 因为和OSS对接有专网, (这个要注意 servereless 的地域要和 OSS 的地域一样)
5个gb的零零散散的文件, 有很多文件路径, 逐个请求OSS下载, 再把文件流写入到磁盘临时文件, 然后返回给调用方系统临时文件的路径, 大概花费了4分多, 注意这里只是返回了在 serverless 的压缩包的临时文件路径, 后续要再次通过重定向到 serverless 的下载文件接口, 下载临时文件