使用serverless实现从oss下载文件并压缩

        公司之前开发一个网盘系统, 可以上传文件, 打包压缩下载文件, 但是在处理大文件的时候, 服务器遇到了性能问题, 主要是这个项目是单机部署.......(离谱),  然后带宽只有100M, 现在用户比之前多很多, 然后所有人的压缩下载请求都给到这一台服务器了, 比如多个人下载的时候带宽问题, 服务器内存占用问题, 下载速度和没开会员的百度云网盘有一拼, 用户苦不堪言,

        所以考虑到使用阿里的 serverless 函数计算, 把从OSS的下载和压缩, 以及压缩后的客户端对文件下载, 这些压力全给到 serverless

一.  使用的阿里云 serverless 函数计算 FC 

阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

        使用之前我们需要开发一个传统的 springboot 项目,  代码没什么保密的东西, 都是抄的chatgpt, 项目地址 :   GitHub - canxiusi/zip-to-oos

        拉下来就可以直接运行的那种, 需要在配置文件里补全你的OSS信息

 1. 之后我们把项目打成jar包, 并压缩成zip

 2. 之后登录阿里云的 serverless, 再服务列表点击创建服务

使用serverless实现从oss下载文件并压缩_第1张图片

3. 然后在自动弹出的页面中点击创建函数

使用serverless实现从oss下载文件并压缩_第2张图片

4. 选择第二个, 使用springboot项目, 的zip压缩包上传

使用serverless实现从oss下载文件并压缩_第3张图片

5.  这里一定要勾选 处理HTTP请求, 因为我们这是传统的 springboot 项目, 手白了就是 controller 层要接收上游系统的请求

使用serverless实现从oss下载文件并压缩_第4张图片

 6. 运行环境选择 java8, 把项目的zip压缩上传上去, 启动命令就是 java -jar, 注意带上 jvm 的运行参数 

使用serverless实现从oss下载文件并压缩_第5张图片

7. 高级配置这里直接把配置拉满, 市区选择北京/上海时间

使用serverless实现从oss下载文件并压缩_第6张图片

8. 触发器这里选择支持的请求方式, 就是接口上 @PostMapping, @GetMapping 一类的, 签名根据自己的需要配置

使用serverless实现从oss下载文件并压缩_第7张图片

9. 在函数详情页面点击测试函数, 这里就是请求 controller 我们定义的接口

使用serverless实现从oss下载文件并压缩_第8张图片

10. 在触发器管理页面, 我们可以看到函数的外网请求地址, 这样我们就可以在其他项目调用接口了

11. 调用方系统请求serverless的部分代码

 因为这里要压缩的文件比较大, 所以在请求头这里设置了异步请求

        异步请求 serverless, 把OSS的文件路径和调用方系统回调地址作为参数

        后续就是等待 serverless 从OSS下载并压缩文件后, 通过http请求, 把 zip 文件在 serverless 的临时路径返回给调用方系统, 调用方系统进行入库处理, (这里没在内存做压缩, 因为文件过大会OOM)

        调用方系统通过客户端轮询请求, 查询临时文件路径存不存在, 在拿到临时文件的路径后, 再重定向到 serverless 直接下载文件

使用serverless实现从oss下载文件并压缩_第9张图片

         下图的 controller 其实就是 serverless 在处理完 zip 文件后的回调地址, 逻辑就是把 serverless 的 zip 文件的路径入库

使用serverless实现从oss下载文件并压缩_第10张图片

   

         下图的 downloadZipFile 就是前面的 serverless 的外网请求地址, 加上 serverless 部署的代码的 controller 层, 根据文件路径下载文件的接口路径

使用serverless实现从oss下载文件并压缩_第11张图片

        经过测试, serverless 的请求处理速度还是很快的, 因为和OSS对接有专网, (这个要注意 servereless 的地域要和 OSS 的地域一样)

        5个gb的零零散散的文件, 有很多文件路径,  逐个请求OSS下载, 再把文件流写入到磁盘临时文件, 然后返回给调用方系统临时文件的路径, 大概花费了4分多, 注意这里只是返回了在 serverless 的压缩包的临时文件路径, 后续要再次通过重定向到 serverless 的下载文件接口, 下载临时文件

你可能感兴趣的:(serverless,云原生,java)