Skip to content

Clarify native image benefits #3

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jun 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@ on:
push:
branches:
- main
pull_request:
branches:
- main

jobs:
build:
Expand Down
142 changes: 108 additions & 34 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,53 +1,127 @@
# API REST con Spring Boot 3.5
# API REST con Spring Boot 3.5 + Java 21

Este proyecto es una demostraci\u00f3n de una API REST desarrollada con **Spring Boot 3.5** y **Java 21**.
Proyecto de ejemplo construido con **Spring Boot 3.5** y **Java 21**. Forma parte de un portafolio personal y demuestra el uso de hilos virtuales de Project Loom, procesamiento asíncrono en lotes y la generación de una imagen nativa para despliegues ligeros.

## Prop\u00f3sito
## Propósito

Implementar un ejemplo de backend que expone operaciones CRUD y procesamiento as\u00edncrono usando hilos virtuales.
Implementar un backend sencillo que exponga operaciones CRUD de clientes y un procesamiento asíncrono de lotes. El proyecto sirve para explorar:

## Tecnolog\u00edas principales
- **Virtual Threads** (hilos virtuales) para alta concurrencia.
- **GraalVM Native Image** Inicio instantáneo y consumo de memoria reducido.
- Integración con **Spring Boot Actuator** y **Micrometer** para observabilidad.
- Documentación automática con **SpringDoc OpenAPI (Swagger UI)**.
- Pruebas unitarias e integración con **JUnit**, **Mockito** y **Testcontainers**.

- **Maven** para la gesti\u00f3n del proyecto.
- **Spring Data JPA** con **PostgreSQL** como base de datos.
## Tecnologías principales

- **Maven** para gestión de dependencias y empaquetado.
- **Spring Data JPA** + **PostgreSQL** para persistencia.
- **MapStruct** para el mapeo entre entidades y DTOs.
- **Lombok** para reducir c\u00f3digo boilerplate.
- **Jakarta Validation** para validaciones de datos de entrada.
- **SpringDoc OpenAPI** para la documentaci\u00f3n de la API.
- Hilos virtuales para tareas as\u00edncronas (ver `VirtualThreadConfig`).
- Pruebas con **JUnit/Mockito** y **Testcontainers**.
- **Lombok** para reducir código repetitivo.
- **Jakarta Validation** para validación de datos de entrada.
- **Spring Boot Actuator** y **Micrometer** para métricas y salud.
- **SpringDoc OpenAPI** para generación de documentación REST.
- **Procesamiento asíncrono** con hilos virtuales (`VirtualThreadConfig`).
- **Pruebas** con JUnit 5, Mockito y Testcontainers.

## Pre-requisitos

- **JDK 21** instalado y en el `PATH`.
- **PostgreSQL** accesible y configurado (ver `application.yml`).
- (Opcional) **Docker** si se desea generar la imagen nativa localmente o ejecutar contenedores de prueba.

## Instalación y configuración

1. Clonar el repositorio:
```bash
git clone https://github.com/tu-usuario/spring-boot-3.5-java21-rest.git
cd spring-boot-3.5-java21-rest
```
2. Configurar la conexión a la base de datos en `src/main/resources/application.yml`:
```yaml
spring:
datasource:
url: jdbc:postgresql://localhost:5432/mi_db
username: postgres
password: secret
jpa:
hibernate:
ddl-auto: update
threads:
virtual:
enable: true

```
3. Ajustar parámetros adicionales (puertos, credenciales, etc.) según necesidad.

## Construir y ejecutar

### Modo JVM

## Requisitos previos
```bash
mvn clean spring-boot:run
```

- **JDK 21** instalado.
- **PostgreSQL** accesible y configurado seg\u00fan `src/main/resources/application.yml`.
### Imagen nativa (GraalVM + Paketo Buildpacks)

## Compilar y ejecutar
1. Asegurarse de tener `BP_NATIVE_IMAGE=true` en el `pom.xml`.
2. Ejecutar:
```bash
mvn clean spring-boot:build-image
docker run --rm -p 8080:8080 tu-imagen-nativa:latest
```

```bash
mvn spring-boot:run
```
## Endpoints REST

Para ejecutar las pruebas:
| Método | Ruta | Descripción |
|-------:|------------------------|----------------------------------|
| GET | `/api` | Listar todos los clientes |
| POST | `/api` | Crear un nuevo cliente |
| PUT | `/api/{id}` | Actualizar un cliente existente |
| DELETE | `/api/{id}` | Eliminar un cliente |
| GET | `/api/consultar-lote` | Procesar un lote de clientes |

```bash
mvn test
```
## Procesamiento asíncrono de lotes

- Servicio orquestador: `OrchestratorServiceImpl`.
- Configuración de hilos virtuales en `VirtualThreadConfig`:
```java
@Bean
VirtualThreadTaskExecutor virtualThreadTaskExecutor() {
return new VirtualThreadTaskExecutor();
}
```
- El endpoint dispara tareas en hilos virtuales, maneja resultados de forma no bloqueante.

## Observabilidad y métricas

- Endpoints de Actuator:
- `/actuator/health`
- `/actuator/metrics`
- `/actuator/prometheus` (Micrometer)
- Trazas distribuidas con OpenTelemetry.

## Pruebas

- **Unitarias**: JUnit 5 + Mockito (`mvn test`).
- **Integración**: Testcontainers para PostgreSQL.

## Endpoints principales
## CI / CD

- `GET /api` - Lista todos los clientes.
- `POST /api` - Crea un nuevo cliente.
- `PUT /api/{id}` - Actualiza un cliente existente.
- `DELETE /api/{id}` - Elimina un cliente.
- `GET /api/consultar-lote` - Procesa de manera as\u00edncrona un lote de clientes.
Flujo de GitHub Actions para:

Estas operaciones se encuentran en `ClientControllerImpl`. El procesamiento as\u00edncrono est\u00e1 orquestado por `OrchestatorServiceImpl` y `ClientThreadVirtualServiceImpl` empleando el `virtualThreadTaskExecutor` definido en `VirtualThreadConfig`.
1. Ejecutar pruebas unitarias e integración.
2. Construir y empaquetar la aplicación.
3. Generar y publicar la imagen nativa.
4. (Opcional) Desplegar a Render u otro servicio.

## Archivos y clases relevantes
## Contribuciones

- `pom.xml` define todas las dependencias y plugins mencionados.
- `application.yml` contiene la configuraci\u00f3n de la base de datos y de SpringDoc OpenAPI.
- Clases en `src/main/java/com/dhh/apiRestSpringboot3` implementan los controladores, servicios y mapeos de la aplicaci\u00f3n.
1. Hacer fork del repositorio.
2. Crear una rama feature (`git checkout -b feature/nueva-funcionalidad`).
3. Realizar cambios y commit.
4. Enviar pull request.

## Licencia

Este proyecto está bajo la **Licencia MIT**.