首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用本地文件系统代替远程MinIO存储

使用本地文件系统代替远程MinIO存储
EN

Stack Overflow用户
提问于 2022-08-30 12:39:53
回答 1查看 114关注 0票数 0

有一个基于Spring 的应用程序,它使用外部MinIO存储。根据最新的要求,应用程序也应该运行在没有连接到MinIO存储的PC上。它应该使用本地文件系统代替。不允许在PC上运行MinIO停靠容器。

目前,该应用程序对MinIO客户端有以下配置

代码语言:javascript
复制
@Configuration
public class MinioClientConfiguration {

    @Bean
    public MinioClient minioClient(@Value("${company.config.minio.host}") String host,
                                   @Value("${company.config.minio.access-key}") String accessKey,
                                   @Value("${company.config.minio.secret-key}") String secretKey,
                                   @Value("${company.config.minio.region}") String region,
                                   @Value("${company.config.minio.connection-timeout:10s}") Duration connectTimeout,
                                   @Value("${company.config.minio.read-timeout:30s}") Duration readTimeout,
                                   @Value("${company.config.minio.write-timeout:30s}") Duration writeTimeout
    ) {
        final var okHttpClient = new OkHttpClient.Builder()
            .connectTimeout(connectTimeout)
            .readTimeout(readTimeout)
            .writeTimeout(writeTimeout)
            .build();

        return MinioClient.builder()
                          .endpoint(host)
                          .region(region)
                          .httpClient(okHttpClient)
                          .credentials(accessKey, secretKey)
                          .build();
    }

}

并将其用于桶创建、文件上传等。

代码语言:javascript
复制
minioClient.makeBucket(...)
minioClient.uploadObject(...)
minioClient.listBuckets(...)
...

我的第一个想法是扩展MinioClient并覆盖它的方法,这将与本地文件系统一起工作。就像这样:

代码语言:javascript
复制
class LocalStorageMinioClient extends MinioClient {

        protected LocalStorageMinioClient(MinioClient client) {
                super(client);
        }
}

该应用程序将有一个选项,可以让用户切换实现。但我担心的是与覆盖/实现相关的工作量。

还有其他解决办法吗?

EN

回答 1

Stack Overflow用户

发布于 2022-08-30 13:08:58

正确的方法是在MinioClient上实现抽象,类似于StorageService

代码语言:javascript
复制
public interface StorageService {
   void makeBucket();
   void listBuckets();
   ....
}

并为Minio提供一个实现

代码语言:javascript
复制
public class MinioStorageService {
   public MinioStorageService(MinioClient client) { ... }
   public void makeBucket() { client.xxx(); }
   public void listBuckets() { client.xxx(); }
   ....
}

以及本地文件系统的实现。

代码语言:javascript
复制
public class LocalFilesystemStorageService {
   public LocalFilesystemStorageService() { ... }
   public void makeBucket() { ... use file system ... }
   public void listBuckets() { ... use file system ... }
   ....
}

在您的代码中,您现在应该到处使用StorageService

代码语言:javascript
复制
public class MyAppService {
  public MyAppService(StorageService storage) { ... }

  public void doSomething() { 
     storage.listBuckets(); 
     ...
     storage.makeBucket();
  }
}

并具有一个配置类,该类将根据某些内容创建正确的bean (例如,在运行应用程序时设置myapp.storage=miniomyapp.storage=filesystem )。

代码语言:javascript
复制
@Configuration
public class StorageConfiguration {
  
  @Bean
  @ConditionalOnProperty(prefix = "myapp", name = "storage", havingValue = "minio")
  public StorageService minioStorageService(MinioClient client) {
    return new MinioStorageService(client);
  }

  @Bean
  @ConditionalOnProperty(prefix = "myapp", name = "storage", havingValue = "filesystem")
  public StorageService filesystemStorageService() {
    return new FilesystemStorageService();
  }
}

现在,当您运行应用程序java -jar myapp.jar --myapp.storage=filesystem时,您处于本地文件系统模式,如果您使用java -jar myapp.jar --myapp.storage=minio运行,则使用Minio。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73542606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档