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 文档

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

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

相关文章

【Kafka-3.x-教程】-【六】Kafka 外部系统集成 【Flume、Flink、SpringBoot、Spark】

【Kafka-3.x-教程】专栏&#xff1a; 【Kafka-3.x-教程】-【一】Kafka 概述、Kafka 快速入门 【Kafka-3.x-教程】-【二】Kafka-生产者-Producer 【Kafka-3.x-教程】-【三】Kafka-Broker、Kafka-Kraft 【Kafka-3.x-教程】-【四】Kafka-消费者-Consumer 【Kafka-3.x-教程】-【五…

Pycharm 重命名SSH的conda解释器后,提示该解释器不可用

结论 目前已知是BUG&#xff0c;截至投稿日未修复已经提交给youtrack.jetbrains.com&#xff0c;如下图&#xff1a; 解决方法&#xff0c;待更新…

monorepo工程开发交互nodejs命令行程序

前言 [MixedCli](https://zhangfisher.github.io/mixed-cli/)为monorepo应用开发命令行程序提供了一套解决方案&#xff0c;提供了更加友好的命令行开发体验。 第1步&#xff1a;创建工程 以一个典型的monorepo为例开始&#xff1a; flexapppackagescli corevuereact示例…

如何给AVR16芯片解锁

AVRM16核心板本身集成了强大的芯片自解锁功能模块&#xff0c;当由于熔丝位设置错误&#xff0c;导致芯片锁死&#xff0c;无法正常使用时候&#xff0c;可以利用畅学AVR16核心板上的解锁功能给芯片解锁。 &#xff08;如果芯片没有锁死&#xff0c;可以跳过此步骤&#xff09…

ffmpeg解码音频planar模式和packed模式

转载&#xff1a;原文地址&#xff1a; FFmpeg连载4-音频解码-阿里云开发者社区ffmpeg连载系列https://developer.aliyun.com/article/1197520 导读 前面我们介绍了使用FFmpeg解码视频&#xff0c;今天我们使用FFmpeg解码音频。我们的目标将mp4中的音频文件解码成PCM数据&…

python 文本内容随机生成器

这段代码是一个用于生成指定长度的随机文本的函数。主要包括两个函数&#xff1a;generate_text()和generate_other_content()。 generate_text(original_text, length)函数接受两个参数&#xff1a;原始文本和生成文本的长度。该函数的作用是根据原始文本生成指定长度的文本。…

Java异常及网络编程

异常续 throws关键字 当一个方法中使用throw抛出一个非RuntimeException的异常时&#xff0c;就要在该方法上使用throws声明这个异常的抛出。此时调用该方法的代码就必须处理这个异常&#xff0c;否则编译不通过。 package exception; ​ /*** 测试异常的抛出*/ public clas…

【普中开发板】基于51单片机的简易密码锁设计( proteus仿真+程序+设计报告+讲解视频)

基于51单片机的简易密码锁设计 1.主要功能&#xff1a;资料下载链接&#xff1a; 实物图&#xff1a;2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单 【普中】基于51单片机的简易密码锁设计 ( proteus仿真程序设计报告讲解视频&#xff09; 仿真图proteus8.16(有低版本) 程…

vue知识-04

计算属性computed 注意&#xff1a; 1、计算属性是基于它们的依赖进行缓存的 2、计算属性只有在它的相关依赖发生改变时才会重新求值 3、计算属性就像Python中的property&#xff0c;可以把方法/函数伪装成属性 4、computed: { ... } 5、计算属性必须要有…

css的一些属性

我们在写项目的时候&#xff0c;会遇到多种多样的样式&#xff0c;大部分都是由css来实现的&#xff0c;css可以让我们的页面更美观&#xff0c;css通常是配合HTML使用&#xff0c;代码较为简单! 下面我就给大家举几个较为常用的一些css属性。 1.CSS中怎样让元素圆角化&#…

【从零开始学习微服务 | 第一篇】什么是微服务

目录 前言&#xff1a; 架构风格&#xff1a; 单体架构&#xff1a; 分布式架构&#xff1a; 微服务&#xff1a; 总结&#xff1a; 前言&#xff1a; 在当今快速发展的软件开发领域&#xff0c;构建大型应用程序已经成为一项巨大的挑战。传统的单体应用架构往往难以满足…

未完成销量任务的智己汽车突发大规模车机故障,竞争压力不小

2024年刚开年&#xff0c;智己汽车便上演了一出“开门黑”。 近日&#xff0c;不少车主在社交平台发帖&#xff0c;反映智己LS6出现大规模车机故障&#xff0c;包括但不限于主驾驶屏幕不显示车速、档位、行驶里程&#xff0c;左右转盲区显示失效&#xff0c;无转向灯、雷达提醒…

CSS-设置背景图片的大小

要设置背景图片的大小&#xff0c;您可以使用CSS的background-size属性。这个属性允许您指定背景图片的尺寸。 background-size属性可以接受不同的值&#xff0c;包括&#xff1a; auto&#xff1a;保持原始图片的尺寸。cover&#xff1a;将图片缩放到完全覆盖背景区域&#…

ThreadLocal如何使用详解

ThreadLocal概述&#xff1a; ThreadLocal是Java中的一个线程局部变量工具类&#xff0c;它提供了一种在多线程环境下&#xff0c;每个线程都可以独立访问自己的变量副本的机制。ThreadLocal中存储的数据对于每个线程来说都是独立的&#xff0c;互不干扰。 使用场景&#xff1a…

Linux最常用的几个系统管理命令

文章目录 Linux最常用的几个系统管理命令查看网络信息的原初 ifconfig默认无参数使用-s显示短列表配置IP地址修改MTU启动关闭网卡 显示进程状态 ps语法几个实例默认情况显示所有进程查找特定进程信息 任务管理器的 top常规使用显示完整命令设置信息更新次数设置信息更新时间显示…

树莓派非常实用的程序-2 vcgencmd

vcgencmd 工具用于从Raspberry Pi上的VideoCore GPU输出信息。您可以在 https://github.com/raspberrypi/userland/tree/master/host_applications/linux/apps/gencmd[Github].上找到 vcgencmd 实用程序的源代码。要获取支持的所有 vcgencmd 命令的列表&#xff0c;请使用 vcge…

vbs读取数据库值前端FlexGrid前导0出不来的原因

vbs读取数据库值前端FlexGrid前导0出不来的原因 原因 系统设置问题 解决 修改系统默认数值显示&#xff1a; 1&#xff09;控制面板找到“区域”&#xff0c;点击“更改日期、时间和数字模式”&#xff0c;在弹出窗口点击“其他设置” 2&#xff09;在数字一栏中的“显示前…

AirBrush - AI 照片编辑器

​【应用名称】&#xff1a;AirBrush - AI 照片编辑器 ​【适用平台】&#xff1a;#Android ​【软件标签】&#xff1a;#AirBrush ​【应用版本】&#xff1a;6.0.1 ​【应用大小】&#xff1a;270MB ​【软件说明】&#xff1a;谁说我们的照片不能完美&#xff1f;我们相信…

前端要了解的k8s、CI/CD、Devops概念

1&#xff0c;了解k8s 简单的理解&#xff0c;k8s就是docker容器集群的管理工具。他将容器进行更多自动化的操作&#xff0c;自动创建、自动重启、自动扩容等&#xff0c;这个过程称为容器编排。 k8s抽象了硬件资源&#xff0c;将N台物理机或云主机抽象成一个资源池&#xff…

Hello 2024

Hello 2024 A. Wallet Exchange 题意&#xff1a;Alice和Bob各有a和b枚硬币&#xff0c;每次他们可以选择交换硬币或者保留&#xff0c;然后扣除当前一枚手中的硬币&#xff0c;当一方没得扣另一方就赢了。 思路&#xff1a;Alice先手&#xff0c;所以当硬币和为奇数时Alice…