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

文章到这里就结束了~

相关推荐
laimaxgg13 小时前
Linux关于华为云开放端口号后连接失败问题解决
linux·运维·服务器·网络·tcp/ip·华为云
九河云2 天前
分布式数据库中间件(DDM)的使用场景
数据库·分布式·中间件·华为云
枫叶丹44 天前
【HarmonyOS之旅】基于ArkTS开发(二) -> UI开发之常见布局
ui·华为od·华为·华为云·harmonyos
brrdg_sefg4 天前
飞牛os使用ddns-go配合华为云实现内网穿透
开发语言·golang·华为云
枫叶丹45 天前
【HarmonyOS之旅】基于ArkTS开发(二) -> UI开发三
ui·华为od·华为·华为云·harmonyos
DS小龙哥5 天前
基于华为云车牌识别服务设计的停车场计费系统【华为开发者空间-鸿蒙】
华为·华为云·harmonyos
GIS小小研究僧5 天前
华为云Ubuntu中安装配置PostgreSQL与PostGIS
ubuntu·postgresql·华为云
七天可修改名字一次6 天前
云手机技术架构原理浅析,ARM架构与X86架构的对比
arm开发·矩阵·架构·华为云·云计算·手机·百度云
m0_748236836 天前
828华为云征文|使用Flexus X实例创建FDS+Nginx服务实现图片上传功能
运维·nginx·华为云
Maki Winster9 天前
利用 rclone 挂载华为云 OBS 到本地
华为云