Amazon S3对象存储方法Starter包编写
公司采购了商用对象存储,接入文档也是以Amazon S3的SDK来介绍使用。为各项目可以统一使用,编写一个Springboot starter包。
一、Starter包编写
1. 依赖引入
包括AWS需要的一些依赖。以及做自动装配所需的一些springboot依赖等。
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<spring-boot.version>2.6.3</spring-boot.version>
<lombok.version>1.18.22</lombok.version>
<aws-oss.version>1.11.327</aws-oss.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-bom</artifactId>
<version>${aws-oss.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--一般autoconfig包也足够。为了引入logback等方便代码编写,引入spring-boot-starter-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-autoconfigure</artifactId>-->
<!-- <version>${spring-boot.version}</version>-->
<!-- <scope>provided</scope>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring-boot.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>${spring-boot.version}</version>
<scope>provided</scope>
<optional>true</optional><!-- 依赖不传递 -->
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.amazonaws</groupId>-->
<!-- <artifactId>aws-java-sdk</artifactId>-->
<!-- <version>${aws-oss.version}</version>-->
<!-- </dependency>-->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-dynamodb</artifactId>
</dependency>
</dependencies>
2. 属性配置类
编写属性配置类。用于后续在springboot配置文件中设置对象存储endpoint,ak,sk以及其他参数等。
这里参考Amazon的SDK的初始化配置参数,额外放开设置connectTimeout, socketTime,proxy等。可以看实际情况暴露所需参数出来。
@ConfigurationProperties(prefix = "awsoss")
@Getter
@Setter
@ToString
public class AwsossProperties {
/**
* 对象存储访问地址
*/
private String endpoint;
/**
* 访问密钥
*/
private String accessKey;
/**
* 安全密钥
*/
private String secretKey;
/**
* The maximum number of open HTTP connections.
* 最大连接数,默认50
*/
private int maxConnections = ClientConfiguration.DEFAULT_MAX_CONNECTIONS;
/**
* 读取socket超时时间,默认50s
*/
private int socketTimeout = ClientConfiguration.DEFAULT_SOCKET_TIMEOUT;
/**
* 连接超时时间,默认10s
*/
private int connectionTimeout = ClientConfiguration.DEFAULT_CONNECTION_TIMEOUT;
/**
* 请求超时时间,aws 默认0不超时
*/
private int requestTimeout = 60000;
/**
* 默认协议是https。改成默认http
*/
private Protocol protocol = Protocol.HTTP;
/**
* Optionally specifies the proxy host to connect through.
* 代理设置
*/
private String proxyHost = null;
/** Optionally specifies the port on the proxy host to connect through. */
private int proxyPort = -1;
/** Optionally specifies the user name to use when connecting through a proxy. */
private String proxyUsername = null;
/** Optionally specifies the password to use when connecting through a proxy. */
private String proxyPassword = null;
}
3. 自动配置类
编写XxxAutoConfiguration类,引入属性配置,并初始化对象存储连接和api客户端。这里的配置代码基本参考对象存储接入文档。
4. 业务访问服务类编写
通过上述创建对象存储客户端,按照接入文档,可以完成桶和对象的各个api操作。可以根据实际各项目业务需求,在对象存储api客户端上层,再编写一个统一的接入服务类,对桶操作、对象上传下载等封装,简化后续应用的接入使用。
/**
* aws s3对象存储客户端方法封装模板,简化对象存储调用
*/
@RequiredArgsConstructor
@Slf4j
public class AwsossTemplate {
/**
* amazons3客户端
*/
private final AmazonS3 amazonS3Client;
/**
* 各封装方法编写
*/
}
该服务类,也可以同样在上述自动配置类中声明,有需要可通过@Conditionalxxx等注解附加条件。
/**
* 构建自定义对象存储template
*/
@Bean
@ConditionalOnMissingBean(name = "awsossTemplate")
@ConditionalOnSingleCandidate(AmazonS3.class)
public AwsossTemplate awsossTemplate(AmazonS3 amazonS3Client) {
return new AwsossTemplate(amazonS3Client);
}
5. springboot自动装配配置
在resource/META-INF文件夹下创建spring.factories文件,并加入编写的自动配置类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.smile.aswoss.AwsossAutoConfiguration
二、项目接入使用
1. 依赖引入
编写的Starter包,可以打包到本地仓库,或者上传私服等。
pom文件中引入该依赖:
<dependency>
<groupId>com.smile</groupId>
<artifactId>smile-awsoss-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
2. 配置文件属性设置
按照starter包中属性的规则,在application.properties/yml中添加对象存储相关属性。(注意如果涉及大文件上传,做好包括后端代码、nginx等各处设置)
#自定义starter包属性
awsoss.endpoint=xxx
awsoss.access-key=xxx
awsoss.secret-key=xxx
awsoss.bucket.default=defaultBucket
# 单个文件大小为5MB
spring.servlet.multipart.max-file-size = 300MB
# 总上传的数据大小5MB
spring.servlet.multipart.max-request-size = 500MB
3. 代码编写
项目中直接引入starter包中的业务服务service,完成文件上传、下载等操作。
@Autowired
private AwsossTemplate awsossTemplate;
4. 使用注意
在测试预签名对象URL方法的时候,由于对象存储服务是内网,所以通过nginx做了一层转发。但是发现内网服务器上直接访问url可以,但是在外网通过nginx转发,就报错“SignatureDoesNotMatch”。
网上查了一些,感觉对不上,但是给了些灵感,有提到会拿请求头Host做验签的。而且内网直接访问可以,说明就是nginx转发配置上有点问题。
proxy_set_header Host $http_host;
发现注释该配置。即可正常访问了。
三、其他
Amazon S3参考地址: