Spring Cloud Azure 支援 for Docker Compose

本文說明如何將 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。 這些工廠會根據 來ConnectionDetails製造DockerComposeConnectionDetails豆子。

下表提供 JAR 工廠類別支援 spring-cloud-azure-docker-compose 的連線細節資訊:

連接細節工廠級 連接細節
StorageBlobDockerComposeConnectionDetailsFactory AzureStorageBlobConnectionDetails
StorageQueueDockerComposeConnectionDetailsFactory AzureStorageQueueConnectionDetails
EventHubsDockerComposeConnectionDetailsFactory AzureEventHubsConnectionDetails
ServiceBusDockerComposeConnectionDetailsFactory AzureServiceBusConnectionDetails

設置依賴關係

以下配置設定可建立所需的相依關係:

  <properties>
    <version.spring.cloud.azure>7.4.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豆子,Blob 儲存體 自動設定會使用這個豆子。 此設定會覆寫任何與連線相關的設定屬性。

範例

欲了解更多資訊,請參閱 spring-cloud-azure-docker-compose 範例。