【微服务】⭐️华为云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.rhkb.cn/news/421425.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推理与训练,分布式训练

什么是推理training 在人工智能领域,推理是指经过训练的机器学习模型从全新的数据(输入)中得出结论(输出)的过程。通俗地讲,推理是模型的实际运行。 什么是训练 inference 在人工智能领域,训…

【JAVA多线程】JDK线程同步工具:Semaphore、CountDownLatch、CyclicBarrier

目录 1.可能会遇到的线程协作场景 2.Semaphore 3.CountDownLatch 4.CyclicBarrier 1.可能会遇到的线程协作场景 在并发编程中,线程除了独自向前运行,还可能相互之间要进行协作,以保证完成最终总的目标。可能会遇到的几种任务之间的协作&…

算法知识点————背包问题【动态规划】【打家劫舍】

万能头文件#include<bits/stdc.h> 01 背包 定义&#xff1a; 物品只能用1次。01对应选还是不选第i个物品 .N个物品、V容量的最大价值。 思路&#xff1a; &#xff08;1&#xff09;f[ i ] [j] 表示前i个物品容量j的最大价值。 &#xff08;2&#xff09;当前背包容量…

中国人民银行:数字人民币交易额已达7万亿元!中俄考虑使用国家数字货币进行双边结算!

近年来&#xff0c;数字货币的迅速发展引起了全球的广泛关注。中国人民银行&#xff08;PBOC&#xff09;近日透露&#xff0c;数字人民币&#xff08;e-CNY&#xff09;的交易额已接近1万亿美元&#xff0c;这标志着中国在数字货币领域的重大进展。同时俄罗斯也表示&#xff0…

file | 某文件夹【解耦合】下的文件查找功能实现及功能单元测试

文件查找工具 概要思路OS模块 --- 学习版os.getcwd()os.path.dirname(os.getcwd())os.path.dirname() 和 os.path.basename() OS模块 — 实战版单元测试解耦合 概要 梳理业务主逻辑&#xff1a; 查看存放被采集JSON数据的文件夹内的文件列表【所有 包含文件夹下的文件夹下的文…

C语言 | Leetcode C语言题解之第395题至少有K个重复字符的最长子串

题目&#xff1a; 题解&#xff1a; int longestSubstring(char* s, int k) {int ret 0;int n strlen(s);for (int t 1; t < 26; t) {int l 0, r 0;int cnt[26];memset(cnt, 0, sizeof(cnt));int tot 0;int less 0;while (r < n) {cnt[s[r] - a];if (cnt[s[r] - …

论文阅读:3D Gaussian Splatting for Real-Time Radiance Field Rendering

论文地址&#xff1a;https://arxiv.org/abs/2308.04079 代码地址&#xff1a;graphdeco-inria/gaussian-splatting: Original reference implementation of "3D Gaussian Splatting for Real-Time Radiance Field Rendering" (github.com) 概要 提出一个实时且能够…

论文解读 | ACL2024 Outstanding Paper:因果指导的主动学习方法:助力大语言模型自动识别并去除偏见...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击阅读原文观看作者直播讲解回放&#xff01; 作者简介 孙洲浩&#xff0c;哈尔滨工业大学SCIR实验室博士生 概述 尽管大语言模型&#xff08;LLMs&#xff09;展现出了非常强大的能力&#xff0c;但它们仍然…

ApplicationVerifier介绍说明

文章目录 1、介绍1、安装2、配置需要验证的项目2、在WinDbg中调试3、其他配置项 1、介绍 AppVerifier 特别用于检测和帮助调试内存损坏、危险的安全漏洞以及受限的用户帐户特权问题。 AppVerifier 有助于创建可靠且安全的应用程序&#xff0c;方法是监视应用程序与Windows操作…

53 - I. 在排序数组中查找数字 I

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9853%20-%20I.%20%E5%9C%A8%E6%8E%92%E5%BA%8F%E6%95%B0%E7%BB%84%E4%B8%AD%E6%9F%A5%E6%89%BE%E6%95%B0%E5%AD%97%20I/README.md 面试题 53 - I. 在排序数组中查找数字 …

Mysql基础练习题 1757.可回收且低脂的产品(力扣)

编写解决方案找出既是低脂又是可回收的产品编号。 题目链接&#xff1a; https://leetcode.cn/problems/recyclable-and-low-fat-products/description/ 建表插入数据&#xff1a; Create table If Not Exists Products (product_id int, low_fats ENUM(Y, N), recyclable …

mysql 之 information_schema

information_schema 是 MySQL 中的一个特殊数据库&#xff0c;它提供了关于 MySQL 服务器中所有数据库、表、列、索引、存储过程、函数、触发器等对象的元数据信息。information_schema 是一个只读数据库&#xff0c;主要用于查询数据库的结构信息&#xff0c;而不是存储用户数…

【网络安全】-文件上传漏洞

文件操作漏洞包括文件上传漏洞&#xff0c;文件包含漏洞&#xff0c;文件下载漏洞。 文章目录 前言 什么是文件上传漏洞&#xff1f; 文件上传的验证与绕过&#xff1a; 1.前端js验证&#xff1a;   Microsft Edge浏览器&#xff1a; Google Chrome浏览器&#xff1a; 2.后端…

[WEBPWN]BaseCTF week1 题解(新手友好教程版)

WEB A Dark Room 这道题的考点是查看网页源代码 网页源代码这里看到的是网页的html css js在用户浏览器上执行的代码 有时候很多铭感信息&#xff0c;或者关键信息。 查看网页源代码的几种方式 1 右键点击查看网页源代码 2 F12 3 Ctrl U 快捷键 HTTP是什么 HTTP&#x…

【F179】基于Springboot+vue实现的幼儿园管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 项目描述 系统管理也都将通过计算机进行整体智能化操作&#xff…

Redis学习Day3——项目工程开发`

扩展阅读推荐&#xff1a; 黑马程序员Redis入门到实战教程_哔哩哔哩_bilibili 使用git命令行将本地仓库代码上传到gitee/github远程仓库-CSDN博客 一、项目介绍及其初始化 学习Redis的过程&#xff0c;我们还将遇到各种实际问题&#xff0c;例如缓存击穿、雪崩、热Key等问题&…

IGNAV_NHC分析

extern int nhc(insstate_t *ins,const insopt_t *opt,const imud_t *imu)函数名 insstate_t* ins IO ins state insopt_t* opt I ins options imud_t* imu I imu measurement data return : 1 (ok) or 0 (fail) 用NHC进行约束&#xff0c;其实用NHC做量测去…

从大脑图谱/ROI中提取BOLD信号

动机 在功能连接&#xff08;Functional Connectivity&#xff0c;FC&#xff09;构建过程中&#xff0c;由于FC中元素数目是节点数目的平方关系&#xff0c;所以在计算FC之前进行数据降维是一个常见的选择。 一般会将体素级/顶点级BOLD信号&#xff08;在2mm的图像分辨率下大脑…

Android libui新加接口,编译报错:error: Please update ABI references

1.背景信息 由于项目需要,要合入google的bug fix:https://cs.android.com/android/_/android/platform/frameworks/native/+/2c1782c6f986debe5ec89d5cdd3a3f08b08d5683 查看google的修改发现,对Transform.h 增加了一个方法:android::ui::Transform::det。合入修改之后,我…

NXP,S32K1XX汽车通用微控制器开发笔记

文章目录 1. 概述2. 开发环境配置2.1 S32 Design Studio2.2 安装SDK2.3 新建demo工程2.4 字体配置2.5 按需求修改demo2.5.1 修改pin脚定义2.5.2 增加串口打印功能2.6 编译代码2.7 debuger 配置参考1. 概述 S32K1系列32位微控制器(MCU)提供基于Arm Cortex-M的MCU,以及基本的…