Creare un microservizio Spring Boot

Completato

In questo modulo verrà creato un microservizio Spring Boot abilitato per il cloud. Il microservizio usa il registro del servizio Spring Cloud e un server di configurazione Spring Cloud, entrambi gestiti e supportati da Azure Spring Apps.

Questo microservizio usa Spring Data JPA per leggere e scrivere i dati da un database di Database di Azure per MySQL:

  • Azure Spring Apps associa automaticamente tale database al servizio.
  • Database di Azure per MySQL è una versione completamente gestita di MySQL, in esecuzione in Azure.

Creare l'applicazione in Azure Spring Apps

Creare un'applicazione todo-service specifica nell'istanza di Azure Spring Apps:

az spring app create --name todo-service --resource-group "$RESOURCE_GROUP_NAME" --service "$SPRING_CLOUD_NAME" --runtime-version Java_17

Creare un database MySQL

Creare ora un'istanza di Database di Azure per MySQL:

az mysql server create \
    --name ${SPRING_CLOUD_NAME}-mysql \
    --resource-group "$RESOURCE_GROUP_NAME" \
    --sku-name B_Gen5_1 \
    --storage-size 5120 \
    --admin-user "spring"

Questa operazione può richiedere alcuni minuti e restituisce un documento JSON: copiare l'attributo password in tale documento, perché verrà usato più avanti.

Creare ora un database todos in tale server e aprire il firewall per consentire ad Azure Spring Apps di accedervi:

az mysql db create \
    --name "todos" \
    --server-name ${SPRING_CLOUD_NAME}-mysql
az mysql server firewall-rule create \
    --name ${SPRING_CLOUD_NAME}-mysql-allow-azure-ip \
    --resource-group "$RESOURCE_GROUP_NAME" \
    --server ${SPRING_CLOUD_NAME}-mysql \
    --start-ip-address "0.0.0.0" \
    --end-ip-address "0.0.0.0"

Al termine dell'operazione, è possibile esaminare gli elementi creati nel gruppo di risorse creato per questo workshop.

Associare il database MySQL all'applicazione

Azure Spring Apps consente di associare automaticamente il database MySQL creato al microservizio.

  1. Passare all'istanza di Azure Spring Apps.

  2. Selezionare App.

  3. Selezionare l'applicazione todo-service.

  4. Selezionare Connettore di servizi e quindi scegliere + Crea.

    1. Per Tipo di servizio, selezionare DB per server singolo di MySQL.
    2. Specificare un nome per la connessione, ad esempio mysql_todos.
    3. Verificare che venga visualizzata la sottoscrizione corretta.
    4. Scegliere il server MySQL creato nei passaggi precedenti.
    5. Selezionare il database MySQL creato in precedenza.
    6. Selezionare SpringBoot come tipo di client.
    7. Selezionare Avanti: pulsante Autenticazione.
  5. Nella pagina Autenticazione verificare che sia selezionata l’opzione Stringa di connessione.

  6. Selezionare Continua con... le credenziali del database e compilare i campi del nome utente e della password. Il nome utente è “spring" e la password è l’attributo della password copiato in precedenza.

    Nota

    Se si dimentica la password, è possibile reimpostarla usando az mysql server update -n ${SPRING_CLOUD_NAME}-mysql -g "$RESOURCE_GROUP_NAME" -p <new-password>

  7. Verificare che l’opzione Configurare le regole del firewall per abilitare l'accesso al servizio di destinazione sia selezionata.

  8. Fare clic sul pulsante Avanti: Rivedi e Crea.

  9. Dopo aver visualizzato il messaggio Convalida superata, selezionare il pulsante Crea per creare il connettore di servizi.

Creare un microservizio Spring Boot

Dopo avere effettuato il provisioning dell'istanza di Azure Spring Apps e aver configurato l'associazione al servizio, è possibile preparare il codice per todo-service.

Per creare il microservizio, si userà https://start.spring.io con la riga di comando:

curl https://start.spring.io/starter.tgz -d type=maven-project -d dependencies=web,mysql,data-jpa,cloud-eureka,cloud-config-client -d baseDir=todo-service -d bootVersion=3.1.5.RELEASE -d javaVersion=17 | tar -xzvf -

Nota

Vengono usati i componenti Spring Web, MySQL Driver, Spring Data JPA, Eureka Discovery Client e Config Client.

Aggiungere il codice Spring per gestire i dati usando Spring Data JPA

Accanto alla classe DemoApplication creare una nuova entità JPA Todo:

package com.example.demo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Todo {

    public Todo() {
    }

    public Todo(String description, boolean done) {
        this.description = description;
        this.done = done;
    }

    @Id
    @GeneratedValue
    private Long id;

    private String description;

    private boolean done;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public boolean isDone() {
        return done;
    }

    public void setDone(boolean done) {
        this.done = done;
    }
}

Creare quindi un repository Spring Data JPA per gestire questa entità, denominato TodoRepository:

package com.example.demo;

import org.springframework.data.jpa.repository.JpaRepository;

public interface TodoRepository extends JpaRepository<Todo, Long> {
}

Per terminare la codifica dell'applicazione, aggiungere un controller Spring MVC denominato TodoController:

package com.example.demo;

import org.springframework.web.bind.annotation.*;

import javax.annotation.PostConstruct;
import java.util.Arrays;

@RestController
public class TodoController {

    private final TodoRepository todoRepository;

    public TodoController(TodoRepository todoRepository) {
        this.todoRepository = todoRepository;
    }

    @PostConstruct
    public void init() {
        todoRepository.saveAll(Arrays.asList(
                new Todo("First item", true),
                new Todo("Second item", true),
                new Todo("Third item", false)));
    }

    @GetMapping("/")
    public Iterable<Todo> getTodos() {
        return todoRepository.findAll();
    }
}

Configurare Spring Boot per creare le tabelle di database

Per generare automaticamente le tabelle di database al momento della distribuzione dell'applicazione, aggiungere questa riga al file di configurazione src/main/resources/application.properties:

spring.jpa.hibernate.ddl-auto=create-drop

Distribuire l'applicazione

È ora possibile compilare il progetto todo-service e inviarlo ad Azure Spring Apps:

cd todo-service
./mvnw clean package -DskipTests
az spring app deploy --name todo-service --service "$SPRING_CLOUD_NAME" --resource-group "$RESOURCE_GROUP_NAME" --artifact-path target/demo-0.0.1-SNAPSHOT.jar
cd ..

Per controllare i log dell'applicazione, nel caso in cui si verifichi un errore, è possibile usare il comando az spring app logs:

az spring app logs --name todo-service --service "$SPRING_CLOUD_NAME" --resource-group "$RESOURCE_GROUP_NAME" -f

Testare il progetto nel cloud

Ora che l'applicazione è stata distribuita, è possibile testarla.

  1. Nel portale di Azure passare ad App nell'istanza di Azure Spring Apps.
    1. Verificare che Stato della registrazione per todo-service sia 0/1. Queste informazioni indicano che il progetto è stato correttamente registrato nel registro del servizio Spring Cloud.
    2. Selezionare todo-service per ottenere altre informazioni sul microservizio.
  2. Copiare e incollare l'endpoint di test fornito.

È ora possibile usare cURL per testare l'endpoint. Il comando di test sarà simile al seguente:

curl https://primary:XXXXXXXXXXXXXXXXXXXXXXXXXXXXX@azure-spring-cloud-workshop.test.azuremicroservices.io/todo-service/default/

Il risultato di questo comando deve essere costituito dai tre elementi inseriti in precedenza nel database MySQL:

[{"id":"1","description":"First item","done":true},{"id":"2","description":"Second item","done":true},{"id":"3","description":"Third item","done":false}]

Verificare le conoscenze

1.

Per distribuire un microservizio Spring Boot in Azure Spring Apps, che cosa è necessario modificare nell'applicazione?

2.

Per impostazione predefinita, in che modo è possibile accedere al microservizio dopo la distribuzione?