present_to_all

Ceph 和 java client

shenlan
shenlan 2020年12月26日

Ceph 和 java 客户端

这应该是 2020 年度最后一个技术文章了...

背景

很多个项目的需求都要牵扯到存点东西,老是存本地又不优雅。

  • 迁移麻烦
  • 测试麻烦
  • 就是不想存本地

然后找到了个 Ceph 这个对象存储组件,打算要上了。

然后突然发现官方的 java 客户端最后更新时间在 2014 年....
这个官方客户端为何弃疗...

但是仔细看 Ceph 还支持了很多协议,例如 S3 .

看到是 Amazon 出品的我就放心了。果断上车。

install on docker

有个 blog 写的特别好 整个过程行云流水,这里就不再复制粘贴了。

https://www.cnblogs.com/hackyo/archive/2004/01/13/13373340.html

java client

中文 ceph 页面的 client 示例 好多代码都过时了,然后看了看源代码 用上了不过时的

引入依赖

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-s3</artifactId>
    <version>1.11.925</version>
</dependency>

构建客户端

// 配置协议
ClientConfiguration clientConfig = new ClientConfiguration();
clientConfig.setProtocol(Protocol.HTTP);

// 配置 认证
String accessKey = "JQOJQ47HXEKAZEXWWDOZ";
String secretKey = "APU0ya3hEbkVh3XRfjMlmLzq08RYMQCsUDtA8cE0";
AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);

// build client
AmazonS3 client = AmazonS3Client.builder()
        .withClientConfiguration(clientConfig)
        .withCredentials(new AWSStaticCredentialsProvider(credentials))
        // endpoint 为连接 ceph 的地址, region 不用管(那是S3用的)
        .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("10.10.10.2:7480", null))
        .build();

简单读写


// 创建桶
Bucket bucket = client.createBucket("my-new-bucket");

// 保存对象
client.putObject("my-new-bucket", "key1", "value1");

// 遍历桶
ObjectListing  objects = client.listObjects("my-new-bucket");
do {
    for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) {
        System.out.println(objectSummary.getKey() + "\t" +
                objectSummary.getSize() + "\t" +
                StringUtils.fromDate(objectSummary.getLastModified()) + "\t" +
                        objectSummary.toString());
    }
    objects = client.listNextBatchOfObjects(objects);
} while (objects.isTruncated());

// 获取对象
S3ObjectInputStream  key1 = client.getObject("my-new-bucket", "key1").getObjectContent();

// 获取值
System.out.println(new String(key1.readAllBytes()));

参考

本文链接:https://blog.inmind.ltd/index.php/archives/69/
This blog is under a CC BY-NC-SA 4.0 Unported License