尝试使用Spring Boot Starter for Azure Storage

尝试使用Spring Boot Starter for Azure Storage。

因为我自己也有些困惑,所以这篇文章可以作为备忘录。当在Spring Boot for Azure Storage中进行搜索时,会发现以下网站可能会出现,但是这个spring-starter-azure-storage库已经被废弃。

Azure存储的Spring Boot Starter使用指南 | Microsoft文档

最新的名称已更改为 azure-spring-boot-starter-storage。目前最新的库基本上以 azure-spring-boot-starter 开头(部分较旧的库除外)。

试用一下

在这个库中,提供了两种方法来进行依赖注入:一种是使用BlobServiceClientBuilder,另一种是使用Value注解来进行资源的依赖注入。让我们首先尝试使用BlobServiceClientBuilder进行依赖注入。

由于它支持从 https://start.spring.io/生成,请使用它更方便。但是,您需要在pom.xml的依赖关系中包含以下内容。

        <dependency>
            <groupId>com.azure.spring</groupId>
            <artifactId>azure-spring-boot-starter-storage</artifactId>
        </dependency>

并且在application.properties中,需要存储帐户名称、账户密钥和终端节点名称。

azure.storage.accountName=<<your account name>>
azure.storage.accountKey=<<your account key>>
azure.storage.blob-endpoint=https://<<account name>>.blob.core.windows.net/

无论是构造器注入还是字段注入都可以。以下是在构造器注入方面的实践。我们将从BlobServiceClientBuilder构建客户端实例,无论是同步客户端还是异步客户端都可以。由于Spring Boot WebFlux支持Project Reactor的异步编程,所以下面我们构建了一个异步客户端。Azure Storage SDK for Java本身支持Reactor的异步操作,所以它们是很搭配的。

以下是一个简单的示例,显示了容器列表。这里是使用 listBlobContainers 返回容器名称。返回值为 Mono<List>,而不是 Flux,是基于 WebFlux 的规范。如果使用 Flux 返回,它会被视为 JSON 的块,这让我有点困惑。

RestController
public class BlobController {

    private final BlobServiceAsyncClient blobServiceAsyncClient;

    public BlobController(BlobServiceClientBuilder builder) {
        this.blobServiceAsyncClient = builder.buildAsyncClient();
    }

    @GetMapping(value = "/containers", produces = MediaType.APPLICATION_JSON_VALUE)
    public Mono<List<String>> listContainers() {
        return this.blobServiceAsyncClient
            .listBlobContainers()
            .map(c -> c.getName())
            .collectList();
    }
}

作为将另一个资源插入的方法,可以使用以下方式通过Value标记进行依赖注入。格式为azure-blob://容器名称/块名称。以下示例将在属性文件中进行替换。

    @Value("azure-blob://${containerName}/${blobName}")
    private Resource blobFile;

    @GetMapping("/blob")
    public String hello() throws IOException {
        return StreamUtils.copyToString(
            this.blobFile.getInputStream(),
            Charset.forName("UTF-8"));
    }

顺便说一下,调用blobFile.getInputStream()时,似乎库内部会进行block(),所以在WebFlux上会出现异常并无法正常工作,需要注意。

我还不太清楚如何使用,但如果能更多了解pring框架,也许会发现它有什么用途。

总结

在属性中,写有存储密钥,但由于在Github的README中没有提到是否支持托管ID,因此我不确定。如果有时间的话,我想尝试一下。

另外,如果根据服务进行存储划分的话,可能不支持多个帐户,所以可能也不太方便使用。对于这些服务来说,快速实施可能也不会太麻烦。

广告
将在 10 秒后关闭
bannerAds