Condividi tramite


Supporto di Spring Cloud Azure per Docker Compose

Questo articolo descrive come integrare Spring Cloud Azure con Docker Compose per scrivere test di integrazione efficaci per le applicazioni.

Docker Compose è uno strumento per la definizione e l'esecuzione di applicazioni multi-contenitore. È la chiave per sbloccare un'esperienza di sviluppo e distribuzione semplificata ed efficiente.

La spring-cloud-azure-docker-compose libreria supporta ora i test di integrazione per i servizi di Azure seguenti:

Connessioni al servizio

Una connessione al servizio è una connessione a qualsiasi servizio remoto. La configurazione automatica di Spring Boot può utilizzare i dettagli di una connessione al servizio e usarli per stabilire una connessione a un servizio remoto. In questo caso, i dettagli della connessione hanno la precedenza su qualsiasi proprietà di configurazione correlata alla connessione.

Quando si usa Docker compose, è possibile creare automaticamente i dettagli di connessione per un servizio in esecuzione in un contenitore aggiungendo l'annotazione @SpringBootTest con la spring.docker.compose.file proprietà nella classe di test.

Le xxxDockerComposeConnectionDetailsFactory classi vengono registrate con spring.factories. Queste factory creano un ConnectionDetails bean basato su un oggetto DockerComposeConnectionDetails.

Nella tabella seguente vengono fornite informazioni sulle classi factory dei dettagli della connessione supportate nel spring-cloud-azure-docker-compose file JAR:

Classe factory dei dettagli della connessione Bean dei dettagli della connessione
StorageBlobDockerComposeConnectionDetailsFactory AzureStorageBlobConnectionDetails
StorageQueueDockerComposeConnectionDetailsFactory AzureStorageQueueConnectionDetails
EventHubsDockerComposeConnectionDetailsFactory AzureEventHubsConnectionDetails
ServiceBusDockerComposeConnectionDetailsFactory AzureServiceBusConnectionDetails

Configurare le dipendenze

La configurazione seguente configura le dipendenze necessarie:

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

Creare file di risorse di test

Creare questi file nella src/test/resources cartella :

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

Creare codici Java

L'esempio di codice seguente illustra l'utilizzo di base di 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 {
    }
}

Con spring.docker.compose.file, questa configurazione consente ai fagioli correlati nell'app di comunicare con l'archiviazione BLOB in esecuzione all'interno del contenitore Docker. Questa azione viene eseguita definendo automaticamente un AzureStorageBlobConnectionDetails bean, che viene quindi usato dalla configurazione automatica dell'archiviazione BLOB, eseguendo l'override di tutte le proprietà di configurazione correlate alla connessione.

Esempi

Per altre informazioni, vedere gli esempi spring-cloud-azure-docker-compose.