微服务解决方案 -- OSS对象存储服务 (外传一)
进入到微服务开发,对于小型企业或者独立开发者来说,最大的问题就是内存和硬盘问题,所以我自己的服务不可能将文件存储在自己的服务器上。那么如何存储我们的文件?
阿里云OSS对象存储
阿里云对象存储服务(Object Storage Service,简称 OSS)为您提供基于网络的数据存取服务。使用 OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种非结构化数据文件。
阿里云 OSS 将数据文件以对象(Object)的形式上传到存储空间(Bucket)中。您可以进行以下操作:
- 创建一个或者多个存储空间,向每个存储空间中添加一个或多个文件。
- 通过获取已上传文件的地址进行文件的分享和下载。
- 通过修改存储空间或文件的读写权限(ACL)来设置访问权限。
- 通过阿里云管理控制台、各种便捷工具以及丰富的 SDK 包执行基本和高级 OSS 操作。
OSS 提供多种语言的 和 SDK 包,方便您快速进行二次开发。详情请参见:Java SDK 快速入门
为什么使用阿里云OSS
- 阿里云对象存储
OSS
,是阿里云提供的海量、安全、低成本、高可靠的云存储服务。
1.1 方便、快捷的使用方式
1.1.1 提供标准的RESTful API接口、丰富的SDK包、客户端工具、控制台。您可以像使用文件一样方便地上传、下载、检索、管理用于Web网站或者移动应用的海量数据。
1.1.2 不限文件数量和大小。您可以根据所需存储量无限扩展存储空间,解决了传统硬件存储扩容问题。
1.1.3 支持流式写入和读出。特别适合视频等大文件的边写边读业务场景。
1.1.4 支持数据生命周期管理。您可以通过设置生命周期规则,将到期数据批量删除或者转储为更低成本的低频访问型存储或归档型存储。
1.2 强大、灵活的安全机制
1.2.1 灵活的鉴权,授权机制。提供STS和URL鉴权和授权机制、IP黑白名单、防盗链、主子账号等功能。
1.2.2 提供用户级别资源隔离机制和多集群同步机制(可选)。
1.3 数据冗余机制
OSS 采用数据冗余存储机制,将每个对象的不同冗余存储在同一个区域内多个设施的多个设备上,确保硬件失效时的数据可靠性和可用性。
1.3.1 OSS Object 操作具有强一致性,用户一旦收到了上传/复制成功的响应,则该上传的 Object 就已经立即可读,且数据已经冗余写入到多个设备中。
1.3.2 OSS 会通过计算网络流量包的校验和,验证数据包在客户端和服务端之间传输中是否出错,保证数据完整传输。
1.3.3 OSS 的冗余存储机制,可支持两个存储设施并发损坏时,仍维持数据不丢失。
- 之前写的文章是关于
Spring Cloud Alibaba
的,所以技术选型也就选了阿里的OSS
- 腾讯云也有
COS
对象存储免费使用6个月。
怎么使用
首先新建一个存储空间bucket
点击创建Bucket
个人开发选择标准存储,读写权限选择公共读
记住你的bucket
名称 和 Endpoint
创建结束。
第二步
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
根据文档说需要AccessKeyId
和AccessKey
RAM创建子账号在创建 AccessKey
勾选编程访问
点击刚才创建的用户,将其AccessKey
删除,重新创建
妥善保管AccessKey
和 Secret
然后我们需要在OSS
对改用户进行授权,点击文件管理
->授权
。
点击新增授权
选择子账号
->刚刚创建的用户
,权限改成读/写
,确定。
接下来就可以撸代码了。
首先需要 aliyun-sdk-oss:3.6.0
,因为我的版本号在父 项目里规定了,所以这里不用写
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
为此我再定义了一个文件上传的实体类FileInfo
@Data
@NoArgsConstructor
@AllArgsConstructor
public class FileInfo implements Serializable {
private static final long serialVersionUID = 5955600146057380475L;
private String path;
}
controller
接口
@RestController
@RequestMapping(value = "upload")
public class UploadController {
private static final String ENDPOINT = "你的Endpoint";
private static final String ACCESS_KEY_ID = "你的Key";
private static final String ACCESS_KEY_SECRET = "你的Secret";
private static final String BUCKET_NAME = "你的bucket";
/**
* 文件上传
*
* @param multipartFile {@link MultipartFile} 文件
* @return ResponseResult {@link ResponseResult<FileInfo>} 文件上传路径
*/
@PostMapping(value = "")
public RespResult<FileInfo> upload(MultipartFile multipartFile) {
String fileName = multipartFile.getOriginalFilename();
// 获取文件后缀
String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
String newName = UUID.randomUUID() + "." + suffix;
OSS client = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
try {
client.putObject(new PutObjectRequest(BUCKET_NAME, newName, new ByteArrayInputStream(multipartFile.getBytes())));
return new RespResult<>(200, "文件上传成功", new FileInfo("http://" + BUCKET_NAME + "." + ENDPOINT + "/" + newName));
} catch (IOException e) {
return new RespResult<>(20002, "文件上传失败,请重试", null);
} finally {
client.shutdown();
}
}
}
测试结束后可以看一眼bucket
信息,点开上传的文件可以看到URL
,这样我们就可以将他的URL
,添加到json
里,即我代码最后的return
语句即http://BUCKET_NAME.ENDPOINT/fileName
测试
POSTMAN
一定要选择File
这样我们的文件路径也返回了,前端只要获取到这个路径就可以实现上传和加载图片的功能了。
上一篇: C语言中关于&的用法讲解
下一篇: python中csv文件的若干读写方法