通过


对 Docker Compose 的 Spring Cloud Azure 支持

本文介绍如何将 Spring Cloud Azure 与 Docker Compose 集成,以便为应用程序编写有效的集成测试。

Docker Compose 是用于定义和运行多容器应用程序的工具。 这是解锁简化且高效的开发和部署体验的关键。

spring-cloud-azure-docker-compose 库现在支持以下 Azure 服务的集成测试:

服务连接

服务连接是与任何远程服务的连接。 Spring Boot 的自动配置可以使用服务连接的详细信息,并使用它们建立与远程服务的连接。 执行此操作时,连接详细信息优先于任何与连接相关的配置属性。

使用 Docker compose 时,可以通过向测试类中的属性添加 @SpringBootTest 批注 spring.docker.compose.file ,自动为容器中运行的服务创建连接详细信息。

xxxDockerComposeConnectionDetailsFactory 注册到 spring.factories。 这些工厂基于一个 ConnectionDetailsDockerComposeConnectionDetails

下表提供有关 JAR 中 spring-cloud-azure-docker-compose 支持的连接详细信息工厂类的信息:

连接详细信息工厂类 连接详细信息 bean
StorageBlobDockerComposeConnectionDetailsFactory AzureStorageBlobConnectionDetails
StorageQueueDockerComposeConnectionDetailsFactory AzureStorageQueueConnectionDetails
EventHubsDockerComposeConnectionDetailsFactory AzureEventHubsConnectionDetails
ServiceBusDockerComposeConnectionDetailsFactory AzureServiceBusConnectionDetails

设置依赖项

以下配置设置所需的依赖项:

  <properties>
    <version.spring.cloud.azure>7.1.0</version.spring.cloud.azure>
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-dependencies</artifactId>
        <version>${version.spring.cloud.azure}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-storage-blob</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-docker-compose</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

创建测试资源文件

src/test/resources 文件夹中创建这些文件:

storage-compose.yaml:

services:
  storage:
    image: mcr.microsoft.com/azure-storage/azurite:latest
    ports:
      - '10000'
      - '10001'
      - '10002'
    command: azurite -l /data --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0 --skipApiVersionCheck

创建 Java 代码

以下代码示例演示 Docker compose 的基本用法:

@SpringBootTest(properties = {
        "spring.docker.compose.skip.in-tests=false",
        "spring.docker.compose.file=classpath:storage-compose.yaml",
        "spring.docker.compose.stop.command=down"
})
public class AzureBlobResourceDockerComposeTest {

    @Value("azure-blob://testcontainers/message.txt")
    private Resource blobFile;

    @Test
    void blobResourceShouldWriteAndReadContent() throws IOException {
        String originalContent = "Hello World!";
        try (OutputStream os = ((WritableResource) this.blobFile).getOutputStream()) {
            os.write(originalContent.getBytes());
        }
        String resultContent = StreamUtils.copyToString(this.blobFile.getInputStream(), Charset.defaultCharset());
        assertThat(resultContent).isEqualTo(originalContent);
    }

    @Configuration(proxyBeanMethods = false)
    @ImportAutoConfiguration(classes = {
            AzureGlobalPropertiesAutoConfiguration.class,
            AzureStorageBlobAutoConfiguration.class,
            AzureStorageBlobResourceAutoConfiguration.class})
    static class Config {
    }
}

通过 spring.docker.compose.file此配置,应用中的相关豆类能够与 Docker 容器中运行的 Blob 存储通信。 此操作通过自动定义 AzureStorageBlobConnectionDetails bean(然后由 Blob 存储自动配置使用),重写任何与连接相关的配置属性来完成。

示例

有关详细信息,请参阅 spring-cloud-azure-docker-compose 示例