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

Springboot对接ceph集群以及java利用s3对象网关接口与ceph集群交互

springboot中引入相关依赖

        <dependency><groupId>software.amazon.awssdk</groupId><artifactId>regions</artifactId><version>2.22.13</version></dependency><dependency><groupId>software.amazon.awssdk</groupId><artifactId>eksauth</artifactId><version>2.22.13</version></dependency><!-- https://mvnrepository.com/artifact/software.amazon.awssdk/s3 --><dependency><groupId>software.amazon.awssdk</groupId><artifactId>s3</artifactId><version>2.22.12</version><scope>test</scope></dependency><dependency><groupId>software.amazon.awssdk</groupId><artifactId>s3</artifactId><version>2.22.12</version><scope>compile</scope></dependency>

然后java代码,一些相关注意的事项都在代码里有标出。

import java.net.URI;
import java.net.URISyntaxException;
import java.nio.ByteBuffer;
import java.nio.file.Paths;
import java.util.List;
import java.util.ListIterator;
import java.time.Duration;import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.Bucket;
import software.amazon.awssdk.services.s3.model.ListBucketsResponse;
import software.amazon.awssdk.services.s3.model.ListObjectsResponse;
import software.amazon.awssdk.services.s3.model.ObjectCannedACL;
import software.amazon.awssdk.services.s3.model.S3Exception;
import software.amazon.awssdk.services.s3.model.S3Object;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest;/*** @author 忆林pp* @className: Ceph_upload_test* @description: 测试对接ceph数据库* @date 2024/1/10 10:44* @version:1.0*/
public class Ceph_upload_test {public static void main(String[] args) throws Exception{/*** 使用客户端构建器创建 S3 客户端:*///这里的这两个密钥要去自己的对象网关那里看,关于用户信息,如果没有创建一个即可String accessKey="W3VQYUV72ZPFRWI0DIJL";String secretKey="CQoJOXUHWZNM4qsv5G9JkrR8TIZFDYvkRdmm06N3";AwsBasicCredentials credentials = AwsBasicCredentials.create(accessKey, secretKey);S3Client client = S3Client.builder()//你后端部署的对象网关的地址,这里我填的是内网地址,端口为对象网关默认的端口.endpointOverride(new URI("http://192.168.78.140:7480")).credentialsProvider(StaticCredentialsProvider.create(credentials)).serviceConfiguration(srvcConf -> {srvcConf.pathStyleAccessEnabled();}).region(Region.US_EAST_1) // this is not used, but the AWS SDK requires it.build();/*** 列出拥有的存储桶*/ListBucketsResponse lbResponse = client.listBuckets();for (Bucket bucket : lbResponse.buckets()) {System.out.println(bucket.name() + "\t" + bucket.creationDate());}
//        输出示范
//        mahbuckat1    2021-09-20T14:12:57.231Z
//        mahbuckat2    2021-09-20T14:12:59.402Z
//        mahbuckat3    2021-09-20T14:13:02.288Z/*** 创建存储桶*/client.createBucket(req -> {req.bucket("my-new-bucket");});/*** 列出存储桶的内容*/ListObjectsResponse loResponse = client.listObjects(req -> {req.bucket("s3cmd-demo");});for (S3Object object : loResponse.contents()) {System.out.println(object.key() + "\t" +object.size() + "\t" +object.lastModified());}
//        输出示例
//        myphoto1.jpg 251262  2021-09-20T17:47:07.317Z
//        myphoto2.jpg 262518  2021-09-20T17:49:46.872Z/*** 删除存储桶* 注意:桶必须是空的!否则就行不通了!*/client.deleteBucket(req -> {req.bucket("my-new-bucket");});/*** 创建对象* 这将创建一个包含字符串的文件hello.txt"Hello World!"* 大致为生产环境的文件上传!!!!!*/ByteBuffer input = ByteBuffer.wrap("Hello World!".getBytes());client.putObject(req -> {req.bucket("s3cmd-demo").key("hello.txt");},RequestBody.fromByteBuffer(input));/*** 更改对象的 ACL* 文件的限定权限*/client.putObjectAcl(req -> {req.bucket("s3cmd-demo").key("hello.txt").acl(ObjectCannedACL.PUBLIC_READ);});client.putObjectAcl(req -> {req.bucket("s3cmd-demo").key("secret_plans.txt").acl(ObjectCannedACL.PRIVATE);});/*** 下载对象(到文件)* 这个要指定到指定文件名进行覆盖。(这个文件应该是不存在的,它这里会自动创建,如果存在会报文件存在异常* 这个地方的下载文件不建议用在生产环境的对象下载,因为这里的机制我是这样理解的:(仅供参考!!!)*      :这里首先你的ceph桶必须得存在,其次相对应得对象也必须得存在,*      其次你的本地下载地址中应该没有重名文件,然后这段语句他执行得时候会将*      你的ceph桶对象得数据直接创建一个空文件然后复写进你这个对应得空文件中!*      因为这里要指定到对应的文件路径,所以我觉得这里很蠢,在真实使用中非常不灵活!!!(个人想法,不喜勿喷!!!)*/client.getObject(req -> {req.bucket("s3cmd-demo").key("6.txt");},Paths.get("E:\\download\\6.txt"));/*** 删除对象*/client.deleteObject(req -> {req.bucket("s3cmd-demo").key("goodbye.txt");});/*** 生成对象下载 URL(已签名和未签名)* 我的预想是这里将这个生成的对应的文件连接返回给客户端,然后这里在前端给一个重定向,将这个下载任务甩锅给* 客户端的游览器,由客户端请求ceph资源,这样的话,后端就不用做下载管理了,下载任务直接对接ceph的集群,减轻后端负担!!!*/S3Presigner presigner = S3Presigner.builder()//这里同样得需要对应得后端对象网关得地址,http或者https都可以.endpointOverride(new URI("http://192.168.78.140:7480")).credentialsProvider(StaticCredentialsProvider.create(credentials)).region(Region.US_EAST_1) // this is not used, but the AWS SDK requires it.build();PresignedGetObjectRequest presignedRequest = presigner.presignGetObject(preReq -> {preReq.getObjectRequest(req -> {
//                req.bucket("s3cmd-demo").key("secret_plans.txt");req.bucket("s3cmd-demo").key("旺仔小乔 - 梨花香.mp3");}).signatureDuration(Duration.ofMinutes(20));});System.out.println(presignedRequest.url());//        输出示例
//        https://endpoint.com/my-bucket/secret_plans.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20210921T151408Z&X-Amz-SignedHeaders=host&X-Amz-Expires=1200&X-Amz-Credential=XXXXXXXXXXXX%2F20210921%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=yyyyyyyyyyyyyyyyyyyyyy}
}

相关资源参考:

Java S3 示例 — Ceph 文档

相关文章:

Springboot对接ceph集群以及java利用s3对象网关接口与ceph集群交互

springboot中引入相关依赖 <dependency><groupId>software.amazon.awssdk</groupId><artifactId>regions</artifactId><version>2.22.13</version></dependency><dependency><groupId>software.amazon.awssdk<…...

nrm使用

为了更方便的切换下包的镜像源&#xff0c;我们可以安装 nrm 这个小工具&#xff0c;利用 nrm 提供的终端命令&#xff0c;可以快速查看和切换下 包的镜像源。 //通过 npm 包管理器&#xff0c;将 nrm 安装为全局可用的工具 npm i nrm -g//查看所有可用的镜像源 nrm ls//将下载…...

06-微服务OpenFeigh和Sentinel持久化

一、OpenFeign基础应用 1.1 概念 OpenFeign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用OpenFeign&#xff0c;可以做到使用HTTP请求访问远程服务&#xff0c;就像调用本地方法一样的&#xff0c;开发者完全感知不到这是在调用远程方法&#xff0c;更感知不到在访…...

docker 安装redis (亲测有效)

目录 1 安装 1 安装 1 将redis 的 tar 包 上传到服务器 上传之后tar 包&#xff0c;将他变成镜像 输入docker images,发现目前是没有镜像的&#xff0c;现在将tar 包变成镜像 docker load -i redis.tar以上就将tar 包变成镜像了 现在在宿主机找一个地方&#xff0c;存放数据…...

利用GitHub开源项目ChatGPTNextWeb构建属于自己的ChatGPT - Docker

Docker部署ChatGPTNextWeb ChatGPTNextWeb项目github开源地址&#xff1a;https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web 根据文档部署ChatGPTNextWeb 文档地址&#xff1a;https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/blob/main/README_CN.md 步骤一&#…...

Vue3使用ElementPlus中的el-upload手动上传并调用上传接口

前端代码 <div class"upload-div"><el-uploadv-model:file-list"form.fileImageList"ref"uploadRef"capture"false"action"#"accept"image/*"list-type"picture-card":on-change"handleC…...

【Github3k+⭐️】《CogAgent: A Visual Language Model for GUI Agents》译读笔记

CogAgent: A Visual Language Model for GUI Agents 摘要 人们通过图形用户界面&#xff08;Graphical User Interfaces, GUIs&#xff09;在数字设备上花费大量时间&#xff0c;例如&#xff0c;计算机或智能手机屏幕。ChatGPT 等大型语言模型&#xff08;Large Language Mo…...

FF的异步清零端口需要时钟吗?--不需要

...

【conda】pip安装报错,网络延时问题解决记录(亲测有效)

【conda】pip安装报错&#xff0c;网络延时问题解决记录 1. pip install 报错如下所示2. 解决方案&#xff1a; 1. pip install 报错如下所示 pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(hostfiles.pythonhosted.org, port443): Read timed out.…...

Spring Boot整理-Spring Boot的优势

Spring Boot 提供了多个显著的优势,特别是对于快速开发和简化 Spring 应用的配置和部署。这些优势包括: 简化配置:Spring Boot 的“约定优于配置”的原则意味着许多 Spring 应用的常见配置项被自动设置,这减少了开发人员需要编写和维护的配置代码量。快速启动和部署:Sprin…...

C++标准学习--decltype

decltype / auto 是具有类型推导功能的 类型 描述/占位 符 decltype: 获取对象或表达式的类型auto: 类型自动推导 decltype 可以获取变量类型&#xff0c; &#xff08;并不同于python的type&#xff0c;但python能打印出type获取的名称&#xff0c; C通过typeid实现&#xff…...

Linux之静态库和动态库

目录 一、前言 二、对于库的理解 三、静态库 四、动态库 五、动静态库的加载 一、前言 在之前&#xff0c;我们讲了静态库和动态库&#xff0c;详情请跳转&#xff1a;静态库和动态库 下面我们将从工程师的角度&#xff0c;去了解静态库和动态库的形成过程&#xff0c;以…...

erlang/OTP 平台(学习笔记)(三)

分布式 Erlang 借助于语言属性和基于复制的进程通信&#xff0c;Erlang程序天然就可以分布到多台计算机上。要问为什么&#xff0c;且让我们来看两个用Java或C这类语言写成的进程&#xff0c;它们运作良好并以共享内存为通信手段。假设你已经搞定了锁的问题&#xff0c;一切精…...

Spring整理-Spring框架中用了哪些设计模式

Spring框架广泛应用了多种设计模式,这些模式提高了框架的灵活性、可扩展性和可维护性。下面是在Spring框架中常见的一些设计模式: 单例模式(Singleton):用于在应用的整个生命周期内保持一个类的单个实例。在Spring中,Bean默认是单例模式。 工厂模式(Factory Pattern):…...

Poi实现根据word模板导出-图表篇

往期系列传送门&#xff1a; Poi实现根据word模板导出-文本段落篇 &#xff08;需要完整代码的直接看最后位置&#xff01;&#xff01;&#xff01;&#xff09; 前言&#xff1a; 补充Word中图表的知识&#xff1a; 每个图表在word中都有一个内置的Excel&#xff0c;用于…...

windows或mac端口转发

摘要 在内网开发中&#xff0c;由于出于公司安全考虑&#xff0c;部分IP192.168.0.100访问只能针对固定IP192.168.0.200开放&#xff0c;此时我需要通过我的电脑192.168.0.300去访问&#xff0c;由于未对我电脑IP192.168.0.300授权&#xff0c;导致我访问不到&#xff0c;此时…...

Linux工具-搭建文件服务器

当我们使用linux系统作为开发环境时&#xff0c;经常需要在Linux系统之间、Linux和Windows之间传输文件。 对少量文件进行传输时&#xff0c;可以使用scp工具在两台主机之间实现文件传输&#xff1a; rootubuntu:~$ ssh --help unknown option -- - usage: ssh [-46AaCfGgKkMN…...

深入理解@DubboReference与@DubboService【三】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探索Dubbo的核心&#xff1a;深入理解DubboReference与DubboService【三】 前言DubboService注解基本概念使用示例高级特性 DubboReference注解基本概念使用示例服务调用流程 最佳实践注解的最佳使用方…...

linux主机的免密登录

实现linux主机之间的相互免密登录 在进行远程登录的时&#xff0c;服务器和主机间进行认证阶段分为&#xff1a; 基于口令认证&#xff08;不安全&#xff0c;易被抓包拦截获取&#xff09; 客户机连接服务器时&#xff0c;服务器将自己的公钥返回给客户机 客户机会将服务器的…...

Git常用命令和QA(网摘)

主要内容 常用命令git checkout --orphan 分支与 git checkout -b 分支区别git如何创建一个新的空白分支branchgit开发分支本地分支合并远程分支git remote prune origingit log如何退出&#xff1f;如何退出git log或git commit模式git log如何退出git commit 的退出 git强制p…...

Cadence原理图库‘幽灵版本’冲突全解析:从ORDBLL-1125报错看Cache机制与避坑指南

Cadence原理图库‘幽灵版本’冲突全解析&#xff1a;从ORDBLL-1125报错看Cache机制与避坑指南 在电子设计自动化&#xff08;EDA&#xff09;领域&#xff0c;Cadence作为行业标杆工具链&#xff0c;其原理图设计模块被广泛应用于各类复杂电路开发。然而&#xff0c;许多资深用…...

Vue 3 + hls.js 实战:手把手教你打造一个能‘续命’的安防监控播放器

Vue 3 hls.js 打造安防级视频流播放器的"续命"秘籍 在安防监控、智慧城市等实时视频流应用场景中&#xff0c;网络抖动、服务中断、页面切换等问题常常导致视频播放中断&#xff0c;严重影响监控效果。本文将深入探讨如何基于Vue 3和hls.js构建一个具备"续命&q…...

LeetCode 1423. 可获得的最大点数【定长滑窗,逆向和正向思维】1574

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

别再只用Unity做游戏了!用Game4Automation PRO插件,手把手教你搭建一条虚拟生产线(附PLC连接避坑指南)

跨界开发者的工业仿真指南&#xff1a;用Unity打造虚拟生产线全流程 当游戏开发者遇上工业自动化&#xff0c;会碰撞出怎样的火花&#xff1f;Unity作为全球最流行的游戏引擎之一&#xff0c;早已突破了娱乐产业的边界。今天&#xff0c;我们将探索如何利用Game4Automation PRO…...

从零到一:构建你的第一个智能体应用实战指南

1. 为什么你需要一个智能体应用&#xff1f; 想象一下这样的场景&#xff1a;每天早上你的手机自动整理当天的重要会议和待办事项&#xff0c;根据你的日程推荐最佳出行路线&#xff1b;工作时自动汇总行业动态和关键邮件&#xff1b;晚上回家前提前打开空调并推荐符合你口味的…...

ZeroOmega代理规则引擎:构建智能化网络访问策略

ZeroOmega代理规则引擎&#xff1a;构建智能化网络访问策略 【免费下载链接】ZeroOmega Manage and switch between multiple proxies quickly & easily. 项目地址: https://gitcode.com/gh_mirrors/ze/ZeroOmega 在数字化生活中&#xff0c;我们每天都在与各种网络…...

InfluxDB服务文件被误删怎么办?记录一次完整的1.8.6版本灾难恢复过程

InfluxDB服务文件误删灾难恢复实录&#xff1a;从崩溃边缘到完美复原 那天下午&#xff0c;服务器监控大屏突然亮起一片刺眼的红色告警——InfluxDB服务全线离线。作为团队里负责时序数据库运维的老兵&#xff0c;我立刻意识到问题的严重性。这套运行着1.8.6版本的InfluxDB承载…...

零基础学习数据库:用快马AI生成你的第一个可操作图书管理系统

作为一个刚接触数据库的小白&#xff0c;最近在InsCode(快马)平台上尝试做了一个图书管理系统项目&#xff0c;整个过程意外地顺利。这里记录下我的学习心得&#xff0c;希望能帮到同样零基础的朋友们。 为什么选择图书管理系统作为入门项目 图书管理系统包含了数据库最基础的…...

大疆上云API Demo停更了,我们手里的老项目该怎么办?(附迁移思路与安全加固建议)

大疆上云API停更后&#xff1a;老项目的风险评估与迁移实战指南 当官方宣布停止维护某个关键组件时&#xff0c;技术团队面临的不仅是代码层面的挑战&#xff0c;更是对系统全生命周期管理能力的考验。最近大疆上云API Demo的停更公告&#xff0c;让许多依赖该接口的无人机应用…...

全流程自动化知识图谱构建:从非结构化数据到智能决策支持

全流程自动化知识图谱构建&#xff1a;从非结构化数据到智能决策支持 【免费下载链接】llm-graph-builder Neo4j graph construction from unstructured data 项目地址: https://gitcode.com/GitHub_Trending/ll/llm-graph-builder 在信息爆炸的时代&#xff0c;企业如何…...