对象存储模块
[一]基础模块
oss-spring-boot-starter
[1]用途
工程中依赖了 oss-spring-boot-starter
模块,同时设定一定的配置参数,就可以开启对象存储支持。
当前版本中的对象存储模块,不再采用原来 dialect 可切换方式,来支持不同厂商的 OSS。而改为完全使用 AWS SDK V2 版本进行重构,而且是仅使用 AWS SDK V2 来实现多厂商的兼容。
说明
现目前绝大多数兼容 S3 的 OSS 厂商提供的 API,其实均是基于 AWS SDK V1 进行开发,除了兼容 S3 协议以外,有结合自己需求进行了扩展。虽然,不同厂商 OSS SDK 或 API 还是有所差异,但是整体风格、用法甚至类和方法的命名,还是与 S3 V1 保持一致。
但是,AWS SDK V2 的 API 与 V1 版本 API 出现了较大的差异,加之大多数 OSS 厂商 SDK 还是使用阻塞式方式,因此就使得很难使用同一种方式(主要是体力劳动),来同时适配不同厂商 OSS 和 AWS SDK V2。
个人观点认为:AWS SDK V2 API 是未来的标准化的参考,各大 OSS 厂商 SDK 要么维持现状,如果未来要大规模改版也会向着 AWS SDK V2 方向改。而且,AWS SDK V2 虽然 API 变化较大,但毕竟还是遵照的 S3 协议,基本操作还是可以兼容现有各厂商 OSS。
所以,综上考虑,未来对象存储仅使用 AWS SDK V2,而且能够满足大多数使用场景,就不再过多投入精力考虑其他厂商 OSS 的兼容问题。
[2]准备
搭建 Minio(或其他 OSS) 等基础设施。
[3] 用法
添加依赖
在工程中添加依赖:
<dependency>
<groupId>cn.herodotus.stirrup</groupId>
<artifactId>oss-spring-boot-starter</artifactId>
</dependency>
环境适配
oss-spring-boot-starter
模块中,包含了阻塞式和响应式两部分代码,会自动判断当前是阻塞式还是响应式环境,自动开启相关环境下的支持。
[二]远程访问模块
rpc-client-oss-spring-boot-starter
[1]用途
oss-spring-boot-starter
模块仅适用于搭建对象存储服务,以接口的形式对各种"客户端"供文件上传和下载等功能的支撑。
在有些需求场景下,需要在服务间实现文件的远程传输和管理,这种情况下 oss-spring-boot-starter
就无法满足。当然,用户可以根据自己的实际需求,在 Dante Cloud 的基础上自己扩展或添加功能,但这毕竟还要花费时间和精力进行开发。
为了方便用户的使用,Dante Cloud 自 3.3.5.0 版本,新增了 rpc-client-oss-spring-boot-starter
对象存储远程调用模块。结合 3.3.4.0 后新增的服务本地文件管理,就可以实现服务间文件的远程上传于下载。
[2] 用法
rpc-client-oss-spring-boot-starter
支持响应式环境和阻塞式环境,阻塞式环境使用 Openfeign,其它环境使用 GPRC。会根据当前服务依赖的组件自动切换配置。
需要注意的是,rpc-client-oss-spring-boot-starter
无法单独使用,需要配合以下组件来确定具体远程协议后,才能使用。
- 如果添加了
spring-cloud-starter-openfeign
依赖,就会开启 Openfeign 方式远程调用。 - 如果添加了
grpc-client-spring-boot-starter
依赖,就会开启 GRPC 方式远程调用。
警告
需要注意的是,使用 rpc-client-oss-spring-boot-starter
时还要要考虑好远程服务的调用端和被调用端环境的匹配问题。
注:调用端,即需要上传和下载文件支持的服务;被调用端,即对象存储服务,也就是当前 Dante Cloud 中的
herodotus-cloud-oss-ability
服务。
因为,当前 Dante Cloud 的对象存储服务,既支持响应式环境(默认)又支持阻塞式环境,那么使用 rpc-client-oss-spring-boot-starter
的服务,就需要根据对象存储服务的环境情况选择与之匹配的远程调用方式。
- 如果远程服务的调用端和被调用端都是阻塞式环境,即需要实现远程上传和下载支持的服务是 Servlet 的,同时对象存储服务也是 Servlet 的,那么就建议使用 Openfeign 方式。在调用端添加
spring-cloud-starter-openfeign
依赖。 - 如果远程服务的调用端和被调用端有一端或者两端都是响应式环境,那么就建议使用 GPRC 方式。在调用端添加
grpc-client-spring-boot-starter
依赖。
[3] 说明
当前的远程文件上传和下载机制的设计,是以对象存储为中心,服务间的文件传输均是先上传至对象存储服务,再下载至服务本地。是无法做到脱离对象存储服务,实现任意服务间的上传和下载。
并不是技术上无法实现服务间点对点的文件传输,而是实现难度较大并且不便于管理意义不大。如果您真有类似的需求,那么考虑同一服务器服务间共享磁盘或者跨服务器使用第三方组件实现文件同步更实际一些。