在SDK的项目中,使用了配置文件来管理功能,为了方便管理以及使用,我建了个单独的项目来放配置文件。
最开始,需要调整配置时,都是手动从云存储管理后台下载当前最新的配置文件,调整完再手动上传到云存储管理后台,配置文件少时没啥问题,但是多了之后就很麻烦,所以决定做个插件来实现下载和上传。
公司一开始用的是MinIO,最近迁移到了AliOSS,这边分别介绍下。
添加SDK
在插件项目的build.gradle中添加MinIO和AliOSS的SDK。
dependencies {
implementation(gradleApi())
implementation("io.minio:minio:8.4.2")
implementation("com.aliyun.oss:aliyun-sdk-oss:3.15.0")
}
通用配置
我在项目中是使用包名来管理配置,有需要可以根据实际需求进行调整。
自定义extensions
来配置使用的云存储类型和需要上传以及下载的包名。
public class CheckConfigExtension {
public static final String MINIO = "MinIO";
public static final String ALIOSS = "AliOss";
public String clientType = ALIOSS;
public ArrayList<String> packageName;
}
创建插件和Task(上传和下载)
//DownloadTask
public class ConfigDownloadTask extends DefaultTask {
@TaskAction
void doTaskAction() {
if (MinIoHelper.enable()) {
MinIoHelper.downloadConfig();
}
if (AliOssHelper.enable()) {
AliOssHelper.downloadConfig();
}
}
}
//UploadTask
public class ConfigUploadTask extends DefaultTask {
@TaskAction
void doTaskAction() {
if (MinIoHelper.enable()) {
MinIoHelper.uploadConfig();
}
if (AliOssHelper.enable()) {
AliOssHelper.uploadConfig();
}
}
}
//插件类
class CheckConfigPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
//注册Extension类
CheckConfigExtension checkConfigExtension = project.extensions.create("CheckConfigExtension", CheckConfigExtension)
project.afterEvaluate {
def downloadTask = project.getTasks().create("ConfigDownloadTask", ConfigDownloadTask)
def uploadTask = project.getTasks().create("ConfigUploadTask", ConfigUploadTask)
downloadTask.group = "CheckConfig"
uploadTask.group = "CheckConfig"
//下载文件保存的路径
def localConfigPath = project.projectDir.absolutePath + "/src/main/java/com/aaa/bbb/"
if (checkConfigExtension.clientType == CheckConfigExtension.MINIO) {
MinIoHelper.init(localConfigPath, checkConfigExtension.packageName)
}
if (checkConfigExtension.clientType == CheckConfigExtension.ALIOSS) {
AliOssHelper.init(localConfigPath, checkConfigExtension.packageName)
}
}
}
}
MinIO
public class MinIoHelper {
//云存储中的Bucket名称
private static final String sdkBucket = "bucketName";
//Bucket中要下载文件的全路径(不用包含Bucket的名称)
private static final String downloadConfigFilePath = "a/b/file.文件类型";
//Bucket中要上传文件的全路径(不用包含Bucket的名称)
private static final String uploadConfigFilePath = "a/b/file.文件类型";
private String localConfigPath;
private ArrayList<String> configPackageNames;
private MinioClient minioClient;
private MinIoHelper() {
}
private static final class MinIoHelperHolder {
static final MinIoHelper minIoHelper = new MinIoHelper();
}
public static boolean enable() {
return MinIoHelperHolder.minIoHelper.minioClient != null;
}
public static void init(String localConfigPath, ArrayList<String> configPackageNames) {
MinIoHelperHolder.minIoHelper.minioClient = new MinioClient.Builder()
.endpoint("endpoint", port, false)
.credentials("accessKey", "secretKey")
.build();
MinIoHelperHolder.minIoHelper.localConfigPath = localConfigPath;
MinIoHelperHolder.minIoHelper.configPackageNames = configPackageNames;
}
public static void downloadConfig() {
if (MinIoHelperHolder.minIoHelper.configPackageNames != null && !MinIoHelperHolder.minIoHelper.configPackageNames.isEmpty()) {
for (String packageName : MinIoHelperHolder.minIoHelper.configPackageNames) {
MinIoHelperHolder.minIoHelper.downloadConfig(packageName);
}
}
}
public static void uploadConfig() {
if (MinIoHelperHolder.minIoHelper.configPackageNames != null && !MinIoHelperHolder.minIoHelper.configPackageNames.isEmpty()) {
for (String packageName : MinIoHelperHolder.minIoHelper.configPackageNames) {
MinIoHelperHolder.minIoHelper.uploadConfig(packageName);
}
}
}
private void downloadConfig(String configPackageName) {
if (MinIoHelperHolder.minIoHelper.bucketExits()) {
String finalDownloadPath = String.format(downloadConfigFilePath, configPackageName);
try {
StatObjectResponse objectStat = MinIoHelperHolder.minIoHelper.minioClient.statObject(StatObjectArgs.builder()
.bucket(sdkBucket)
.object(finalDownloadPath)
.build());
if (objectStat != null) {
InputStream inputStream = MinIoHelperHolder.minIoHelper.minioClient.getObject(GetObjectArgs.builder()
.bucket(sdkBucket)
.object(finalDownloadPath)
.build());
saveFile(inputStream, configPackageName);
}
} catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidKeyException | InvalidResponseException | IOException | NoSuchAlgorithmException | ServerException | XmlParserException e) {
e.printStackTrace();
}
}
}
private void uploadConfig(String configPackageName) {
if (MinIoHelperHolder.minIoHelper.bucketExits()) {
String finalUploadPath = String.format(uploadConfigFilePath, configPackageName);
File configFile = new File(localConfigPath + "/" + configPackageName.replace(".", "_") + "/", "config.json");
if (configFile.exists()) {
try {
minioClient.putObject(PutObjectArgs.builder()
.bucket(sdkBucket)
.object(finalUploadPath)
.stream(new FileInputStream(configFile), configFile.length(), -1)
.build());
} catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidKeyException | InvalidResponseException | IOException | NoSuchAlgorithmException | ServerException | XmlParserException e) {
e.printStackTrace();
}
}
}
}
private boolean bucketExits() {
boolean sdkBucketExists = false;
try {
sdkBucketExists = minioClient.bucketExists(BucketExistsArgs.builder()
.bucket(sdkBucket)
.build());
} catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidKeyException | InvalidResponseException | IOException | NoSuchAlgorithmException | ServerException | XmlParserException e) {
e.printStackTrace();
}
return sdkBucketExists;
}
private void saveFile(InputStream inputStream, String packageName) {
File parentFile = new File(localConfigPath, packageName.replace(".", "_"));
if (!parentFile.exists()) {
parentFile.mkdirs();
}
File configFile = new File(parentFile, "config.json");
if (configFile.exists()) {
configFile.delete();
}
try {
boolean create = configFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
if (configFile.exists() && inputStream != null) {
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream(configFile);
int read;
byte[] bytes = new byte[1024];
while ((read = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, read);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
inputStream.close();
if (outputStream != null) {
outputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
AliOSS
public class AliOssHelper {
//云存储中的Bucket名称
private static final String sdkBucket = "bucketName";
//Bucket中要下载文件的全路径(不用包含Bucket的名称)
private static final String downloadConfigFilePath = "a/b/file.文件类型";
//Bucket中要上传文件的全路径(不用包含Bucket的名称)
private static final String uploadConfigFilePath = "a/b/file.文件类型";
private String localConfigPath;
private ArrayList<String> configPackageNames;
private OSS ossClient;
private AliOssHelper() {
}
private static final class AliOssHelperHolder {
static final AliOssHelper aliOssHelper = new AliOssHelper();
}
public static boolean enable() {
return AliOssHelperHolder.aliOssHelper.ossClient != null;
}
public static void init(String localConfigPath, boolean formal, ArrayList<String> configPackageNames) {
AliOssHelperHolder.aliOssHelper.localConfigPath = localConfigPath;
AliOssHelperHolder.aliOssHelper.formal = formal;
AliOssHelperHolder.aliOssHelper.configPackageNames = configPackageNames;
String endpoint = "****";
String accessKeyID = "****";
String accessKeySecret = "****";
AliOssHelperHolder.aliOssHelper.ossClient = new OSSClientBuilder().build(endpoint, accessKeyID, accessKeySecret);
}
public static void downloadConfig() {
if (AliOssHelperHolder.aliOssHelper.configPackageNames != null && !AliOssHelperHolder.aliOssHelper.configPackageNames.isEmpty()) {
for (String packageName : AliOssHelperHolder.aliOssHelper.configPackageNames) {
AliOssHelperHolder.aliOssHelper.downloadConfig(packageName);
}
}
}
public static void uploadConfig() {
if (AliOssHelperHolder.aliOssHelper.configPackageNames != null && !AliOssHelperHolder.aliOssHelper.configPackageNames.isEmpty()) {
for (String packageName : AliOssHelperHolder.aliOssHelper.configPackageNames) {
AliOssHelperHolder.aliOssHelper.uploadConfig(packageName);
}
}
}
private void downloadConfig(String configPackageName) {
String finalDownloadPath = String.format(downloadConfigFilePath, configPackageName);
File localConfigFile = new File(localConfigPath + "/" + configPackageName.replace(".", "_") + "/", "config.json");
createFile(configPackageName);
try {
ossClient.getObject(new GetObjectRequest(sdkBucket, finalDownloadPath), localConfigFile);
} catch (OSSException | ClientException e) {
e.printStackTrace();
}
}
private void uploadConfig(String configPackageName) {
String finalUploadPath = String.format(uploadConfigFilePath, configPackageName);
File localConfigFile = new File(localConfigPath + "/" + configPackageName.replace(".", "_") + "/", "config.json");
if (localConfigFile.exists()) {
try {
ossClient.putObject(new PutObjectRequest(sdkBucket, finalUploadPath, localConfigFile));
} catch (OSSException | ClientException e) {
e.printStackTrace();
}
}
}
private void createFile(String configPackageName) {
File parentFile = new File(localConfigPath, configPackageName.replace(".", "_"));
if (!parentFile.exists()) {
parentFile.mkdirs();
}
File configFile = new File(parentFile, "config.json");
if (configFile.exists()) {
configFile.delete();
}
try {
configFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在项目中使用
plugins {
id("插件名称")
}
CheckConfigExtension {
//配置云存储类型
clientType = ALIOSS
packageName = [
"com.aaa.bbb"
]
}