欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

微服务解决方案 -- OSS对象存储服务 (外传一)

程序员文章站 2022-07-05 23:12:39
...

进入到微服务开发,对于小型企业或者独立开发者来说,最大的问题就是内存和硬盘问题,所以我自己的服务不可能将文件存储在自己的服务器上。那么如何存储我们的文件?

阿里云OSS对象存储


阿里云对象存储服务(Object Storage Service,简称 OSS)为您提供基于网络的数据存取服务。使用 OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种非结构化数据文件。

阿里云 OSS 将数据文件以对象(Object)的形式上传到存储空间(Bucket)中。您可以进行以下操作:

  1. 创建一个或者多个存储空间,向每个存储空间中添加一个或多个文件。
  2. 通过获取已上传文件的地址进行文件的分享和下载。
  3. 通过修改存储空间或文件的读写权限(ACL)来设置访问权限。
  4. 通过阿里云管理控制台、各种便捷工具以及丰富的 SDK 包执行基本和高级 OSS 操作。

OSS 提供多种语言的 和 SDK 包,方便您快速进行二次开发。详情请参见:Java SDK 快速入门

为什么使用阿里云OSS


  1. 阿里云对象存储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 的冗余存储机制,可支持两个存储设施并发损坏时,仍维持数据不丢失。

  1. 之前写的文章是关于Spring Cloud Alibaba的,所以技术选型也就选了阿里的OSS
  2. 腾讯云也有COS对象存储免费使用6个月。
    微服务解决方案 -- OSS对象存储服务 (外传一)

怎么使用


首先新建一个存储空间bucket
微服务解决方案 -- OSS对象存储服务 (外传一)

点击创建Bucket
微服务解决方案 -- OSS对象存储服务 (外传一)
个人开发选择标准存储,读写权限选择公共读
微服务解决方案 -- OSS对象存储服务 (外传一)
记住你的bucket名称 和 Endpoint
微服务解决方案 -- OSS对象存储服务 (外传一)
创建结束。

第二步
微服务解决方案 -- OSS对象存储服务 (外传一)

// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。

根据文档说需要AccessKeyIdAccessKey RAM创建子账号在创建 AccessKey

微服务解决方案 -- OSS对象存储服务 (外传一)
微服务解决方案 -- OSS对象存储服务 (外传一)
勾选编程访问
微服务解决方案 -- OSS对象存储服务 (外传一)
点击刚才创建的用户,将其AccessKey删除,重新创建
微服务解决方案 -- OSS对象存储服务 (外传一)
妥善保管AccessKeySecret
然后我们需要在OSS对改用户进行授权,点击文件管理 ->授权
微服务解决方案 -- OSS对象存储服务 (外传一)
点击新增授权
微服务解决方案 -- 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
微服务解决方案 -- OSS对象存储服务 (外传一)


测试
POSTMAN
微服务解决方案 -- OSS对象存储服务 (外传一)
微服务解决方案 -- OSS对象存储服务 (外传一)
一定要选择File
微服务解决方案 -- OSS对象存储服务 (外传一)
这样我们的文件路径也返回了,前端只要获取到这个路径就可以实现上传和加载图片的功能了。

相关标签: 微服务解决方案