【微服务】⭐️华为云obs功能抽取到公共服务,供所有项目使用

目录

🍸前言

🍻一、公共服务搭建

🍺二、代码实现

1.工具类编写

2.项目引入使用

🍹三、章末


🍸前言

小伙伴们大家好,上次讲了如何本地对接华为云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 相比,并没有减少多少工作量,但是后期如果要加功能的话,就直接可以只修改 公共服务的工具类即可,不用每个项目去做想通的工作了;重要的是思想,在平时开发的过程中除了注意技能的提升也要有这种架构思想,积累起来就好了

文章到这里就结束了~

相关推荐
繁依Fanyi2 小时前
828 华为云征文|华为 Flexus 云服务器搭建 PicGo 图床
服务器·华为·华为云
ZLY_200415 小时前
828华为云征文|docker部署kafka及ui搭建
docker·kafka·华为云
降世神童15 小时前
828华为云征文 | 使用Flexus云服务器X实例部署GLPI资产管理系统
mysql·nginx·华为云
cooldream200918 小时前
828华为云征文 | 华为云Flexus X实例柔性算力助力中小企业和开发者
华为云·x实例·vcpu与内存配比
华为云PaaS服务小智2 天前
华为云ROMA Connect聚焦创新,在Gartner®峰会发布智能集成新视角
华为云
DropLin2 天前
华为云免费ssl证书申请
网络协议·华为云·ssl
Cloud Traveler2 天前
828华为云征文 | 华为云FlexusX实例下的Kafka集群部署实践与性能优化
服务器·性能优化·kafka·华为云
lgbisha3 天前
828华为云征文|华为云Flexus X实例docker部署Jitsi构建属于自己的音视频会议系统
docker·华为云·音视频
程序猿看视界3 天前
Docker 华为云镜像加速器配置
docker·华为云·镜像加速
爱岗酸豆角吖3 天前
828华为云征文| 华为云 Flexus X 实例:引领云计算新时代的柔性算力先锋
华为云·云计算