尝试使用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,因此我不确定。如果有时间的话,我想尝试一下。
另外,如果根据服务进行存储划分的话,可能不支持多个帐户,所以可能也不太方便使用。对于这些服务来说,快速实施可能也不会太麻烦。