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))
.withPathStyleAccessEnabled(true) // 如果使用域名的话 需要开启这个
.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()));