一、为什么会选择适配器模式?
企业开发中,会遇到上传更换服务器 ,比如腾云替换为阿里云,因为他们的接口封装不一样 ,如果使用传统的模式,我们就非常被动,需要开发人员从新将用到腾讯云的接口替换成为阿里云,这样就造成不必要的工作量,而且切换的话你要升级一次系统。 当你使用适配器模式 你就不用去了解前人写的屎山代码,只要你完成阿里云接口的调用,怎么调用,只要开发阿里云相关的代码即可。
二、案例
1、第一步:安装docker安装minio
//minio下载
docker pull minio/minio
//启动minio
docker run -p 9000:9000 -p 9000:9000\
2、第二步:搭建一个maven项目对接minio
3、导入minio依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.2</version>
</dependency>
4、编写适配器
public interface StorageAdapter {
/**
* 创建存储桶
* @param bucketName
*/
public void createBucket(String bucketName);
/**
* 上传文件
*
* @param inputStream
* @param bucketName
* @param objectName
*/
public void uploadFile(InputStream inputStream, String bucketName, String objectName);
/**
* 获取所有桶
*
* @return
* @throws Exception
*/
public List<String> getBucketList();
/**
* 获取当前桶内所有文件
*
* @param bucketName
* @return
* @throws Exception
*/
public List<FileInfo> getAllFiles(String bucketName);
/**
* 下载文件
*
* @param bucketName 桶
* @param objectName 文件
* @return
* @throws Exception
*/
public InputStream doDownload(String bucketName, String objectName);
/**
* 删除桶
*
* @param bucketName
* @throws Exception
*/
public void deleteBucket(String bucketName) throws Exception;
/**
* 删除文件
*
* @param bucketName 桶
* @param objectName 文件名
* @throws Exception
*/
public void deleteObject(String bucketName, String objectName);
}
5、编译一个配置类StorageConfig
6、minio的接口应用
minio连接配置 @Configuration
public class MinioConfig {
/**
* minio地址
*/
@Value("${minio.url}")
private String url;
/**
* minio账户
*/
@Value("${minio.accessKey}")
private String accessKey;
/**
* minio 密钥
*/
@Value("${minio.secretKey}")
private String secretKey;
/**
* 获取minio客户端
* @return
*/
@Bean
public MinioClient getMinioClient(){
return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();
}
}
minio在applcation动态配置
minio工具类封装 @Component
public class MinioUtil {
@Resource
private MinioClient minioClient;
/**
* 创建bucket桶
*
* @param bucketName
*/
public void createBucket(String bucketName) throws Exception {
boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
if (!exists) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}
}
/**
* 上传文件
*
* @param inputStream
* @param bucketName
* @param objectName
*/
public void uploadFile(InputStream inputStream, String bucketName, String objectName) throws Exception {
minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName)
.stream(inputStream, -1, Integer.MAX_VALUE).build());
}
/**
* 获取所有桶
*
* @return
* @throws Exception
*/
public List<String> getBucketList() throws Exception {
List<Bucket> buckets = minioClient.listBuckets();
return buckets.stream().map(Bucket::name).collect(Collectors.toList());
}
/**
* 获取当前桶内所有文件
*
* @param bucketName
* @return
* @throws Exception
*/
public List<FileInfo> getAllFiles(String bucketName) throws Exception {
Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).build());
List<FileInfo> fileInfos = new ArrayList<>();
for (Result<Item> result : results) {
Item item = result.get();
FileInfo fileInfo = new FileInfo();
fileInfo.setFileName(item.objectName());
fileInfo.setDirectory(item.isDir());
fileInfo.setEtag(item.etag());
fileInfos.add(fileInfo);
}
return fileInfos;
}
/**
* 下载文件
*
* @param bucketName 桶
* @param objectName 文件
* @return
* @throws Exception
*/
public InputStream doDownload(String bucketName, String objectName) throws Exception {
return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build());
}
/**
* 删除桶
*
* @param bucketName
* @throws Exception
*/
public void deleteBucket(String bucketName) throws Exception {
minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
}
/**
* 删除文件
* @param bucketName 桶
* @param objectName 文件名
* @throws Exception
*/
public void deleteObject(String bucketName, String objectName) throws Exception {
minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());
}
}
7、测试
编写控制类 @RestController
@RequestMapping("/file")
public class FileController {
@Resource
private FileService fileService;
@RequestMapping("/getAllBuckets")
public String testGetAllBuckets() throws Exception {
List<String> bucketList = fileService.getAllBuckets();
return bucketList.toString();
}
}
编写service类 @Service
public class FileService {
@Resource
private final StorageAdapter storageAdapter;
public FileService(StorageAdapter storageAdapter) {
this.storageAdapter = storageAdapter;
}
public List<String> getAllBuckets() {
return storageAdapter.getBucketList();
}
}
三、如果想要实现不重启服务切换上传服务
我们会用到nacos,远程操作,自由切换。 这里就不多说了,该文章主要说明minio如何使用