Usare Spring Data JDBC con Database di Azure per PostgreSQL

Questa esercitazione illustra come archiviare i dati in un database Database di Azure per PostgreSQL usando Spring Data JDBC.

JDBC è l'API Java standard per la connessione ai database relazionali tradizionali.

In questa esercitazione sono inclusi due metodi di autenticazione: autenticazione di Microsoft Entra e autenticazione PostgreSQL. La scheda Senza password mostra l'autenticazione di Microsoft Entra e la scheda Password mostra l'autenticazione PostgreSQL.

L'autenticazione di Microsoft Entra è un meccanismo per la connessione a Database di Azure per PostgreSQL usando le identità definite in Microsoft Entra ID. Con l'autenticazione di Microsoft Entra, è possibile gestire le identità utente del database e altre servizi Microsoft in una posizione centrale, semplificando la gestione delle autorizzazioni.

L'autenticazione postgreSQL usa gli account archiviati in PostgreSQL. Se si sceglie di usare le password come credenziali per gli account, queste credenziali verranno archiviate nella user tabella. Poiché queste password vengono archiviate in PostgreSQL, è necessario gestire manualmente la rotazione delle password.

Prerequisiti

  • Client della riga di comando postgreSQL.

  • Se non si ha un'applicazione Spring Boot, creare un progetto Maven con Spring Initializr. Assicurarsi di selezionare Progetto Maven e, in Dipendenze, aggiungere le dipendenze Spring Web, Spring Data JDBC e PostgreSQL Driver e quindi selezionare Java versione 8 o successiva.

Vedere l'applicazione di esempio

In questa esercitazione verrà codificata un'applicazione di esempio. Per procedere più rapidamente, è possibile usare l'applicazione già pronta, disponibile all'indirizzo https://github.com/Azure-Samples/quickstart-spring-data-jdbc-postgresql.

Configurare una regola del firewall per il server PostgreSQL

Le istanze di Database di Azure per PostgreSQL sono protette per impostazione predefinita. Includono un firewall che non consente alcuna connessione in ingresso.

Per poter usare il database, aprire il firewall del server per consentire all'indirizzo IP locale di accedere al server di database. Per altre informazioni, vedere Regole del firewall in Database di Azure per PostgreSQL - Server flessibile.

Se ci si connette al server PostgreSQL da sottosistema Windows per Linux (WSL) in un computer Windows, è necessario aggiungere l'ID host WSL al firewall.

Creare un utente non amministratore di PostgreSQL e concedere l'autorizzazione

Creare quindi un utente non amministratore e concedere tutte le autorizzazioni al database.

È possibile usare il metodo seguente per creare un utente non amministratore che usa una connessione senza password.

  1. Usare il comando seguente per installare l'estensione senza password service Connessione or per l'interfaccia della riga di comando di Azure:

     az extension add --name serviceconnector-passwordless --upgrade
    
  2. Usare il comando seguente per creare l'utente non amministratore di Microsoft Entra:

      az connection create postgres-flexible \
           --resource-group <your_resource_group_name> \
           --connection postgres_conn \
           --target-resource-group <your_resource_group_name> \
           --server postgresqlflexibletest \
           --database demo \
           --user-account \
           --query authInfo.userName \
           --output tsv
    

    Al termine del comando, prendere nota del nome utente nell'output della console.

Archiviare dati da Database di Azure per PostgreSQL

Ora che si dispone di un'istanza del server flessibile Database di Azure per PostgreSQL, è possibile archiviare i dati usando Spring Cloud Azure.

Per installare il modulo JDBC PostgreSQL di Spring Cloud Starter, aggiungere le dipendenze seguenti al file pom.xml :

  • Spring Cloud Azure Bill of Materials (BOM):

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

    Nota

    Se si usa Spring Boot 2.x, assicurarsi di impostare la spring-cloud-azure-dependencies versione su 4.17.0. Questa distinta base deve essere configurata nella <dependencyManagement> sezione del file di pom.xml . In questo modo tutte le dipendenze di Spring Cloud Azure usano la stessa versione. Per altre informazioni sulla versione usata per questa distinta base, vedere La versione di Spring Cloud azure da usare.

  • Artefatto JDBC PostgreSQL di Spring Cloud Starter:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-jdbc-postgresql</artifactId>
    </dependency>
    

Nota

Le connessioni senza password sono supportate dalla versione 4.5.0.

Configurare Spring Boot per l'uso di Database di Azure per PostgreSQL

Per archiviare dati da Database di Azure per PostgreSQL usando Spring Data JDBC, seguire questa procedura per configurare l'applicazione:

  1. Configurare Database di Azure per PostgreSQL credenziali aggiungendo le proprietà seguenti al file di configurazione application.properties.

    logging.level.org.springframework.jdbc.core=DEBUG
    
    spring.datasource.url=jdbc:postgresql://postgresqlflexibletest.postgres.database.azure.com:5432/demo?sslmode=require
    spring.datasource.username=<your_postgresql_ad_non_admin_username>
    spring.datasource.azure.passwordless-enabled=true
    
    spring.sql.init.mode=always
    

    Avviso

    La proprietà spring.sql.init.mode=always di configurazione indica che Spring Boot genererà automaticamente uno schema di database, usando il file schema.sql che verrà creato successivamente, ogni volta che il server viene avviato. Questa funzionalità è ideale per i test, ma tenere presente che eliminerà i dati a ogni riavvio, quindi non è consigliabile usarli nell'ambiente di produzione.

Vedere l'applicazione di esempio

In questo articolo verrà codificata un'applicazione di esempio. Per procedere più rapidamente, è possibile usare l'applicazione già pronta, disponibile all'indirizzo https://github.com/Azure-Samples/quickstart-spring-data-jdbc-postgresql.

Configurare una regola del firewall per il server PostgreSQL

Le istanze di Database di Azure per PostgreSQL sono protette per impostazione predefinita. Includono un firewall che non consente alcuna connessione in ingresso.

Per poter usare il database, aprire il firewall del server per consentire all'indirizzo IP locale di accedere al server di database. Per altre informazioni, vedere Creare e gestire regole del firewall per Database di Azure per PostgreSQL - Server singolo usando il portale di Azure.

Se ci si connette al server PostgreSQL da sottosistema Windows per Linux (WSL) in un computer Windows, è necessario aggiungere l'ID host WSL al firewall.

Creare un utente non amministratore di PostgreSQL e concedere l'autorizzazione

Creare quindi un utente non amministratore e concedere tutte le autorizzazioni al database.

È possibile usare il metodo seguente per creare un utente non amministratore che usa una connessione senza password.

  1. Usare il comando seguente per installare l'estensione senza password service Connessione or per l'interfaccia della riga di comando di Azure:

     az extension add --name serviceconnector-passwordless --upgrade
    
  2. Usare il comando seguente per creare l'utente non amministratore di Microsoft Entra:

      az connection create postgres \
           --resource-group <your_resource_group_name> \
           --connection postgres_conn \
           --target-resource-group <your_resource_group_name> \
           --server postgresqlsingletest \
           --database demo \
           --user-account \
           --query authInfo.userName \
           --output tsv
    

    Al termine del comando, prendere nota del nome utente nell'output della console.

Archiviare dati da Database di Azure per PostgreSQL

Ora che si dispone di un'istanza del server singolo Database di Azure per PostgreSQL, è possibile archiviare i dati usando Spring Cloud Azure.

Per installare il modulo JDBC PostgreSQL di Spring Cloud Starter, aggiungere le dipendenze seguenti al file pom.xml :

  • Spring Cloud Azure Bill of Materials (BOM):

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

    Nota

    Se si usa Spring Boot 2.x, assicurarsi di impostare la spring-cloud-azure-dependencies versione su 4.17.0. Questa distinta base deve essere configurata nella <dependencyManagement> sezione del file di pom.xml . In questo modo tutte le dipendenze di Spring Cloud Azure usano la stessa versione. Per altre informazioni sulla versione usata per questa distinta base, vedere La versione di Spring Cloud azure da usare.

  • Artefatto JDBC PostgreSQL di Spring Cloud Starter:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-jdbc-postgresql</artifactId>
    </dependency>
    

Nota

Le connessioni senza password sono supportate dalla versione 4.5.0.

Configurare Spring Boot per l'uso di Database di Azure per PostgreSQL

Per archiviare dati da Database di Azure per PostgreSQL usando Spring Data JDBC, seguire questa procedura per configurare l'applicazione:

  1. Configurare Database di Azure per PostgreSQL credenziali aggiungendo le proprietà seguenti al file di configurazione application.properties.

    logging.level.org.springframework.jdbc.core=DEBUG
    
    spring.datasource.url=jdbc:postgresql://postgresqlsingletest.postgres.database.azure.com:5432/demo?sslmode=require
    spring.datasource.username=<your_postgresql_ad_non_admin_username>@postgresqlsingletest
    spring.datasource.azure.passwordless-enabled=true
    
    spring.sql.init.mode=always
    

    Avviso

    La proprietà spring.sql.init.mode=always di configurazione indica che Spring Boot genererà automaticamente uno schema di database, usando il file schema.sql che verrà creato successivamente, ogni volta che il server viene avviato. Questa funzionalità è ideale per i test, ma tenere presente che eliminerà i dati a ogni riavvio, quindi non è consigliabile usarli nell'ambiente di produzione.

  1. Creare il file di configurazione src/main/resources/schema.sql per configurare lo schema del database, quindi aggiungere il contenuto seguente.

    DROP TABLE IF EXISTS todo;
    CREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);
    
  1. Creare una nuova Todo classe Java. Questa classe è un modello di dominio mappato alla todo tabella che verrà creato automaticamente da Spring Boot. Il codice seguente ignora i getters metodi e setters .

    import org.springframework.data.annotation.Id;
    
    public class Todo {
    
        public Todo() {
        }
    
        public Todo(String description, String details, boolean done) {
            this.description = description;
            this.details = details;
            this.done = done;
        }
    
        @Id
        private Long id;
    
        private String description;
    
        private String details;
    
        private boolean done;
    
    }
    
  2. Modificare il file della classe di avvio per visualizzare il contenuto seguente.

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.context.event.ApplicationReadyEvent;
    import org.springframework.context.ApplicationListener;
    import org.springframework.context.annotation.Bean;
    import org.springframework.data.repository.CrudRepository;
    
    import java.util.stream.Stream;
    
    @SpringBootApplication
    public class DemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    
        @Bean
        ApplicationListener<ApplicationReadyEvent> basicsApplicationListener(TodoRepository repository) {
            return event->repository
                .saveAll(Stream.of("A", "B", "C").map(name->new Todo("configuration", "congratulations, you have set up correctly!", true)).toList())
                .forEach(System.out::println);
        }
    
    }
    
    interface TodoRepository extends CrudRepository<Todo, Long> {
    
    }
    

    Suggerimento

    In questa esercitazione non sono presenti operazioni di autenticazione nelle configurazioni o nel codice. Tuttavia, la connessione ai servizi di Azure richiede l'autenticazione. Per completare l'autenticazione, è necessario usare Identità di Azure. Spring Cloud Azure usa DefaultAzureCredential, che la libreria di identità di Azure fornisce per ottenere le credenziali senza modifiche al codice.

    DefaultAzureCredential supporta più metodi di autenticazione e determina il metodo da usare in fase di esecuzione. Questo approccio consente all'app di usare metodi di autenticazione diversi in ambienti diversi (ad esempio ambienti locali e di produzione) senza implementare codice specifico dell'ambiente. Per altre informazioni, vedere DefaultAzureCredential.

    Per completare l'autenticazione negli ambienti di sviluppo locali, è possibile usare l'interfaccia della riga di comando di Azure, Visual Studio Code, PowerShell o altri metodi. Per altre informazioni, vedere Autenticazione di Azure in ambienti di sviluppo Java. Per completare l'autenticazione negli ambienti di hosting di Azure, è consigliabile usare l'identità gestita assegnata dall'utente. Per altre informazioni, vedere Informazioni sulle identità gestite per le risorse di Azure

  3. Avviare l’applicazione. L'applicazione archivia i dati nel database. Verranno visualizzati log simili all'esempio seguente:

    2023-02-01 10:22:36.701 DEBUG 7948 --- [main] o.s.jdbc.core.JdbcTemplate : Executing prepared SQL statement [INSERT INTO todo (description, details, done) VALUES (?, ?, ?)]    
    com.example.demo.Todo@4bdb04c8
    

Distribuire in Azure Spring Apps

Ora che l'applicazione Spring Boot è in esecuzione in locale, è possibile spostarla nell'ambiente di produzione. Azure Spring Apps semplifica la distribuzione di applicazioni Spring Boot in Azure senza modifiche al codice. Il servizio gestisce l'infrastruttura delle applicazioni Spring per consentire agli sviluppatori di concentrarsi sul codice. Azure Spring Apps offre la gestione del ciclo di vita usando monitoraggio e diagnostica completi, gestione della configurazione, individuazione dei servizi, integrazione CI/CD, distribuzioni blu-verde e altro ancora. Per distribuire l'applicazione in Azure Spring Apps, vedere Distribuire la prima applicazione in Azure Spring Apps.

Passaggi successivi