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

news2024/9/27 7:26:50

目录

🍸前言

🍻一、公共服务搭建

🍺二、代码实现

        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.coloradmin.cn/o/2125844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【QT】常用控件-下

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:QT 目录 👉🏻QComboBox👉🏻 QSpinBox👉🏻QDateTimeEdit👉🏻QD…

时序预测 | MATLAB实现BKA-XGBoost(黑翅鸢优化算法优化极限梯度提升树)时间序列预测

时序预测 | MATLAB实现BKA-XGBoost(黑翅鸢优化算法优化极限梯度提升树)时间序列预测 目录 时序预测 | MATLAB实现BKA-XGBoost(黑翅鸢优化算法优化极限梯度提升树)时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 Matlab实现BKA-XGBoost时间序列预测&a…

datasophon升级海豚调度dolphinscheduler为3.2.2

一、参考博主升级3.2.1文章:datasophon升级海豚调度为3.2.1_海豚调度3.2.2 mysql包找不到-CSDN博客 二、升级后woker-server启动报错如下: 原因是worker-server下conf/common.properties中的:resource.storage.typeNONE, 解决很简…

如何划分类/单一职权原则SRP

参考:单一职责 -- 每个类只负责一个功能_每个类应该只负责一个功能,遵循单一职责原则。-CSDN博客 类有且只有一个原因需要修改它,这样的才是一个结构简洁的类。 结合上面的例子,需要注意的点: 1.比如搜索数据库,需要…

Procdump抓ToDesk密码

目录 前言 1.工具教程 2.转储数据 3.密码获取 4.总结 前言 本文是因为在公众号上看到一篇文章随想着实战中利用ToDesk秀操作失败后,实验环境成功复现后写下。ProcDump[1] 是一个命令行实用工具,其主要用途是监视应用程序的 CPU 峰值,并在…

mybatis 查询Not Found TableInfoCache

近期在工程迁移中遇到一个mybatis查询的问题,检查代码没有问题,但是报Not Found TableInfoCache 解决过程 是不是数据库对应表错误或者实体类指定的表名错误 查看配置文件链接的数据源是否正确TableName中指定的表名然后去数据库看一下是否存在 如果…

象过河仓库管理软件,轻松实现无纸化录入,自动化记账

在如今快速发展的商业环境中,仓库管理面临着手工记账效率低下,容易引发数据不准确,滞后,错漏频发,盘点耗时费力等问题。为了解决这些问题,象过河仓库管理软件应运而生,轻松实现无纸化录入&#…

支付环节攻击方式与漏洞类型

支付环节攻击方式与漏洞类型 1.概述2.卡复制3.卡数据破解与篡改4.网络欺骗攻击5.线下欺骗攻击6.支付身份伪造7.支付逻辑绕过8.数据不同步9.支付数据篡改10.条件竞争漏洞(并发)11.拒绝服务 参考自:https://www.topsec.com.cn/uploads/2023-10-…

希捷,AI时代的存储“破壁者”

喜欢跑步或者经常看马拉松等比赛的读者知道,当选手经过专业训练成绩突飞猛进后,就会有一段时间停滞不前。这个阻碍可能是物理的、心理的或是技术的障碍,只有突破这个“壁垒”,才能成为更好的自己。 对于一家企业来说,…

100.WEB渗透测试-信息收集-网络空间搜索引擎shodan(2)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:99.WEB渗透测试-信息收集-网络空间搜索引擎shodan(1)-CSDN博客 Sh…

读论文-《基于计算机视觉的工业金属表面缺陷检测综述》

文章目录 1. 背景1.1 工业需求1.2 传统方法的局限1.3 计算机视觉技术的优势 2. 技术流程2.1 光学成像2.1.1照明方式2.1.2 缺陷和背景特性 2.2 图像预处理2.3 缺陷检测2.4 结果分析和决策 3. 关键算法3.1 光学成像技术相关算法3.2 图像预处理相关算法3.2.1 图像增强3.2.2特征提取…

wakenet尾迹

1、数据集介绍SWIM_Dataset_1.0.0 1.1标注文件介绍 标注文件介绍&#xff0c; 第一种&#xff1a;角度和框的坐标 <annotation><folder>Positive</folder><filename>00001</filename>文件名字<format>jpg</format>图片后缀<s…

太速科技-基于XC7Z100+AD9361的双收双发无线电射频板卡

基于XC7Z100AD9361的双收双发无线电射频板卡 一、板卡概述 基于XC7Z100AD9361的双收双发无线电射频板卡是基于Xilinx ZYNQ FPGA和ADI的无线收发芯片AD9361开发的专用功能板卡&#xff0c;用于4G小基站&#xff0c;无线图传&#xff0c;数据收发等领域。 二、板卡…

[产品管理-8]:NPDP新产品开发 - 6 - 商业画布、商业模式、创新模式

目录 一、商业画布&#xff1a;九个核心部件 二、商业模式 三、创新模式 3.1 什么是创新 1、传统与创新模式的对比 2、创新模式的具体类型 3、企业创新模式的分类 4、总结 3.2 创新模式 1. 已知领域 2. 未知领域 一、商业画布&#xff1a;九个核心部件 商业画布&…

【C语言】选择排序及优化、冒泡排序、计数排序的实现

目录 一、选择排序1.1 常规版&#xff08;一次排好一个数&#xff09;1.1.1 基本思想1.1.2 实现思路1.1.3 代码 1.2 优化版&#xff08;一次排好两个数&#xff09;1.2.1 实现思路1.2.2 代码 1.3 时间复杂度 二、冒泡排序2.1 实现思路2.2 代码2.3 时间复杂度 三、计数排序3.1 基…

DroidBot-GPT: GPT-powered UI Automation for Android论文学习

本文介绍了DroidBot GPT&#xff0c;这是一种利用类似GPT的大型语言模型&#xff08;LLM&#xff09;自动化与Android移动应用程序交互的工具。给定所需任务的自然语言描述&#xff0c;DroidBot GPT可以自动生成并执行导航应用程序以完成任务的操作。它的工作原理是将应用程序G…

99.游戏安全项目-可见数据的搜索与技巧

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 上一个内容&#xff1a;98.游戏的启动与多开-分析与实现多开器 下图中红框位置显示的数据&#xff0c;只有下图…

Avaloia 实现国产麒麟系统中文显示界面

最近在搞一个国产麒麟系统的接口对接&#xff0c;因为&#xff0c;接口内含复杂的签名验证&#xff0c;而且还是离线环境&#xff0c;所以&#xff0c;postman不是很好用。 就想着哪个方式好一些&#xff0c;主要是有选择图片的操作&#xff0c;所以&#xff0c;在Electron和A…

有了它,Python性能瓶颈消失!

声明&#xff1a;此篇为 ai123.cn 原创文章&#xff0c;转载请标明出处链接&#xff1a;https://ai123.cn/#1 作为一名互联网行业的Python工程师&#xff0c;你是否也遇到过解释型语言在处理大量数据时速度较慢、内存占用高、并行处理困难、调试复杂、扩展性差和性能瓶颈等各种…

OpenCV-模板匹配多个目标

文章目录 一、基本概念二、基本步骤1.图像准备2.图像预处理3.执行模板匹配4.定位匹配区域5.处理多个匹配6.优化和验证 三、代码实现1.图片读取2.图像预处理3.模板匹配4.绘制矩形框 三、总结 模型匹配&#xff08;Model Matching&#xff09;是一个广泛应用的概念&#xff0c;其…