update 优化 缩短oss模块命名

This commit is contained in:
疯狂的狮子Li
2026-03-25 11:34:30 +08:00
parent e95d1e3f33
commit d2cdc694f1
8 changed files with 102 additions and 101 deletions

View File

@@ -4,12 +4,12 @@ import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.IdUtil;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.oss.config.S3StorageClientConfig;
import org.dromara.common.oss.config.OssClientConfig;
import org.dromara.common.oss.exception.S3StorageException;
import org.dromara.common.oss.io.OutputStreamDownloadSubscriber;
import org.dromara.common.oss.model.GetObjectResult;
import org.dromara.common.oss.model.HandleAsyncResult;
import org.dromara.common.oss.model.PutObjectResult;
import org.dromara.common.oss.exception.S3StorageException;
import org.dromara.common.oss.io.OutputStreamDownloadSubscriber;
import software.amazon.awssdk.core.async.AsyncRequestBody;
import software.amazon.awssdk.core.async.AsyncResponseTransformer;
import software.amazon.awssdk.core.async.ResponsePublisher;
@@ -46,7 +46,7 @@ import java.util.function.Function;
* @author 秋辞未寒
*/
@Slf4j
public abstract class AbstractS3StorageClientImpl implements S3StorageClient {
public abstract class AbstractOssClientImpl implements OssClient {
private final AtomicBoolean initialized = new AtomicBoolean(false);
@@ -60,7 +60,7 @@ public abstract class AbstractS3StorageClientImpl implements S3StorageClient {
/**
* S3 存储客户端配置
*/
protected S3StorageClientConfig config;
protected OssClientConfig config;
/**
* Amazon S3 异步客户端
@@ -82,7 +82,7 @@ public abstract class AbstractS3StorageClientImpl implements S3StorageClient {
*/
protected ExecutorService asyncExecutor;
public AbstractS3StorageClientImpl(String clientId, S3StorageClientConfig config) {
public AbstractOssClientImpl(String clientId, OssClientConfig config) {
Assert.notNull(config, () -> S3StorageException.form("S3StorageClientConfig must not be null"));
// 如果没有设置存储客户端ID则随机生成一个
this.clientId = StringUtils.isBlank(clientId) ? IdUtil.fastSimpleUUID() : clientId;
@@ -96,7 +96,7 @@ public abstract class AbstractS3StorageClientImpl implements S3StorageClient {
}
@Override
public S3StorageClientConfig config() {
public OssClientConfig config() {
// 仅返回copy副本防篡改
return this.config.copy();
}
@@ -127,7 +127,7 @@ public abstract class AbstractS3StorageClientImpl implements S3StorageClient {
abstract void doInitialize();
@Override
public void refresh(S3StorageClientConfig config) {
public void refresh(OssClientConfig config) {
if (Objects.equals(this.config, config)) {
return;
}
@@ -148,13 +148,13 @@ public abstract class AbstractS3StorageClientImpl implements S3StorageClient {
}
@Override
public boolean verifyConfig(Function<S3StorageClientConfig, Boolean> verifyConfigAction) {
S3StorageClientConfig config = config();
public boolean verifyConfig(Function<OssClientConfig, Boolean> verifyConfigAction) {
OssClientConfig config = config();
return Boolean.TRUE.equals(verifyConfigAction.apply(config));
}
@Override
public boolean verifyConfig(S3StorageClientConfig verifyConfig) {
public boolean verifyConfig(OssClientConfig verifyConfig) {
return verifyConfig((config) -> Objects.equals(config, verifyConfig));
}

View File

@@ -1,7 +1,7 @@
package org.dromara.common.oss.client;
import org.dromara.common.oss.config.S3AsyncExecutorConfig;
import org.dromara.common.oss.config.S3StorageClientConfig;
import org.dromara.common.oss.config.OssAsyncExecutorConfig;
import org.dromara.common.oss.config.OssClientConfig;
import org.dromara.common.oss.exception.S3StorageException;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
@@ -21,9 +21,9 @@ import java.util.concurrent.Executors;
*
* @author 秋辞未寒
*/
public class DefaultS3StorageClientImpl extends AbstractS3StorageClientImpl {
public class DefaultOssClientImpl extends AbstractOssClientImpl {
public DefaultS3StorageClientImpl(String clientId, S3StorageClientConfig config) {
public DefaultOssClientImpl(String clientId, OssClientConfig config) {
super(clientId, config);
}
@@ -79,7 +79,7 @@ public class DefaultS3StorageClientImpl extends AbstractS3StorageClientImpl {
.build();
// 创建异步调度器对象
S3AsyncExecutorConfig asyncExecutorConfig = config.asyncExecutorConfig();
OssAsyncExecutorConfig asyncExecutorConfig = config.asyncExecutorConfig();
// 是否使用虚拟线程
if (asyncExecutorConfig.enabledVirtualThread()) {
this.asyncExecutor = Executors.newVirtualThreadPerTaskExecutor();

View File

@@ -1,11 +1,11 @@
package org.dromara.common.oss.client;
import cn.hutool.core.util.IdUtil;
import org.dromara.common.oss.config.S3StorageClientConfig;
import org.dromara.common.oss.config.OssClientConfig;
import org.dromara.common.oss.io.OutputStreamDownloadSubscriber;
import org.dromara.common.oss.model.GetObjectResult;
import org.dromara.common.oss.model.HandleAsyncResult;
import org.dromara.common.oss.model.PutObjectResult;
import org.dromara.common.oss.io.OutputStreamDownloadSubscriber;
import software.amazon.awssdk.core.async.AsyncRequestBody;
import software.amazon.awssdk.core.async.AsyncResponseTransformer;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
@@ -39,7 +39,7 @@ import java.util.function.Function;
*
* @author 秋辞未寒
*/
public interface S3StorageClient extends AutoCloseable {
public interface OssClient extends AutoCloseable {
/**
* S3 存储客户端ID
@@ -55,7 +55,7 @@ public interface S3StorageClient extends AutoCloseable {
/**
* 获取客户端配置copy副本
*/
S3StorageClientConfig config();
OssClientConfig config();
/**
* 是否已经初始化
@@ -72,7 +72,7 @@ public interface S3StorageClient extends AutoCloseable {
*
* @param config 配置项
*/
void refresh(S3StorageClientConfig config);
void refresh(OssClientConfig config);
/**
* 校验客户端配置
@@ -82,7 +82,7 @@ public interface S3StorageClient extends AutoCloseable {
* @param verifyConfigAction 校验配置动作函数
* @return 是否一致
*/
boolean verifyConfig(Function<S3StorageClientConfig,Boolean> verifyConfigAction);
boolean verifyConfig(Function<OssClientConfig, Boolean> verifyConfigAction);
/**
* 校验客户端配置与传入的待校验配置是否一致
@@ -92,7 +92,7 @@ public interface S3StorageClient extends AutoCloseable {
* @param verifyConfig 待校验的配置
* @return 是否一致
*/
boolean verifyConfig(S3StorageClientConfig verifyConfig);
boolean verifyConfig(OssClientConfig verifyConfig);
/**
* 执行自定义上传请求

View File

@@ -16,10 +16,10 @@ import java.util.Optional;
* @author 秋辞未寒
*/
@Builder
public record S3AccessControlPolicyConfig(
public record AccessControlPolicyConfig(
boolean enabled
, AccessPolicy accessPolicy
) implements Config<S3AccessControlPolicyConfig, S3AccessControlPolicyConfig.S3AccessControlPolicyConfigBuilder>, Serializable {
) implements Config<AccessControlPolicyConfig, AccessControlPolicyConfig.AccessControlPolicyConfigBuilder>, Serializable {
@Serial
private static final long serialVersionUID = 1L;
@@ -27,7 +27,7 @@ public record S3AccessControlPolicyConfig(
/**
* 默认访问策略配置
*/
public static final S3AccessControlPolicyConfig DEFAULT = S3AccessControlPolicyConfig.builder()
public static final AccessControlPolicyConfig DEFAULT = AccessControlPolicyConfig.builder()
.enabled(false)
.accessPolicy(AccessPolicy.PUBLIC_READ_WRITE)
.build();
@@ -39,12 +39,12 @@ public record S3AccessControlPolicyConfig(
}
@Override
public S3AccessControlPolicyConfig copy() {
public AccessControlPolicyConfig copy() {
return toBuilder().build();
}
@Override
public S3AccessControlPolicyConfigBuilder toBuilder() {
public AccessControlPolicyConfigBuilder toBuilder() {
return builder()
.enabled(enabled)
.accessPolicy(accessPolicy);

View File

@@ -15,10 +15,10 @@ import java.io.Serializable;
* @author 秋辞未寒
*/
@Builder
public record S3AsyncExecutorConfig(
public record OssAsyncExecutorConfig(
boolean enabledVirtualThread
, int corePoolSize
) implements Config<S3AsyncExecutorConfig, S3AsyncExecutorConfig.S3AsyncExecutorConfigBuilder>, Serializable {
) implements Config<OssAsyncExecutorConfig, OssAsyncExecutorConfig.OssAsyncExecutorConfigBuilder>, Serializable {
@Serial
private static final long serialVersionUID = 1L;
@@ -31,7 +31,7 @@ public record S3AsyncExecutorConfig(
/**
* 默认异步执行器配置
*/
public static final S3AsyncExecutorConfig DEFAULT = S3AsyncExecutorConfig.builder()
public static final OssAsyncExecutorConfig DEFAULT = OssAsyncExecutorConfig.builder()
.enabledVirtualThread(false)
.corePoolSize(DEFAULT_CORE_POOL_SIZE)
.build();
@@ -53,12 +53,12 @@ public record S3AsyncExecutorConfig(
}
@Override
public S3AsyncExecutorConfig copy() {
public OssAsyncExecutorConfig copy() {
return toBuilder().build();
}
@Override
public S3AsyncExecutorConfigBuilder toBuilder() {
public OssAsyncExecutorConfigBuilder toBuilder() {
return builder()
.enabledVirtualThread(enabledVirtualThread)
.corePoolSize(corePoolSize);

View File

@@ -26,7 +26,7 @@ import java.util.Optional;
@RequiredArgsConstructor
@Builder
@EqualsAndHashCode
public class S3StorageClientConfig implements Config<S3StorageClientConfig, S3StorageClientConfig.S3StorageClientConfigBuilder>, Serializable {
public class OssClientConfig implements Config<OssClientConfig, OssClientConfig.OssClientConfigBuilder>, Serializable {
@Serial
private static final long serialVersionUID = 1L;
@@ -79,12 +79,12 @@ public class S3StorageClientConfig implements Config<S3StorageClientConfig, S3St
/**
* ACL访问策略配置
*/
private final S3AccessControlPolicyConfig accessControlPolicyConfig;
private final AccessControlPolicyConfig accessControlPolicyConfig;
/**
* 异步调度池配置
*/
private final S3AsyncExecutorConfig asyncExecutorConfig;
private final OssAsyncExecutorConfig asyncExecutorConfig;
/**
* 访问端点
@@ -149,20 +149,42 @@ public class S3StorageClientConfig implements Config<S3StorageClientConfig, S3St
return Optional.ofNullable(prefix);
}
/**
* ACL访问策略配置
*/
public @NonNull S3AccessControlPolicyConfig accessControlPolicyConfig() {
return Optional.ofNullable(accessControlPolicyConfig)
.orElse(S3AccessControlPolicyConfig.DEFAULT);
public static OssClientConfig formProperties(OssProperties properties) {
return formPropertiesBuilder(properties).build();
}
/**
* ACL访问策略配置
*/
public @NonNull S3AsyncExecutorConfig asyncExecutorConfig() {
return Optional.ofNullable(asyncExecutorConfig)
.orElse(S3AsyncExecutorConfig.DEFAULT);
public static OssClientConfigBuilder formPropertiesBuilder(OssProperties properties) {
String regionString = properties.getRegion();
Region region = Region.US_EAST_1;
if (StringUtils.isNotBlank(regionString)) {
region = Region.of(regionString);
}
// 是否使用路径风格应当由使用者明确去配置此处的配置只是为了适配旧的配置项
// MinIO 使用 HTTPS 限制使用域名访问站点填域名需要启用路径样式访问
boolean usePathStyleAccess = !StringUtils.containsAny(properties.getEndpoint(), OssConstant.CLOUD_SERVICE);
// 绝大多数的云厂商都是不允许操作ACL的所以此处的默认配置也是禁用ACL的
AccessControlPolicyConfig accessControlPolicyConfig = AccessControlPolicyConfig.DEFAULT;
// 目前自定义实现的 Client 上传/下载/删除中并没有实际使用到ACL相关配置
// 仅有业务中的链接预签名使用到SysOssServiceImpl#matchingUrl更多只是作为一个扩展点保留如有需要ACL的自行实现调用逻辑
String accessPolicyString = properties.getAccessPolicy();
if (StringUtils.isNotBlank(accessPolicyString)) {
accessControlPolicyConfig = AccessControlPolicyConfig.builder()
.enabled(true)
.accessPolicy(AccessPolicy.formType(accessPolicyString))
.build();
}
return builder()
.endpoint(properties.getEndpoint())
.domain(properties.getDomainUrl())
.accessKey(properties.getAccessKey())
.secretKey(properties.getSecretKey())
.bucket(properties.getBucketName())
.region(region)
.useHttps(SystemConstants.YES.equals(properties.getIsHttps()))
.usePathStyleAccess(usePathStyleAccess)
.accessControlPolicyConfig(accessControlPolicyConfig);
}
/**
@@ -224,11 +246,27 @@ public class S3StorageClientConfig implements Config<S3StorageClientConfig, S3St
return usePathStyleAccess ? BucketUrlUtil.getPathStyleBucketUrl(useHttps, url, bucket) : BucketUrlUtil.getSiteStyleBucketUrl(useHttps, url, bucket);
}
/**
* ACL访问策略配置
*/
public @NonNull AccessControlPolicyConfig accessControlPolicyConfig() {
return Optional.ofNullable(accessControlPolicyConfig)
.orElse(AccessControlPolicyConfig.DEFAULT);
}
/**
* ACL访问策略配置
*/
public @NonNull OssAsyncExecutorConfig asyncExecutorConfig() {
return Optional.ofNullable(asyncExecutorConfig)
.orElse(OssAsyncExecutorConfig.DEFAULT);
}
/**
* 复制S3存储客户端配置对象
*/
@Override
public S3StorageClientConfig copy() {
public OssClientConfig copy() {
return toBuilder().build();
}
@@ -236,7 +274,7 @@ public class S3StorageClientConfig implements Config<S3StorageClientConfig, S3St
* 转为S3存储客户端配置构建器对象
*/
@Override
public S3StorageClientConfigBuilder toBuilder() {
public OssClientConfigBuilder toBuilder() {
return builder()
.endpoint(endpoint)
.domain(domain)
@@ -250,42 +288,4 @@ public class S3StorageClientConfig implements Config<S3StorageClientConfig, S3St
.accessControlPolicyConfig(accessControlPolicyConfig().copy())
.asyncExecutorConfig(asyncExecutorConfig().copy());
}
public static S3StorageClientConfig formProperties(OssProperties properties){
return formPropertiesBuilder(properties).build();
}
public static S3StorageClientConfigBuilder formPropertiesBuilder(OssProperties properties){
String regionString = properties.getRegion();
Region region = Region.US_EAST_1;
if (StringUtils.isNotBlank(regionString)) {
region = Region.of(regionString);
}
// 是否使用路径风格应当由使用者明确去配置此处的配置只是为了适配旧的配置项
// MinIO 使用 HTTPS 限制使用域名访问站点填域名需要启用路径样式访问
boolean usePathStyleAccess = !StringUtils.containsAny(properties.getEndpoint(), OssConstant.CLOUD_SERVICE);
// 绝大多数的云厂商都是不允许操作ACL的所以此处的默认配置也是禁用ACL的
S3AccessControlPolicyConfig accessControlPolicyConfig = S3AccessControlPolicyConfig.DEFAULT;
// 目前自定义实现的 Client 上传/下载/删除中并没有实际使用到ACL相关配置
// 仅有业务中的链接预签名使用到SysOssServiceImpl#matchingUrl更多只是作为一个扩展点保留如有需要ACL的自行实现调用逻辑
String accessPolicyString = properties.getAccessPolicy();
if (StringUtils.isNotBlank(accessPolicyString)) {
accessControlPolicyConfig = S3AccessControlPolicyConfig.builder()
.enabled(true)
.accessPolicy(AccessPolicy.formType(accessPolicyString))
.build();
}
return builder()
.endpoint(properties.getEndpoint())
.domain(properties.getDomainUrl())
.accessKey(properties.getAccessKey())
.secretKey(properties.getSecretKey())
.bucket(properties.getBucketName())
.region(region)
.useHttps(SystemConstants.YES.equals(properties.getIsHttps()))
.usePathStyleAccess(usePathStyleAccess)
.accessControlPolicyConfig(accessControlPolicyConfig);
}
}

View File

@@ -4,12 +4,12 @@ import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.constant.CacheNames;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.oss.client.DefaultOssClientImpl;
import org.dromara.common.oss.client.OssClient;
import org.dromara.common.oss.config.OssClientConfig;
import org.dromara.common.oss.constant.OssConstant;
import org.dromara.common.oss.properties.OssProperties;
import org.dromara.common.oss.client.DefaultS3StorageClientImpl;
import org.dromara.common.oss.client.S3StorageClient;
import org.dromara.common.oss.config.S3StorageClientConfig;
import org.dromara.common.oss.exception.S3StorageException;
import org.dromara.common.oss.properties.OssProperties;
import org.dromara.common.redis.utils.CacheUtils;
import org.dromara.common.redis.utils.RedisUtils;
@@ -23,15 +23,15 @@ import java.util.concurrent.locks.ReentrantLock;
* @author 秋辞未寒
*/
@Slf4j
public class S3StorageClientFactory {
public class OssFactory {
private static final Map<String, S3StorageClient> CLIENT_CACHE = new ConcurrentHashMap<>();
private static final Map<String, OssClient> CLIENT_CACHE = new ConcurrentHashMap<>();
private static final ReentrantLock LOCK = new ReentrantLock();
/**
* 获取默认实例
*/
public static S3StorageClient instance() {
public static OssClient instance() {
// 获取redis 默认类型
String configKey = RedisUtils.getCacheObject(OssConstant.DEFAULT_CONFIG_KEY);
if (StringUtils.isEmpty(configKey)) {
@@ -43,18 +43,18 @@ public class S3StorageClientFactory {
/**
* 根据类型获取实例
*/
public static S3StorageClient instance(String configKey) {
public static OssClient instance(String configKey) {
String json = CacheUtils.get(CacheNames.SYS_OSS_CONFIG, configKey);
if (json == null) {
throw S3StorageException.form("系统异常, '" + configKey + "'配置信息不存在!");
}
OssProperties properties = JsonUtils.parseObject(json, OssProperties.class);
S3StorageClientConfig config = S3StorageClientConfig.formProperties(properties);
OssClientConfig config = OssClientConfig.formProperties(properties);
LOCK.lock();
try {
// 如果已经存在则校验配置一致性
if (CLIENT_CACHE.containsKey(configKey)) {
S3StorageClient client = CLIENT_CACHE.get(configKey);
OssClient client = CLIENT_CACHE.get(configKey);
if (!client.verifyConfig(config)) {
// 配置不一致刷新配置
client.refresh(config);
@@ -62,7 +62,7 @@ public class S3StorageClientFactory {
}
return client;
}
DefaultS3StorageClientImpl client = new DefaultS3StorageClientImpl(configKey,config);
DefaultOssClientImpl client = new DefaultOssClientImpl(configKey, config);
CLIENT_CACHE.put(configKey, client);
return client;
} finally {
@@ -74,7 +74,7 @@ public class S3StorageClientFactory {
* 移除实例
*/
public static boolean remove(String configKey) {
S3StorageClient client = CLIENT_CACHE.remove(configKey);
OssClient client = CLIENT_CACHE.remove(configKey);
if (client == null) {
return false;
}