AmazonS3对象存储方法Starter包编写

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参考地址:

什么是 Amazon S3? - Amazon Simple Storage Service

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot Amazon S3 是一个集成组件,它允许你在使用 Spring Boot 框架的 Java 应用程序中轻松地与 Amazon Simple Storage Service (S3) 集成。Amazon S3 是一种云存储服务,用于存储和检索大量的静态文件、应用程序数据或其他任何类型的数据。 在 Spring Boot 中集成 Amazon S3,你可以执行以下操作: 1. 添加依赖:在你的 `pom.xml` 或者 `build.gradle` 文件中添加 AWS SDK for JavaSpring Cloud AWS S3 的依赖。 ```xml <!-- Maven --> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-s3</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-aws-s3</artifactId> </dependency> // Gradle implementation 'com.amazonaws:aws-java-sdk-s3' implementation 'org.springframework.cloud:spring-cloud-starter-aws-s3' ``` 2. 配置AWS凭证:你需要提供 AWS 密钥(ACCESS_KEY_ID)和秘密访问密钥(SECRET_ACCESS_KEY),或者设置环境变量(如 `AWS_ACCESS_KEY_ID` 和 `AWS_SECRET_ACCESS_KEY`),以授权对 S3 的访问。 3. 创建 S3 实体和Repository:根据需要定义 S3 存储的对象模型,如 `S3Object` 或自定义实体,然后创建对应的 Repository 接口以支持 CRUD 操作。 4. 上传/下载文件:使用 Spring Boot 的 `@Autowired` 注解注入 S3Client 对象,然后调用其提供的方法来上传文件到 S3 或从 S3 下载文件。 5. 使用S3服务:Spring Cloud AWS S3 提供了诸如 `AmazonS3Operations` 或 `AmazonS3Client` 的便利类,可以直接用于执行常见的 S3 操作,如列出对象、删除对象等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值