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

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

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

利用GitHub开源项目ChatGPTNextWeb构建属于自己的ChatGPT - Docker
Docker部署ChatGPTNextWeb ChatGPTNextWeb项目github开源地址:https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web 根据文档部署ChatGPTNextWeb 文档地址: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 摘要 人们通过图形用户界面(Graphical User Interfaces, GUIs)在数字设备上花费大量时间,例如,计算机或智能手机屏幕。ChatGPT 等大型语言模型(Large Language Mo…...

【conda】pip安装报错,网络延时问题解决记录(亲测有效)
【conda】pip安装报错,网络延时问题解决记录 1. pip install 报错如下所示2. 解决方案: 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 可以获取变量类型, (并不同于python的type,但python能打印出type获取的名称, C通过typeid实现ÿ…...

Linux之静态库和动态库
目录 一、前言 二、对于库的理解 三、静态库 四、动态库 五、动静态库的加载 一、前言 在之前,我们讲了静态库和动态库,详情请跳转:静态库和动态库 下面我们将从工程师的角度,去了解静态库和动态库的形成过程,以…...
erlang/OTP 平台(学习笔记)(三)
分布式 Erlang 借助于语言属性和基于复制的进程通信,Erlang程序天然就可以分布到多台计算机上。要问为什么,且让我们来看两个用Java或C这类语言写成的进程,它们运作良好并以共享内存为通信手段。假设你已经搞定了锁的问题,一切精…...
Spring整理-Spring框架中用了哪些设计模式
Spring框架广泛应用了多种设计模式,这些模式提高了框架的灵活性、可扩展性和可维护性。下面是在Spring框架中常见的一些设计模式: 单例模式(Singleton):用于在应用的整个生命周期内保持一个类的单个实例。在Spring中,Bean默认是单例模式。 工厂模式(Factory Pattern):…...

Poi实现根据word模板导出-图表篇
往期系列传送门: Poi实现根据word模板导出-文本段落篇 (需要完整代码的直接看最后位置!!!) 前言: 补充Word中图表的知识: 每个图表在word中都有一个内置的Excel,用于…...
windows或mac端口转发
摘要 在内网开发中,由于出于公司安全考虑,部分IP192.168.0.100访问只能针对固定IP192.168.0.200开放,此时我需要通过我的电脑192.168.0.300去访问,由于未对我电脑IP192.168.0.300授权,导致我访问不到,此时…...

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

深入理解@DubboReference与@DubboService【三】
欢迎来到我的博客,代码的世界里,每一行都是一个故事 探索Dubbo的核心:深入理解DubboReference与DubboService【三】 前言DubboService注解基本概念使用示例高级特性 DubboReference注解基本概念使用示例服务调用流程 最佳实践注解的最佳使用方…...
linux主机的免密登录
实现linux主机之间的相互免密登录 在进行远程登录的时,服务器和主机间进行认证阶段分为: 基于口令认证(不安全,易被抓包拦截获取) 客户机连接服务器时,服务器将自己的公钥返回给客户机 客户机会将服务器的…...
Git常用命令和QA(网摘)
主要内容 常用命令git checkout --orphan 分支与 git checkout -b 分支区别git如何创建一个新的空白分支branchgit开发分支本地分支合并远程分支git remote prune origingit log如何退出?如何退出git log或git commit模式git log如何退出git commit 的退出 git强制p…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...

GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...

实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...

Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...