Delen via


Spring Cloud Azure-ondersteuning voor Docker Compose

In dit artikel wordt beschreven hoe u Spring Cloud Azure integreert met Docker Compose om effectieve integratietests voor uw toepassingen te schrijven.

Docker Compose is een hulpprogramma voor het definiëren en uitvoeren van toepassingen met meerdere containers. Het is de sleutel tot het ontgrendelen van een gestroomlijnde en efficiënte ontwikkel- en implementatieervaring.

De spring-cloud-azure-docker-compose bibliotheek biedt nu ondersteuning voor integratietests voor de volgende Azure-services:

Serviceverbindingen

Een serviceverbinding is een verbinding met elke externe service. De automatische configuratie van Spring Boot kan de details van een serviceverbinding verbruiken en deze gebruiken om een verbinding met een externe service tot stand te brengen. Als u dit doet, hebben de verbindingsgegevens voorrang op eventuele verbindingsgerelateerde configuratie-eigenschappen.

Wanneer u Docker Compose gebruikt, kunt u automatisch verbindingsgegevens maken voor een service die in een container wordt uitgevoerd door de @SpringBootTest aantekening toe te voegen met de spring.docker.compose.file eigenschap in de testklasse.

De xxxDockerComposeConnectionDetailsFactory klassen zijn geregistreerd bij spring.factories. Deze fabrieken maken een ConnectionDetails bean op basis van een DockerComposeConnectionDetails.

De volgende tabel bevat informatie over de factoryklassen voor verbindingsgegevens die worden ondersteund in de spring-cloud-azure-docker-compose JAR:

Fabrieksklasse verbindingsdetails Verbindingsdetails van de bean
StorageBlobDockerComposeConnectionDetailsFactory AzureStorageBlobConnectionDetails
StorageQueueDockerComposeConnectionDetailsFactory AzureStorageQueueConnectionDetails
EventHubsDockerComposeConnectionDetailsFactory AzureEventHubsConnectionDetails
ServiceBusDockerComposeConnectionDetailsFactory AzureServiceBusConnectionDetails

Afhankelijkheden instellen

Met de volgende configuratie worden de vereiste afhankelijkheden ingesteld:

  <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>

Testresourcebestanden maken

Maak deze bestanden in de src/test/resources map:

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-codes maken

In het volgende codevoorbeeld ziet u het basisgebruik van 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 {
    }
}

Met spring.docker.compose.filedeze configuratie kunnen gerelateerde bonen in de app communiceren met Blob Storage die wordt uitgevoerd in de Docker-container. Deze actie wordt uitgevoerd door automatisch een AzureStorageBlobConnectionDetails bean te definiëren, die vervolgens wordt gebruikt door de automatische configuratie van Blob Storage, waarbij alle configuratie-eigenschappen met betrekking tot verbindingen worden overschreven.

Voorbeelden

Zie de spring-cloud-azure-docker-compose-voorbeelden voor meer informatie.