java中几种对象存储(文件存储)中间件的介绍

news2024/11/15 19:54:47

一、前言

在博主得到系统中使用的对象存储主要有OSS(阿里云的对象存储) COS(腾讯云的对象存储)OBS(华为云的对象存储)还有就是MinIO 这些玩意。其实这种东西大差不差,几乎实现方式都是一样,存储模式大同小异。下面介绍几种存储模式在springBoot中的使用。

二、阿里云OSS

阿里云对象存储服务(Object Storage Service,简称OSS)是阿里云对外提供的海量、安全、低成本、高可靠的云存储服务。它具有与平台无关的RESTful API接口,能够提供99.999999999%(11个9)的数据可靠性和99.99%的服务可用性。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

基于OSS,用户可以搭建出各种多媒体分享网站、网盘、个人和企业数据备份等基于大规模数据的服务。OSS非常适合用来存储大量不同大小、格式的非结构化数据,比如视频、图像、文本、日志等,且单个文件最大支持48.8TB,不限文件数量和大小。同时,OSS提供多种存储类型,包括标准存储、低频存储和归档存储,用户可以根据需求选择相应的存储类型。

在使用OSS时,用户可以通过阿里云控制台、图形化工具和命令行工具对数据进行上传、下载和管理。此外,OSS还提供了简单的REST接口,使得用户可以在任何互联网设备上进行数据的上传和下载。

关于OSS的定价和计量计费方式,阿里云提供了详细的说明。用户在使用OSS时,需要注意相关的使用限制和错误码,以确保服务的正常使用。

1、引入依赖

		<!--oss -->
		<dependency>
			<groupId>com.aliyun.oss</groupId>
			<artifactId>aliyun-sdk-oss</artifactId>
			<version>${aliyun-sdk-oss.version}</version>
		</dependency>

2、读取配置

@Data
@Component
@ConfigurationProperties(prefix = "oss.aliyun")
public class AliYunProperties {
    /**域名*/
    private String domain;
    /**地域节点*/
    private String endpoint;
    /**存储桶名称*/
    private String bucketName;
    /**accessKey*/
    private String accessKey;
    /**accessSecret*/
    private String accessSecret;
    /**图片策略*/
    private String styleRule;
    /**缩略图策略*/
    private String thumbnailStyleRule;
    /**文件类型*/
    private List<String> fileTypes;

}

3、实现图片上传

@Slf4j
@Component("aliyun")
public class AliYunFileHandle implements FileStrategy {

    @Autowired
    AliYunProperties aliYunProperties;

    private static OSS ossClient;

    @Override
    public UploadDto upload(MultipartFile file) throws Exception {
        return upload(file, null);
    }

    @Override
    public UploadDto upload(MultipartFile file, String filePath) throws Exception {
        //文件名
        String fileFullName = FileUtil.getName(file.getOriginalFilename());
        InputStream inputStream = file.getInputStream();
        return upload(inputStream, fileFullName, filePath);
    }

    public UploadDto upload(InputStream inputStream, String fileFullName, String filePath) throws Exception {
        if (inputStream == null) {
            throw new Exception("上传文件不能为空");
        }
        OSS ossClient = getOssClient();

        try {
            //时间戳
            String timestamp = String.valueOf(System.currentTimeMillis());
            //文件扩展名
            String extension = FileUtil.getSuffix(fileFullName);
            String fileName = FileUtil.getPrefix(fileFullName);
            List<String> fileTypes = aliYunProperties.getFileTypes();
            if(fileTypes != null) {
                boolean flag= fileTypes.contains(extension);
                Assert.isTrue(flag, "不支持上传的文件类型:" + extension);
            }

            String upFilePath = StringUtils.join(fileName, "_", timestamp, ".", extension);
            if(filePath != null) {
                upFilePath = StringUtils.join(filePath, "/", upFilePath);
            }
            //String upFilePath = StringUtils.join(encodeName, ".", extension);
            // 文件上传
            PutObjectResult putObjectResult = ossClient.putObject(aliYunProperties.getBucketName(), upFilePath, inputStream);
            if (putObjectResult == null) {
                log.error("上传附件到阿里云失败 fileName={}", upFilePath);
                throw new Exception("上传附件 " + upFilePath + " 到阿里云失败 ");
            }

            log.info("oss fileName:" + upFilePath);
            //返回上传结果
            UploadDto uploadDto = new UploadDto();
            uploadDto.setName(upFilePath);
//            uploadDto.setImgUrl(filePath);
//            uploadDto.setKey(upFilePath);
            uploadDto.setCreateTime(DateUtil.date());

//            //缩略图处理
//            if (isImageType(uploadDto.getMediaType())) {
//                BufferedImage image = ImageIO.read(file.getInputStream());
//                uploadDto.setWidth(image.getWidth());
//                uploadDto.setHeight(image.getHeight());
//                uploadDto.setThumbPath(StringUtils.isBlank(aliYunProperties.getThumbnailStyleRule()) ? filePath : filePath + aliYunProperties.getThumbnailStyleRule());
//            }
            return uploadDto;
        } catch (Exception e) {
            log.error("oss 上传失败", e);
            throw new RuntimeException("文件="+fileFullName + " 上传失败");
        } finally {
            ossClient.shutdown();
        }
    }

    private OSS getOssClient() {
        // 调用了shutdown方法,暂时不使用连接池方式
//        if(ossClient == null) {
            ossClient = new OSSClientBuilder().build(aliYunProperties.getEndpoint(),
                    aliYunProperties.getAccessKey(),
                    aliYunProperties.getAccessSecret());
//        }
        return ossClient;
    }

    @Override
    public byte[] download(String key) throws Exception {
        if (key == null) {
            throw new Exception("文件key不能为空");
        }
        OSS ossClient = getOssClient();
        try {
            // 填写不包含Bucket名称在内的Object完整路径,例如testfolder/exampleobject.txt
            OSSObject ossObject = ossClient.getObject(new GetObjectRequest(aliYunProperties.getBucketName(), key));
            return IoUtil.readBytes(ossObject.getObjectContent());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ossClient.shutdown();
        }
        return null;
    }


    @Override
    public void delete(String key) {

    }

}

三、腾讯云 COS

腾讯云对象存储(Cloud Object Storage,COS)是一种分布式存储服务,专为存储海量文件而设计。用户可以通过网络随时存储和查看数据,享受高扩展性、低成本、可靠且安全的数据存储服务。

COS通过控制台、API、SDK和工具等多样化方式,简单、快速地接入,实现海量数据存储和管理。用户可以轻松进行任意格式文件的上传、下载和管理,一个存储桶可容纳无数个对象。对象(Object)是COS的基本单元,可以理解为任何格式类型的数据,例如图片、文档和音视频文件等。

根据访问频度的高低,COS提供三种对象的存储级别:标准存储、低频存储和归档存储。标准存储为用户提供了高可靠性、高可用性和高性能的对象存储服务,适用于有大量热点文件,需要频繁访问数据的业务场景,如热点视频、社交图片等。低频存储则适用于不频繁访问数据的存储,如网盘数据、大数据分析等,它同样提供高可靠性,但存储成本和访问时延相对较低。

此外,腾讯云还提供了COSBrowser这一桌面版工具,用户可以使用该工具进行可视化、方便的数据上传、下载等操作。这些功能使得COS成为一个强大且灵活的云存储解决方案,能够满足各种业务类型的存储需求。

1、引入依赖

		<!--cos -->
		<dependency>
			<groupId>com.qcloud</groupId>
			<artifactId>cos_api</artifactId>
			<version>${cos_api.version}</version>
		</dependency>
		

2、读取配置

@Data
@Component
@ConfigurationProperties(prefix = "oss.tencent")
public class TencentProperties {
	
    /**域名*/
    private String domain;
    /**地域节点*/
    private String region;
    /**存储桶名称*/
    private String bucketName;
    /**secretId*/
    private String secretId;
    /**secretKey*/
    private String secretKey;
    /**图片策略*/
    private String styleRule;
    /**缩略图策略*/
    private String thumbnailStyleRule;
    /**文件类型*/
    private List<String> fileTypes;
}

3、文件上传下载

@Slf4j
@Component("tencent")
public class TencentFileHandle implements FileStrategy {

    @Autowired
    TencentProperties tencentProperties;


    // 创建 COSClient 实例,这个实例用来后续调用请求
    COSClient createCOSClient() {
        // 设置用户身份信息。
        // SECRETID 和 SECRETKEY 请登录访问管理控制台 https://console.cloud.tencent.com/cam/capi 进行查看和管理
        String secretId = tencentProperties.getSecretId();
        String secretKey = tencentProperties.getSecretKey();
        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);

        // ClientConfig 中包含了后续请求 COS 的客户端设置:
        ClientConfig clientConfig = new ClientConfig();

        // 设置 bucket 的地域
        // COS_REGION 请参照 https://cloud.tencent.com/document/product/436/6224
        clientConfig.setRegion(new Region(tencentProperties.getRegion()));

        // 设置请求协议, http 或者 https
        // 5.6.53 及更低的版本,建议设置使用 https 协议
        // 5.6.54 及更高版本,默认使用了 https
        clientConfig.setHttpProtocol(HttpProtocol.https);

        // 以下的设置,是可选的:

        // 设置 socket 读取超时,默认 30s
        clientConfig.setSocketTimeout(30*1000);
        // 设置建立连接超时,默认 30s
        clientConfig.setConnectionTimeout(30*1000);

        // 如果需要的话,设置 http 代理,ip 以及 port
//        clientConfig.setHttpProxyIp("httpProxyIp");
//        clientConfig.setHttpProxyPort(80);

        // 生成 cos 客户端。
        return new COSClient(cred, clientConfig);
    }

    // 创建 TransferManager 实例,这个实例用来后续调用高级接口
    TransferManager createTransferManager() {
        // 创建一个 COSClient 实例,这是访问 COS 服务的基础实例。
        // 详细代码参见本页: 简单操作 -> 创建 COSClient
        COSClient cosClient = createCOSClient();

        // 自定义线程池大小,建议在客户端与 COS 网络充足(例如使用腾讯云的 CVM,同地域上传 COS)的情况下,设置成16或32即可,可较充分的利用网络资源
        // 对于使用公网传输且网络带宽质量不高的情况,建议减小该值,避免因网速过慢,造成请求超时。
        ExecutorService threadPool = Executors.newFixedThreadPool(32);

        // 传入一个 threadpool, 若不传入线程池,默认 TransferManager 中会生成一个单线程的线程池。
        TransferManager transferManager = new TransferManager(cosClient, threadPool);

        // 设置高级接口的配置项
        // 分块上传阈值和分块大小分别为 5MB 和 1MB
        TransferManagerConfiguration transferManagerConfiguration = new TransferManagerConfiguration();
        transferManagerConfiguration.setMultipartUploadThreshold(5*1024*1024);
        transferManagerConfiguration.setMinimumUploadPartSize(1*1024*1024);
        transferManager.setConfiguration(transferManagerConfiguration);

        return transferManager;
    }

    void shutdownTransferManager(TransferManager transferManager) {
        // 指定参数为 true, 则同时会关闭 transferManager 内部的 COSClient 实例。
        // 指定参数为 false, 则不会关闭 transferManager 内部的 COSClient 实例。
        transferManager.shutdownNow(true);
    }

    @Override
    public UploadDto upload(MultipartFile file) throws Exception {
        return upload(file, null);
    }

    @Override
    public UploadDto upload(MultipartFile file, String filePath) throws Exception {
        //文件名
        String fileFullName = FileUtil.getName(file.getOriginalFilename());
        InputStream inputStream = file.getInputStream();
        return upload(inputStream, fileFullName, filePath);
    }

    public UploadDto upload(InputStream inputStream, String fileFullName, String filePath) throws Exception {
        if (inputStream == null) {
            throw new Exception("上传文件不能为空");
        }
        TransferManager transferManager = createTransferManager();
        String bucketName = tencentProperties.getBucketName();

        //int inputStreamLength = 1024 * 1024;
//        byte data[] = new byte[inputStreamLength];
//        InputStream inputStream = new ByteArrayInputStream(data);

        ObjectMetadata objectMetadata = new ObjectMetadata();
        // 上传的流如果能够获取准确的流长度,则推荐一定填写 content-length
        // 如果确实没办法获取到,则下面这行可以省略,但同时高级接口也没办法使用分块上传了
        //objectMetadata.setContentLength(inputStreamLength);
        try {
            //时间戳
            String timestamp = String.valueOf(System.currentTimeMillis());
            //文件扩展名
             String extension = FileUtil.getSuffix(fileFullName);
            String fileName = FileUtil.getPrefix(fileFullName);
            List<String> fileTypes = tencentProperties.getFileTypes();
            if(fileTypes != null) {
                boolean flag= fileTypes.contains(extension);
                Assert.isTrue(flag, "不支持上传的文件类型:" + extension);
            }
            String upFilePath = StringUtils.join(fileName, "_", timestamp, ".", extension);
            if(filePath != null) {
                upFilePath = StringUtils.join(filePath, "/", upFilePath);
            }
            String key = upFilePath;
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, inputStream, objectMetadata);
            // 高级接口会返回一个异步结果Upload
            // 可同步地调用 waitForUploadResult 方法等待上传完成,成功返回UploadResult, 失败抛出异常
            Upload upload = transferManager.upload(putObjectRequest);
            UploadResult uploadResult = upload.waitForUploadResult();
            if (uploadResult == null) {
                log.error("上传附件到腾讯云失败 fileName={}", upFilePath);
                throw new Exception("上传附件 " + upFilePath + " 到腾讯云失败 ");
            }

            log.info("cos fileName:" + upFilePath);
            //返回上传结果
            UploadDto uploadDto = new UploadDto();
            uploadDto.setName(upFilePath);
//            uploadDto.setKey(upFilePath);
            uploadDto.setCreateTime(DateUtil.date());
            return uploadDto;
        } catch (Exception e) {
            log.error("cos 上传失败", e);
            throw new RuntimeException("文件="+fileFullName + " 上传失败");
        } finally {
            shutdownTransferManager(transferManager);
        }
    }

    @Override
    public byte[] download(String key) throws Exception {
        return null;
    }


    @Override
    public void delete(String key) {

    }

}

四、华为云OBS

华为云OBS,即华为云对象存储服务(Object Storage Service),是华为云提供的一种简单、高效、安全的云存储解决方案。它基于对象存储架构,为用户提供了海量、安全、高可靠、低成本的数据存储能力,且无需考虑容量限制。

华为云OBS具有以下主要特点和功能:

  1. 海量存储与高性能:OBS提供了超大存储容量的能力,适合存放任意类型的文件,并支持高速的数据存取和传输,满足用户对于大规模数据存储和高效访问的需求。
  2. 数据安全性:OBS通过多重安全机制和加密技术,保障用户数据的安全性和隐私性。同时,它还提供数据备份和恢复功能,确保数据的可靠性和完整性。
  3. 灵活配置与管理:OBS提供了灵活的配置选项和丰富的管理工具,用户可以根据实际需求定制存储方案,并通过可视化界面或API接口进行便捷的数据管理操作。
  4. 跨域资源共享:OBS支持CORS(跨域资源共享)规范,使得跨域请求可以在OBS上获取资源,方便用户在不同域之间进行数据共享和交互。
  5. 生命周期管理:OBS支持对对象版本进行生命周期管理,通过预定义的生命周期规则,自动执行数据的转换、迁移或删除等操作,帮助用户更好地管理数据生命周期。

此外,华为云OBS还提供了多种存储类型供用户选择,以满足不同业务场景的需求。同时,它与其他华为云服务和产品无缝集成,为用户提供一站式云计算基础设施服务体验。

1、引入依赖

<dependency>
    <groupId>com.obs</groupId>
    <artifactId>obs</artifactId>
    <version>3.2.5</version>
</dependency>

2、需要的配置

华为云OBS存储桶名称
obs.bucketName=your-bucket-name
#华为云OBS服务节点,如上海(China East)
obs.endpoint=http://your-endpoint
#华为云OBS账户AK
obs.accessKey=your-access-key-id
#华为云OBS账户SK
obs.secretKey=your-secret-access-key

3、代码实现

import com.obs.services.ObsClient;
import com.obs.services.model.PutObjectRequest;
import com.obs.services.model.PutObjectResult;
 
public class OBSExample {
    public static void main(String[] args) {
        // 填入你的OBS访问密钥、秘钥和地址
        String accessKey = "你的Access Key";
        String secretKey = "你的Secret Key";
        String endPoint = "你的End Point";
        String bucketName = "你的Bucket Name";
        String objectKey = "你要上传的Object Key";
        String filePath = "文件路径";
 
        try {
            // 创建ObsClient实例
            ObsClient obsClient = new ObsClient(accessKey, secretKey, endPoint);
 
            // 创建上传请求
            PutObjectRequest request = new PutObjectRequest();
            request.setBucketName(bucketName); // 设置Bucket名称
            request.setObjectKey(objectKey); // 设置Object名称
            request.setFilePath(filePath); // 设置文件路径
 
            // 上传文件
            PutObjectResult result = obsClient.putObject(request);
            System.out.println("Upload file successfully, ETag:" + result.getETag());
 
            // 关闭ObsClient实例
            obsClient.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

五、MinIo

Minio是GlusterFS创始人之一Anand Babu Periasamy发布新的开源项目。基于Apache License v2.0开源协议的对象存储项目,采用Golang实现,客户端支Java,Python,Javacript, Golang语言。

其设计的主要目标是作为私有云对象存储的标准方案。主要用于存储海量的图片,视频,文档等。非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

实现也差不多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1510299.html

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

相关文章

StringBuilder --java学习笔记

StringBuilder 代表可变字符串对象&#xff0c;相当于是一个容器&#xff0c;它里面装的字符串是可以改变的&#xff0c;就是用来操作字符串的StringBuilder比String更适合做字符串的修改操作&#xff0c;效率会更高&#xff0c;代码也会更简洁 StringBuilder的常用构造器和方…

单目标/多目标樽海鞘群优化算法——源码

目录 一、樽海鞘群优化算法&#xff1a; 二、多目标樽海鞘群优化算法&#xff1a; 三、代码运行结果&#xff1a; 四、代码下载&#xff1a; 一、樽海鞘群优化算法&#xff1a; 澳大利亚学者Seyedali Mirjalili等人于2017年提出了樽海鞘群算法&#xff0c;该算法源于对海底…

【C++】string类(介绍、常用接口)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;http://t.csdnimg.cn/eCa5z 目录 string类的常用接口说明 string类对象的常见构造 ​编辑 string字符串的遍历&#xff08;迭代器&#xf…

攻防演练|某车企攻防小记

前言 专注于web漏洞挖掘、内网渗透、免杀和代码审计&#xff0c;感谢各位师傅的关注&#xff01;网安之路漫长&#xff0c;与君共勉&#xff01; 实习期间针对某车企开展的一次攻防演练&#xff0c;过程很曲折&#xff0c;当时的记录没有了只是简单的总结一下。 攻击路径 收…

【掌握版本控制:Git 入门与实践指南】操作仓库文件|分支管理

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;泥中に咲く—ウォルピスカーター 0:34━━━━━━️&#x1f49f;──────── 4:46 &#x1f504; ◀️ ⏸ ▶…

【SQL】601. 体育馆的人流量(with as 临时表;id减去row_number()思路)

前述 知识点学习&#xff1a; with as 和临时表的使用12、关于临时表和with as子查询部分 题目描述 leetcode题目&#xff1a;601. 体育馆的人流量 思路 关键&#xff1a;如何确定id是连续的三行或更多行记录 方法一&#xff1a; 多次连表&#xff0c;筛选查询方法二&…

Camtasia2024使用问题、功能特点和更新内容等相关信息

作为软件专家&#xff0c;对于市面上各类软件都有较为深入的了解&#xff0c;下面是关于Camtasia2024的使用问题、功能特点和更新内容等相关信息&#xff1a; Camtasia2024win-安装包下载如下: https://wm.makeding.com/iclk/?zoneid56867 Camtasia2024mac-安装包下载如下: …

基于PyTorch深度学习实战入门系列-(3)Numpy基础下

使用mat创建矩阵 a np.mat([[5, 6], [7, 8]]) b np.mat([[1, 2], [3, 4]]) print(a) print(b) print(type(a)) print(type(b))矩阵的加减乘除运算 data1 np.mat([[1, 2], [3, 4], [5, 6]]) data2 np.mat([1, 2]) data3 np.mat([[5, 6], [7, 8]]) print(data1 data2) prin…

【linux线程(一)】什么是线程?怎样操作线程?

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux线程 1. 前言2. 什么是线…

CFINet

文章目录 AbstractIntroductionContributionsRelated Works锚点细化和区域候选小目标检测的特征模拟目标检测的对比学习MethodTowards Better ProposalsLimitations of Cascade RPNCourse-to-fine RPN(CRPN)Loss Function小目标检测的特征模拟范例特征Feat2Embed ModuleLoss …

20240309web前端_第一周作业_豆瓣电影

作业四&#xff1a;豆瓣电影 成果展示&#xff1a; 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0…

地平线旭日x3派部署yolov5--全流程

地平线旭日x3派部署yolov5--全流程 前言一、深度学习环境安装二、安装docker三、部署3.1、安装工具链镜像3.2、配置天工开物OpenExplorer工具包3.3、创建深度学习虚拟空间&#xff0c;安装依赖&#xff1a;3.4、下载yolov5项目源码并运行3.5、pytorch的pt模型文件转onnx3.6、最…

JavaWeb--Maven

一&#xff1a;概述 1.简介 Maven 是专门用于管理和构建 Java 项目的工具&#xff0c;它的主要功能有&#xff1a; 提供了一套标准化的项目结构 提供了一套标准化的构建流程&#xff08;编译&#xff0c;测试&#xff0c;打包&#xff0c;发布 …… &#xff09; 提供了一套…

这个学习Python的神仙网站,后悔没早点发现

Python 作为时下最流行的编程语言&#xff0c;很多初学者都将它作为自学编程的首选。不管是有编程经验的开发者&#xff0c;还是新手小白&#xff0c;在这个 AIGC 时代&#xff0c; Python 都可以带你探索新世界。 入门 Python 绝非难事&#xff0c;但如何让自己坚持学下去是如…

图及图的存储

目录 1.图的相关概念 2.图的存储 2.1.直接存法 1.查询是否存在某条边 2.遍历一个点的所有出边 3..遍历整个图 应用 2.2.邻接矩阵 1.查询是否存在某条边 2.遍历一个点的所有出边 3..遍历整个图 应用 2.3.邻接表 1.查询是否存在某条边 2.遍历一个点的所有出边 3..遍…

数据库不应放在容器中?- B站Kubernetes有状态服务实践(Elasticsearch/Clickhouse)

本期作者 前言 云原生时代下&#xff0c; Kubernetes已成为容器技术的事实标准&#xff0c; 使得基础设施领域应用下自动化运维管理与编排成为可能。对于无状态服务而言&#xff0c; 业界早已落地数套成熟且较完美的解决方案。可对于有状态的服务&#xff0c; 方案的复杂度就以…

Spring Cloud Alibaba微服务从入门到进阶(一)

Springboot三板斧 1、加依赖 2、写注解 3、写配置 Spring Boot Actuator Spring Boot Actuator 是 Spring Boot 提供的一系列用于监控和管理应用程序的工具和服务。 SpringBoot导航端点 其中localhost:8080/actuator/health是健康检查端点&#xff0c;加上以下配置&#xf…

关于yolov8文档的记录,补充一些整理的知识点

2023年由Ultralytics 提供了YOLOv8开源项目。YOLOv8 支持全方位的视觉 AI 任务&#xff0c;包括检测、分割、姿态估计、跟踪和分类。这种多功能性使用户能够在各种应用和领域中利用YOLOv8 的功能。安装yolov8开源项目 pip install githttps://github.com/ultralytics/ultralyti…

什么是防静电晶圆隔离膜?一分钟让你了解抗静电晶圆隔离纸

防静电晶圆隔离膜&#xff0c;也被称为防静电蓄积纸、硅片纸、半导体晶圆盒内缓冲垫片等多种名称&#xff0c;是半导体制造和运输过程中的一种重要辅助材料。 该隔离膜具备多种特性&#xff0c;如防静电、无尘、不掉屑、强韧耐用等&#xff0c;这些特性使其在半导体制造和运输中…

YOLOv8改进 | 注意力机制 | 添加YOLO-Face提出的SEAM注意力机制优化物体遮挡检测(附代码 + 修改教程)

一、本文介绍 本文给大家带来的改进机制是由YOLO-Face提出能够改善物体遮挡检测的注意力机制SEAM,SEAM(Spatially Enhanced Attention Module)注意力网络模块旨在补偿被遮挡面部的响应损失,通过增强未遮挡面部的响应来实现这一目标,其希望通过学习遮挡面和未遮挡面之间的…