当前位置: 首页 > article >正文

【微服务】⭐️华为云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 对象,(单例模式要实现很简单,两点,一个是禁止别处有途径创建对象,可以通过私有化构造方法实现(只有当前类内部能使用这种方式构建对象),第二点就是提供一个获取对象的方法(双重检验锁可以更大程度上确保只有一个实例被创建)

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 参数改为由方法调用者传入,如下


    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 名称冲突)

@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名称时,自动注入的类型不同导致项目报错

    @Resource(name = "obsTestUtil")
    private ObsUtil obsUtil;

    ...

 🍹三、章末

        这里就不做测试了,主要是过下抽取服务的流程,以及一些注意点;另外在我写这篇文章的时候,另外想到将工具类再精简一点,就是将 bucketName,expire 等参数在公共服务的 obsUtil 工具类中定义,然后调用方在注入 bean 的时候,可以只用在这里初始化一次即可,后续直接调用提供的方法,不用 obsProperties 再挨个注入了;

        其实 首次抽取的时候,要改动的项目跟每个项目单独对接华为 obs 相比,并没有减少多少工作量,但是后期如果要加功能的话,就直接可以只修改 公共服务的工具类即可,不用每个项目去做想通的工作了;重要的是思想,在平时开发的过程中除了注意技能的提升也要有这种架构思想,积累起来就好了

        文章到这里就结束了~


http://www.kler.cn/a/300685.html

相关文章:

  • 登录校验Cookie、Session、JWT
  • HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (三、影视搜索页功能实现)
  • Spring框架 了解
  • VSCode代理配置导致的SSL证书验证错误及解决方案
  • 10 为什么系统需要引入分布式、微服务架构
  • 从字符串使用看Golang和Rust对内存使用的区别
  • 【机器学习】马尔可夫随机场的基本概念、和贝叶斯网络的联系与对比以及在python中的实例
  • JS设计模式之装饰者模式:优雅的给对象增添“魔法”
  • 健身房|基于springboot的健身房管理系统设计与实现(附项目源码+论文+数据库)
  • Python数据分析与可视化
  • leetcode hot100_part01_哈希
  • Spring和Spring FrameWork有什么关系?两者是同一个东西吗?
  • 白帽SEO搜索引擎pc端怎么引流
  • Chrome和Chromium浏览器有什么不同?
  • knowLedge-在组件的第一次创建时执行某个方法,而在后续的创建中不执行:
  • 智能路口安全预警系统:精准提醒降低事故发生率
  • 继收购西门子物流自动化后,丰田又投资一家AGV公司,智能物流版图已极其夸张...
  • less和css在写法上有什么区别吗?
  • yield return request.SendWebRequest()
  • 9.11近日工作踩坑
  • 828华为云征文 | 华为云Flexusx实例,高效部署Servas书签管理工具的优选平台
  • Dynamics CRM Ribbon Workbench-the solution contains non-entity components
  • webGIS后端程序员学习路线
  • 基于SSM的志愿者管理系统(含源码+sql+视频导入教程+文档+PPT)
  • 说说Canny边缘检测算子?
  • 语音转文字工具全解析