PassJava 开源 (十) :Spring Cloud 整合 OSS 对象存储
PassJava (佳必过) 项目全套学习教程连载中,关注公众号第一时间获取。
文档在线地址:http://www.passjava.cn
整合 OSS 对象存储
一、缘起
文件上传在系统中用的很频繁,所以我们需要将上传的文件进行存储,传统的将文件上传到本机已不适用分布式系统。自己搭建文件服务器有复杂性和维护成本。所以我们可以采用市面上成熟的文件存储服务,如阿里云的 OSS 对象存储服务。
每个 OSS 的用户都会用到上传服务。Web 端常见的上传方法是用户在浏览器或 APP 端上传文件到应用服务器,应用服务器再把文件上传到 OSS。具体流程如下图所示。
和数据直传到 OSS 相比,以上方法有三个缺点:
上传慢:用户数据需先上传到应用服务器,之后再上传到 OSS。网络传输时间比直传到 OSS 多一倍。如果用户数据不通过应用服务器中转,而是直传到 OSS,速度将大大提升。而且 OSS 采用 BGP 带宽,能保证各地各运营商之间的传输速度。
扩展性差:如果后续用户多了,应用服务器会成为瓶颈。
费用高:需要准备多台应用服务器。由于 OSS 上传流量是免费的,如果数据直传到 OSS,不通过应用服务器,那么将能省下几台应用服务器。
二、技术方案
服务端签名后直传
背景
采用 JavaScript 客户端直接签名(参见JavaScript客户端签名直传)时,AccessKeyID 和 AcessKeySecret 会暴露在前端页面,因此存在严重的安全隐患。因此,OSS 提供了服务端签名后直传的方案。
原理介绍
服务端签名后直传的原理如下:
用户发送上传 Policy 请求到应用服务器。
应用服务器返回上传 Policy 和签名给用户。
用户直接上传数据到 OSS。
三、实现案例
1.开通阿里云 OSS
登录阿里云官网
https://www.aliyun.com/sale-season/2020/procurement-new-members?userCode=thp9caen
创建 Bucket 存储桶
获取 accesskey id 和 secret
分配权限
分配 管理对象存储服务(OSS)权限
2.使用 OSS SDK
1) 安装 SDK
在 Maven 项目中加入依赖项
2) 上传文件到 OSS
3.整合 Spring Cloud Alicloud OSS
1) passjava-common 项目引入 spring-cloud-starter-alicloud-oss 依赖
2) 配置 alicloud oss
3)测试上传
4.获取服务端签名
4.1 准备工作:
创建一个第三方服务 passjava-thirdparty
引入 passjava-common 模块,并且排除 mybatis-plus 依赖
配置服务发现和端口
配置配置中心
配置 Nacos 命名空间和 oss.yml
开启服务发现
@EnableDiscoveryClient
4.2 获取签名类
测试接口
4.3 配置网关路由
因为前端页面配置的统一访问路径是 http://localhost:8060/api/,所以需要将访问 thirdparty 的服务通过网关路由到 thirdparty 服务
配置网关:
测试可以上传成功
4.4 配置跨域访问
配置跨域访问,所有 post 请求都可以跨域访问
4.5 Web 端上传组件
单文件上传组件
获取签名的 JS 文件
使用单文件上传组件
上传文件成功
下节预告
数据校验
代码地址
https://github.com/Jackson0714/PassJava-Platform
文档在线地址:http://www.passjava.cn
版权声明: 本文为 InfoQ 作者【悟空聊架构】的原创文章。
原文链接:【http://xie.infoq.cn/article/b26f6208013e0436b5d634b78】。文章转载请联系作者。
评论