目录
🍸前言
小伙伴们大家好,上次讲了如何本地对接华为云Obs对象存储服务,在本地项目中通过sdk引入调用官方api的方式实现图片等文件资源上传到华为云存储服务中,这样不仅可以减少服务器存储压力并且适合微服务项目使用;但是微服务项目会将一个项目按照模块划分为多个项目包,如果多个服务需要obs功能,给每个服务都引入obs依赖人后编写api调用的话,会有大量冗余代码,并且耗时耗力,因此可以借助中间服务或者说公共服务来简化该步骤;obs使用的文章链接如下:
【服务对接】✈️SpringBoot 项目整合华为云 obs 对象存储服务-CSDN博客
🍻一、公共服务搭建
何谓公共服务,简单来讲就是多个项目用到的同一种工具可以放到一个单独的模块,有需要的项目通过引入该模块的依赖,然后根据需求使用该公共服务中提供的工具类;比如使用 Hutool提供的工具类就要引入该工具的依赖,我们也可以将经常使用的工具类放到一个单独的项目中,哪个模块需要就通过依赖的方式引入即可
要把华为云obs 服务抽取到公共服务,提供一种简单的思路,不做过多解释;首先是将obs服务的api对接流程在公共服务中再走一遍(因为要将Obs放到该模块了),可以参考之前的文章;之后是要提供一个获取工具类对象的方法,以供引入的项目通过该实例调用公共服务中的工具类方法
🍺二、代码实现
1.工具类编写
1.1 bean 初始化改造
之前单个项目使用时,初始化操作如下,通过@PostConstruct 注解实现将 obsclient 对象注入到容器中
抽取到公共服务后这里需要改动,这里使用了双重校验锁 实现的单例模式,确保在引入了该服务的项目中只有一个 obsutil 对象,(单例模式要实现很简单,两点,一个是禁止别处有途径创建对象,可以通过私有化构造方法实现(只有当前类内部能使用这种方式构建对象),第二点就是提供一个获取对象的方法(双重检验锁可以更大程度上确保只有一个实例被创建)
java
public class ObsUtil {
private static ObsClient obsClient;
private static volatile ObsUtil instance;
private ObsUtil(String accessKey, String secretAccessKey, String endPoint) {
obsClient = new ObsClient(accessKey, secretAccessKey, endPoint);
endPoint);
}
public static ObsUtil getInstance(String accessKey, String endPoint) {
if (instance == null) {
synchronized (ObsUtil.class) {
if (instance == null) {
instance = new ObsUtil(accessKey, secretAccessKey,endPoint);
}
}
}
return instance;
}
...
}
1.2 方法改造工具类编写就跟上篇文章大部分一样,有一点要注意的就是,方法中要加一些参数,比如这是之前的一个上传文件方法,因为提取到公共服务了,obsProperties 也就是华为云Obs配置参数要根据调用方自定义的值,所以这里要把 bucketName 参数改为由方法调用者传入,如下
java
public void uploadPic(String base64, String fileName,String bucketName) {
byte[] bytes = transBase64ToByte(base64);
ObjectMetadata meta = new ObjectMetadata();
// 设置MD5校验。
String md5 = toBase64String(calculateMd5(bytes));
meta.setContentMd5(md5);
try (InputStream inputStream = new ByteArrayInputStream(bytes)) {
PutObjectResult result = obsClient.putObject(bucketName, fileName, inputStream,meta);
} catch (Exception e) {
log.error("Upload failed: ", e);
}
}
2.项目引入使用
2.1依赖引入
这里不做过多解释,就是在需要引入公共服务的项目(后续简称调用方)中 pom.xml 文件中加入公共服务的依赖,公共服务的名字在其 pom.xml 文件中可以自己制定,刷新maven重新导入依赖即可
2.2 调用方配置
2.2.1 参数配置
这里就像之前的文章讲解一样,配置 obs 的参数(key,accesskey,bucketName...),但是可以不用引入华为sdk
2.2.2 初始化配置
一般是在项目的统一 config 类中加入初始化操作,如下:注入调用方自己的 obs 配置类,使用其参数来调用公共服务提供的获取实例方法,并且声明该 bean 对象的名称(为了防止一系列的问题,可能会有 bean 名称冲突)
java
@Configuration
public class Config {
@Resource()
private ObsProperties obsProperties;
@Bean(name = "obsTestUtil")
public ObsUtil obsUtil(){
return ObsUtil.getInstance(obsProperties.getAccessKey(), obsProperties.getSecretAccessKey(), obsProperties.getEndpoint());
}
}
3.调用方具体使用
使用的时候就像普通注入对象一样即可,这里需要指明注入的bean 名称,为了防止出现同一个bean名称时,自动注入的类型不同导致项目报错
java
@Resource(name = "obsTestUtil")
private ObsUtil obsUtil;
...
🍹三、章末
这里就不做测试了,主要是过下抽取服务的流程,以及一些注意点;另外在我写这篇文章的时候,另外想到将工具类再精简一点,就是将 bucketName,expire 等参数在公共服务的 obsUtil 工具类中定义,然后调用方在注入 bean 的时候,可以只用在这里初始化一次即可,后续直接调用提供的方法,不用 obsProperties 再挨个注入了;
其实 首次抽取的时候,要改动的项目跟每个项目单独对接华为 obs 相比,并没有减少多少工作量,但是后期如果要加功能的话,就直接可以只修改 公共服务的工具类即可,不用每个项目去做想通的工作了;重要的是思想,在平时开发的过程中除了注意技能的提升也要有这种架构思想,积累起来就好了
文章到这里就结束了~