Ir al contenido
learn

Spring Boot, Spring Cloud y Reactor para desarrolladores C# — Misión

El curso de Java me enseñó el lenguaje. Sin embargo, el código Java que encuentro en la práctica rara vez es Java a secas: es un servicio Spring Boot, a menudo reactivo, detrás de un gateway de Spring Cloud. Sus anotaciones hacen el trabajo que Program.cs hace de forma explícita en ASP.NET Core, y sus Mono y Flux se parecen a Task y a IAsyncEnumerable sin comportarse como ellos.

Quiero leer y escribir esos servicios con la misma seguridad que una aplicación ASP.NET Core: saber de dónde viene cada bean, predecir en qué hilo se ejecuta un pipeline y distinguir una verdadera decisión de diseño de una simple costumbre.

Eres un desarrollador C# con experiencia. Conoces ASP.NET Core, su inyección de dependencias, IOptions, IHostedService, los health checks, HttpClient, IAsyncEnumerable y probablemente Polly y YARP. Has seguido Java para desarrolladores C#, o te sientes cómodo con Java 25, Maven y JUnit. Este curso te remite a las lecciones de aquel curso en lugar de repetirlas: la lección 9 para los hilos virtuales, la lección 10 para Maven, la lección 11 para JUnit, Mockito y BlockHound.

Las lecciones construyen pequeños servicios en torno a la teoría musical: un servicio de escalas que devuelve las notas y los acordes de un modo, un flujo de progresiones, un cliente de cifrados de acordes. El dominio es un módulo Java sencillo, music, sin Spring ni Reactor. Al final del curso, las piezas encajan así:

flowchart LR
client[Navegador o cliente HTTP] --> gateway[Spring Cloud Gateway]
gateway --> scales["Servicio de escalas (WebFlux)"]
gateway --> progressions["Servicio de progresiones (server-sent events)"]
progressions -->|WebClient| scales
scales --> db[(Base de datos R2DBC)]
config[Servidor de configuración] -.-> scales
config -.-> progressions
progressions -->|Spring Cloud Stream| broker[[Broker de mensajes]]

Las lecciones 1 a 4 construyen las dos primeras cajas de la derecha; las lecciones siguientes añaden las demás. Todo se ejecuta en localhost, arrancado por las pruebas, sin Docker.

  • crear una aplicación Spring Boot y explicar de dónde vienen cada uno de sus beans, propiedades y endpoints;
  • trasladar la inyección de dependencias, la configuración, las opciones y los health checks de ASP.NET Core a los de Spring;
  • escribir, probar y depurar pipelines de Reactor, y decir en qué hilo se ejecuta cada paso;
  • elegir entre Spring MVC sobre hilos virtuales y WebFlux para un servicio dado;
  • construir APIs y clientes HTTP reactivos con WebFlux y WebClient;
  • poner delante de esos servicios un gateway, configuración centralizada, descubrimiento de servicios y resiliencia con Spring Cloud;
  • observar y probar un conjunto de servicios Spring como lo haría con un conjunto de servicios ASP.NET Core.
# Lección Ya conoces
1 Spring Boot visto desde ASP.NET Core Program.cs, IServiceCollection, appsettings.json, IOptions, health checks
2 Reactor: Mono y Flux Task, IAsyncEnumerable, LINQ, Rx.NET
3 Reactor por dentro el thread pool, ConfigureAwait, los channels, Polly, AsyncLocal
4 WebFlux minimal APIs, HttpClient, server-sent events
5 Acceso reactivo a datos con R2DBC y Spring Data Entity Framework Core, IAsyncEnumerable desde un DbContext
6 Spring Cloud Gateway YARP
7 Configuración centralizada con Spring Cloud Config proveedores de configuración, Azure App Configuration
8 Descubrimiento de servicios y balanceo de carga del lado del cliente descubrimiento de servicios de .NET Aspire, IHttpClientFactory
9 Resiliencia con Resilience4j y Spring Cloud Circuit Breaker Polly, Microsoft.Extensions.Http.Resilience
10 Mensajería con Spring Cloud Stream MassTransit, clientes de Azure Service Bus
11 Observabilidad con Micrometer OpenTelemetry para .NET, dotnet-counters
12 Probar un conjunto de servicios Spring WebApplicationFactory, pruebas de integración

Diario: lo que probé, lo que me sorprendió, lo que aún tengo que verificar.