Compilar un microservicio de Spring Boot

Completado

En este módulo, crearemos un microservicio de Spring Boot habilitado para la nube. Usa un registro del servicio de Spring Cloud y un Config Server de Spring Cloud, ambos administrados y compatibles con Azure Spring Apps.

El microservicio usa Spring Data JPA para leer y escribir los datos de una base de datos de Azure Database for MySQL:

  • Azure Spring Apps enlaza automáticamente esa base de datos a nuestro servicio.
  • Azure Database for MySQL es una versión totalmente administrada de MySQL que se ejecuta en Azure.

Creación de la aplicación en Azure Spring Apps

Cree una aplicación todo-service específica en la instancia de Azure Spring Apps:

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

Creación de una base de datos MySQL

Ahora, cree una instancia de Azure Database for 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"

Esta operación puede tardar unos minutos y genera un documento JSON: copie el atributo password de ese documento, ya que se usará más adelante.

Ahora cree una base de datos todos en ese servidor y abra su firewall para que Azure Spring Apps pueda acceder a ella:

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"

Una vez completada esta operación, puede ver lo que se ha creado en el grupo de recursos generado para este taller.

Enlace de la base de datos MySQL a la aplicación

Azure Spring Apps puede enlazar automáticamente al microservicio la base de datos MySQL que se ha creado.

  1. Vaya a la instancia de Azure Spring Apps.

  2. Seleccionar Aplicaciones.

  3. Seleccione la aplicación todo-service.

  4. Seleccione Conector de servicio y, a continuación, elija + Crear.

    1. Para Tipo de servicio, seleccione Base de datos para servidor único MySQL.
    2. Especifique un nombre de conexión, por ejemplo mysql_todos.
    3. Compruebe que se muestra la suscripción correcta.
    4. Elija el servidor MySQL creado en los pasos anteriores.
    5. Seleccione la base de datos MySQL creada anteriormente.
    6. Seleccione SpringBoot como tipo de cliente.
    7. Seleccione Siguiente: Botón de autenticación.
  5. En la página Autenticación, compruebe que Cadena de conexión está seleccionada.

  6. Seleccione Continuar con... Credenciales de base de datos y rellene los campos nombre de usuario y contraseña. El nombre de usuario es "spring" y la contraseña es el atributo password que copiamos anteriormente.

    Nota:

    Si olvida la contraseña, puede restablecerla mediante az mysql server update -n ${SPRING_CLOUD_NAME}-mysql -g "$RESOURCE_GROUP_NAME" -p <new-password>

  7. Compruebe que la opción Configurar reglas de firewall para habilitar el acceso al servicio de destino está seleccionada.

  8. Haga clic en el botón Siguiente: Revisar y crear.

  9. Una vez que aparezca el mensaje Validación aprobada, seleccione el botón Crear para crear el conector de servicio.

Creación de un microservicio de Spring Boot

Ahora que hemos aprovisionado la instancia de Azure Spring Apps y que hemos configurado el enlace del servicio, vamos a preparar el código para todo-service.

Para crear el microservicio, usaremos https://start.spring.io con la línea de comandos:

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:

Usamos los componentes Spring Web, MySQL Driver, Spring Data JPA, Eureka Discovery Client y Config Client.

Incorporación de código de Spring para administrar datos mediante Spring Data JPA

Junto a la clase DemoApplication, cree una entidad de 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;
    }
}

Después, cree un repositorio de Spring Data JPA para administrar esta entidad, denominada TodoRepository:

package com.example.demo;

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

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

Para acabar de codificar esta aplicación, agregue un controlador MVC de Spring con el nombre 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();
    }
}

Configuración de Spring Boot para crear las tablas de base de datos

Para generar automáticamente las tablas de base de datos cuando se implemente la aplicación, agregue esta línea al archivo de configuración src/main/resources/application.properties:

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

Implementación de la aplicación

Ahora puede compilar el proyecto todo-service y enviarlo a 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 ..

Si quiere comprobar los registros de la aplicación, en caso de que se produzca algún error, puede usar el comando az spring app logs:

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

Prueba del proyecto en la nube

Ahora que la aplicación está implementada, es el momento de probarla.

  1. En Azure Portal, vaya a Aplicaciones en la instancia de Azure Spring Apps.
    1. Compruebe que todo-service tenga un estado de registro que indique 0/1. Esta información muestra que se ha registrado correctamente en el Registro del servicio de Spring Cloud.
    2. Seleccione todo-service para más información sobre el microservicio.
  2. Copie y pegue el punto de conexión de prueba que se proporciona.

Ahora puede usar cURL para probar el punto de conexión. El comando de prueba debe tener un aspecto similar al siguiente:

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

El resultado de este comando debe incluir los tres elementos que se han insertado antes en la base de datos MySQL:

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

Comprobar los conocimientos

1.

Para implementar un microservicio de Spring Boot en Azure Spring Apps, ¿qué debe cambiar en la aplicación?

2.

De forma predeterminada, ¿cómo se puede acceder al microservicio una vez que se ha implementado?