有一个基于Spring 的应用程序,它使用外部MinIO存储。根据最新的要求,应用程序也应该运行在没有连接到MinIO存储的PC上。它应该使用本地文件系统代替。不允许在PC上运行MinIO停靠容器。
目前,该应用程序对MinIO客户端有以下配置
@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();
}
}并将其用于桶创建、文件上传等。
minioClient.makeBucket(...)
minioClient.uploadObject(...)
minioClient.listBuckets(...)
...我的第一个想法是扩展MinioClient并覆盖它的方法,这将与本地文件系统一起工作。就像这样:
class LocalStorageMinioClient extends MinioClient {
protected LocalStorageMinioClient(MinioClient client) {
super(client);
}
}该应用程序将有一个选项,可以让用户切换实现。但我担心的是与覆盖/实现相关的工作量。
还有其他解决办法吗?
发布于 2022-08-30 13:08:58
正确的方法是在MinioClient上实现抽象,类似于StorageService。
public interface StorageService {
void makeBucket();
void listBuckets();
....
}并为Minio提供一个实现
public class MinioStorageService {
public MinioStorageService(MinioClient client) { ... }
public void makeBucket() { client.xxx(); }
public void listBuckets() { client.xxx(); }
....
}以及本地文件系统的实现。
public class LocalFilesystemStorageService {
public LocalFilesystemStorageService() { ... }
public void makeBucket() { ... use file system ... }
public void listBuckets() { ... use file system ... }
....
}在您的代码中,您现在应该到处使用StorageService。
public class MyAppService {
public MyAppService(StorageService storage) { ... }
public void doSomething() {
storage.listBuckets();
...
storage.makeBucket();
}
}并具有一个配置类,该类将根据某些内容创建正确的bean (例如,在运行应用程序时设置myapp.storage=minio或myapp.storage=filesystem )。
@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。
https://stackoverflow.com/questions/73542606
复制相似问题