OSS 文件下载方案全面对比

发布时间:2026/7/30 17:38:40
OSS 文件下载方案全面对比 OSS 文件下载方案全面对比前置条件上传统一走janus-service1微服务 → OBS 写入前端 Pod与后端在同一内网鉴权所有下载请求必须经过网关 Token 验证方案一内网直接访问最推荐架构图前端Pod(内网) ──GET──▶ 网关(鉴权) ──302──▶ OBS内网地址 │ │ │ Token验证 │ 直接返回文件 │ 10行代码 │ URL永久有效 │ │ └──302重定向──────────▶│前提条件✅ OBS Bucket 设置为内网 IP 段可读✅ 前端 Pod 能访问 OBS 内网地址网关代码GetMapping(/download/{year}/{month}/{day}/{fileName})publicMonoVoiddownload(PathVariableStringyear,PathVariableStringmonth,PathVariableStringday,PathVariableStringfileName,ServerWebExchangeexchange){StringobsUrlString.format(%s/gateway/%s/%s/%s/%s,obsUrlPrefix,year,month,day,fileName);// https://janus-domain/janus-test/gateway/2026/07/29/xxx.jpgexchange.getResponse().setStatusCode(HttpStatus.FOUND);exchange.getResponse().getHeaders().setLocation(URI.create(obsUrl));returnexchange.getResponse().setComplete();}OBS 配置{Statement:[{Effect:Allow,Principal:*,Action:[GetObject],Resource:[janus-test/*],Condition:{IpAddress:{aws:SourceIp:[10.180.0.0/16,172.16.0.0/12]}}}]}优缺点维度评价网关压力⭐⭐⭐⭐⭐ 极低只做302代码复杂度⭐⭐⭐⭐⭐ 极简10行URL有效期⭐⭐⭐⭐⭐ 永久有效前端改动⭐⭐⭐⭐⭐ 零改动性能⭐⭐⭐⭐⭐ 直连OBS最快浏览器缓存⭐⭐⭐⭐⭐ 支持304/强缓存安全性⭐⭐⭐⭐ 内网限制网关鉴权UUID运维成本⭐⭐⭐⭐ 需配置Bucket Policy方案二网关代理下载当前方案架构图前端Pod(内网) ──GET──▶ 网关(鉴权) ──转发──▶ janus-service1 ──s3Client──▶ OBS │ │ │ │ Token验证 │ 读取文件流 │ 返回文件 │ │ 返回给网关 │ │ │ │ ◀────────文件流───────◀──────────────────────────┘ ◀──文件流───────────前提条件✅ 无特殊要求OBS 保持默认私有janus-service1 代码GetMapping(/download/{year}/{month}/{day}/{fileName})publicMonoVoidproxyDownload(PathVariableStringyear,PathVariableStringmonth,PathVariableStringday,PathVariableStringfileName,ServerWebExchangeexchange){StringobjectKeyString.format(gateway/%s/%s/%s/%s,year,month,day,fileName);// 从OBS读取文件S3Objects3Objects3Client.getObject(bucketName,objectKey);ServerHttpResponseresponseexchange.getResponse();response.getHeaders().setContentType(MediaType.parseMediaType(s3Object.getObjectMetadata().getContentType()));response.getHeaders().setCacheControl(public, max-age3600);response.getHeaders().setETag(s3Object.getObjectMetadata().getETag());returnresponse.writeWith(DataBufferUtils.readInputStream(()-s3Object.getObjectContent(),response.bufferFactory(),4096));}优缺点维度评价网关压力⭐⭐ 高传输文件流代码复杂度⭐⭐⭐ 中等处理流URL有效期⭐⭐⭐⭐⭐ 永久有效前端改动⭐⭐⭐⭐⭐ 零改动性能⭐⭐ 慢中继转发浏览器缓存⭐⭐⭐⭐ 支持缓存安全性⭐⭐⭐⭐⭐ 最高完全私有运维成本⭐⭐⭐⭐⭐ 无需额外配置方案三预签名URL Nginx代理架构图前端Pod(内网) ──GET──▶ 网关(鉴权) ──转发──▶ janus-service1(生成预签名URL) │ │ │ │ 302 Nginx公网URL │ │ └────302──────────────────┘ Location: https://file.company.com/oss-files/xxx.jpg?signaturexxx │ ▼ Nginx(公网域名) │ │ 转发认证 ▼ OBS内网地址 │ │ 返回文件流 ▼ 前端◀──文件流前提条件✅ 需要一台 Nginx能通公网和内网OBS✅ 需要配置公网域名和 SSL 证书✅ OBS 保持默认私有Nginx 配置upstream obs { server janus-domain:443; } server { listen 443 ssl; server_name file.company.com; # OSS API 转发到网关 location /janus-service1/api/oss/ { proxy_pass http://gateway:10003; } # OSS 文件代理 location /oss-files/ { rewrite ^/oss-files/(.*) /$1 break; proxy_pass https://obs; proxy_set_header Host janus-domain; proxy_buffering on; proxy_max_temp_file_size 1024m; proxy_read_timeout 300s; } }janus-service1 代码GetMapping(/download/{year}/{month}/{day}/{fileName})publicMonoVoiddownload(PathVariableStringyear,PathVariableStringmonth,PathVariableStringday,PathVariableStringfileName,ServerWebExchangeexchange){StringobjectKeyString.format(gateway/%s/%s/%s/%s,year,month,day,fileName);// 1. 生成内网预签名URLStringinternalObsUrlobsClient.generatePresignedUrl(objectKey,30);// https://obs-xxx-internal.cucloud.cn/janus-test/gateway/xxx.jpg?signaturexxx// 2. 转换为Nginx公网URLStringnginxUrlconvertToNginxUrl(internalObsUrl);// https://file.company.com/oss-files/janus-test/gateway/xxx.jpg?signaturexxx// 3. 302重定向exchange.getResponse().setStatusCode(HttpStatus.FOUND);exchange.getResponse().getHeaders().setLocation(URI.create(nginxUrl));returnexchange.getResponse().setComplete();}优缺点维度评价网关压力⭐⭐⭐⭐⭐ 极低只做302代码复杂度⭐⭐ 复杂Nginx签名URL转换URL有效期⭐⭐ 短预签名有过期时间前端改动⭐⭐⭐⭐⭐ 零改动如果URL在有效期内⭐⭐ 需改动处理URL过期性能⭐⭐⭐⭐ 快Nginx直转OBS浏览器缓存⭐⭐ 差URL过期后缓存失效安全性⭐⭐⭐⭐ 较高签名鉴权临时URL运维成本⭐⭐ 高需维护Nginx域名证书最终对比总结对比维度方案一内网直接方案二网关代理方案三预签名Nginx网关负载 极低 高 极低网络延迟 最低 高 中代码复杂度 10行 100行 200行URL永久性 永久 永久 30分钟前端改动 无 无 需处理过期浏览器缓存 完美支持 支持 缓存失效问题安全性 较高 最高 较高运维成本 需配Bucket 无需配置 需Nginx域名大文件支持 优秀 网关压力大 优秀监控追踪 下载部分缺失 完整追踪 下载部分缺失故障恢复 简单 简单 Nginx单点推荐选择 首选方案一内网直接访问条件OBS 可配置 Bucket Policy 允许内网访问理由最简单、最高效、零维护风险无 次选方案二网关代理当前方案条件无法修改 OBS 权限文件较小10MB理由无需额外配置安全可控风险大文件下载时网关压力大 备选方案三预签名Nginx条件无法修改 OBS 权限且有大量大文件下载理由性能好但复杂度高风险URL过期问题、Nginx维护成本建议优先推动方案一如果 OBS 权限实在改不了保持当前的方案二。方案三性价比最低不推荐。