SpringCloud实战项目全套学习教程连载中
PassJava 学习教程 简介PassJava-Learning项目是PassJava(佳必过)项目的学习教程。对架构、业务、技术要点进行讲解。
PassJava 是一款Java面试刷题的开源系统,可以用零碎时间利用小程序查看常见面试题,夯实Java基础。
PassJava 项目可以教会你如何搭建SpringBoot项目,Spring Cloud项目
采用流行的技术,如 SpringBoot、MyBatis、Redis、 MySql、 MongoDB、 RabbitMQ、Elasticsearch,采用Docker容器化部署。
更好的阅读体验文档地址:
备用地址:https://jackson0714.github.io/PassJava-Learning
文档连载目录打造一款 刷Java 知识的小程序
打造一款 刷Java 知识的小程序(二)
整合OSS对象存储 一、缘起文件上传在系统中用的很频繁,所以我们需要将上传的文件进行存储,传统的将文件上传到本机已不适用分布式系统。自己搭建文件服务器有复杂性和维护成本。所以我们可以采用市面上成熟的文件存储服务,如阿里云的OSS对象存储服务。
每个 OSS 的用户都会用到上传服务。Web 端常见的上传方法是用户在浏览器或 APP 端上传文件到应用服务器,应用服务器再把文件上传到 OSS。具体流程如下图所示。
和数据直传到 OSS 相比,以上方法有三个缺点:
上传慢:用户数据需先上传到应用服务器,之后再上传到OSS。网络传输时间比直传到OSS多一倍。如果用户数据不通过应用服务器中转,而是直传到OSS,速度将大大提升。而且OSS采用BGP带宽,能保证各地各运营商之间的传输速度。
扩展性差:如果后续用户多了,应用服务器会成为瓶颈。
费用高:需要准备多台应用服务器。由于OSS上传流量是免费的,如果数据直传到OSS,不通过应用服务器,那么将能省下几台应用服务器。
二、技术方案 服务端签名后直传 背景采用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项目中加入依赖项
https://help.aliyun.com/document_detail/32009.html?spm=a2c4g.11186623.6.769.2c5145dc4TUgTa <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.8.0</version> </dependency> 2) 上传文件到OSS @Test void testUploadByOss() throws FileNotFoundException { // Endpoint以杭州为例,其它Region请按实际情况填写。 String endpoint = "http://oss-cn-beijing.aliyuncs.com"; // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。 String accessKeyId = "LTAI4G3KxBJ26EUbWsenmqhP"; String accessKeySecret = "RHtADVlvlKJvVBQnFNNvnne9p4NwnA"; String bucketName = "passjava"; // <yourObjectName>上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。 String localFile = "C:\\Users\\Administrator\\Pictures\\coding_java.png"; String fileKeyName = "coding_java.png"; // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); InputStream inputStream = new FileInputStream(localFile); ossClient.putObject(bucketName, fileKeyName, inputStream); // 关闭OSSClient。 ossClient.shutdown(); } 3.整合Spring Cloud Alicloud OSS 1) passjava-common项目引入spring-cloud-starter-alicloud-oss依赖 <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alicloud-oss</artifactId> </dependency> 2) 配置alicloud oss spring: cloud: alicloud: access-key: xxxx secret-key: xxxx oss: endpoint: oss-cn-beijing.aliyuncs.com 3)测试上传 @Autowired OSSClient ossClient; @Test void testUploadByAlicloudOss() throws FileNotFoundException { String bucketName = "passjava"; String localFile = "C:\\Users\\Administrator\\Pictures\\coding_java.png"; String fileKeyName = "coding_java.png"; InputStream inputStream = new FileInputStream(localFile); ossClient.putObject(bucketName, fileKeyName, inputStream); ossClient.shutdown(); } 4.获取服务端签名 4.1 准备工作:创建一个第三方服务passjava-thirdparty