diff --git a/README.es.md b/README.es.md new file mode 100644 index 0000000..65a89c7 --- /dev/null +++ b/README.es.md @@ -0,0 +1,48 @@ +# Aprendamos .NET Aspire + +Ven y aprende todo sobre [.NET Aspire](https://learn.microsoft.com/dotnet/aspire/), una nueva pila de tecnología lista para la nube para construir aplicaciones distribuidas, observables y listas para producción. .NET Aspire se puede agregar a cualquier aplicación, independientemente de su tamaño y escala, para ayudarte a construir aplicaciones mejores y más rápidas. + +.NET Aspire simplifica el desarrollo de aplicaciones con: + +- **Orquestación**: Orquestación incorporada con un motor de flujo de trabajo simple pero potente. Utiliza C# y API familiares sin necesidad de YAML. Agrega fácilmente servicios en la nube populares, conecta a tus proyectos y ejecútalos localmente con un solo clic. +- **Descubrimiento de servicios**: Inyección automática de las cadenas de conexión correctas o configuraciones de red y la información de descubrimiento de servicios para simplificar la experiencia del desarrollador. +- **Componentes**: Componentes incorporados para servicios en la nube comunes como bases de datos, colas y almacenamiento. Integrados con registro, comprobaciones de salud, telemetría y más. +- **Panel de control**: Visualiza datos en vivo de OpenTelemetry sin necesidad de configuración. El panel de control para desarrolladores de .NET Aspire muestra registros, variables de entorno, trazas distribuidas, métricas y más para verificar rápidamente el comportamiento de la aplicación. +- **Despliegue**: Gestiona la inyección de las cadenas de conexión correctas o configuraciones de red y la información de descubrimiento de servicios para simplificar la experiencia del desarrollador. +- **Y mucho más**: .NET Aspire está repleto de características que a los desarrolladores les encantarán y que te ayudarán a ser más productivo. + +Obtén más información sobre .NET Aspire con los siguientes recursos: +- [Documentación](https://learn.microsoft.com/dotnet/aspire) +- [Ruta de aprendizaje de Microsoft Learn](https://learn.microsoft.com/training/paths/dotnet-aspire/) +- [Videos de .NET Aspire](https://aka.ms/aspire/videos) +- [Aplicación de muestra de referencia eShop](https://github.com/dotnet/eshop) +- [Ejemplos de .NET Aspire](https://learn.microsoft.com/samples/browse/?expanded=dotnet&products=dotnet-aspire) +- [Preguntas frecuentes de .NET Aspire](https://learn.microsoft.com/dotnet/aspire/reference/aspire-faq) + +## Localización + +Estos materiales del taller de .NET Aspire están disponibles en los siguientes idiomas: + +- [Inglés](./README.md) +- [한국어](./README.ko.md) + +## Taller + +Este taller de .NET Aspire forma parte de la serie [Aprendamos .NET](https://aka.ms/letslearndotnet). Este taller está diseñado para ayudarte a aprender sobre .NET Aspire y cómo utilizarlo para construir aplicaciones listas para la nube. El taller se divide en 6 módulos: + +1. [Configuración e instalación](./workshop/localisation/es/1-setup.md) +1. [Valores predeterminados de servicio](./workshop/localisation/es/2-sevicedefaults.md) +1. [Panel de control del desarrollador y orquestación](./workshop/localisation/es/3-dashboard-apphost.md) +1. [Descubrimiento de servicios](./workshop/localisation/es/4-servicediscovery.md) +1. [Componentes](./workshop/localisation/es/5-components.md) +1. [Despliegue](./workshop/localisation/es/6-deployment.md) + +Un conjunto completo de diapositivas está disponible para este taller [aquí](./workshop/localisation/es/AspireWorkshop.pptx). + +El proyecto inicial para este taller se encuentra en la carpeta `start-with-api`. Este proyecto es una API de clima simple que utiliza la API del Servicio Meteorológico Nacional para obtener datos meteorológicos y un frontend web para mostrar los datos meteorológicos impulsado por Blazor. + +Este taller está diseñado para completarse en un marco de tiempo de 2 horas. + +## Datos de demostración + +Los datos y servicios utilizados en este tutorial provienen del Servicio Meteorológico Nacional de los Estados Unidos (NWS) en https://weather.gov. Estamos utilizando su especificación de OpenAPI para consultar pronósticos del clima. La especificación de OpenAPI está [disponible en línea](https://www.weather.gov/documentation/services-web-api). Estamos utilizando solo 2 métodos de esta API y hemos simplificado nuestro código para utilizar solo esos métodos en lugar de crear el cliente completo de OpenAPI para la API de NWS. diff --git a/README.md b/README.md index 019c164..ed2f3c6 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ This workshop materials are available in the following languages: - [English](./README.md) - [한국어](./README.ko.md) +- [Español](./README.es.md) ## Workshop diff --git a/workshop/5-components.md b/workshop/5-components.md index 16373b0..fc615e2 100644 --- a/workshop/5-components.md +++ b/workshop/5-components.md @@ -121,4 +121,4 @@ In this section, we added a Redis component to the App Host and integrated outpu There are many more components available that you can use to integrate with your services. You can find the list of available components [in the .NET Aspire documentation](https://learn.microsoft.com/dotnet/aspire/fundamentals/components-overview?tabs=dotnet-cli#available-components). -A natural next step would be to integrate a database or leverage Azure Redis Cache as a hosted solution. Components for these and more are available on NuGet. +A natural next step would be to integrate a database or leverage Azure Redis Cache as a hosted solution. Components for these and more are available on NuGet. \ No newline at end of file diff --git a/workshop/localisation/es/1-setup.md b/workshop/localisation/es/1-setup.md new file mode 100644 index 0000000..ccdae74 --- /dev/null +++ b/workshop/localisation/es/1-setup.md @@ -0,0 +1,38 @@ +# Configuración del sistema + +Este taller utilizará las siguientes herramientas: + +- [.NET 8 SDK](https://dot.net/download) +- [Carga de trabajo de .NET Aspire](https://learn.microsoft.com/dotnet/aspire/fundamentals/setup-tooling?tabs=dotnet-cli%2Cunix#install-net-aspire) +- [Docker Desktop](https://docs.docker.com/engine/install/) o [Podman](https://podman.io/getting-started/installation) +- [Visual Studio 2022](https://visualstudio.microsoft.com/vs/) o [Visual Studio Code](https://code.visualstudio.com/) con [C# DevKit](https://code.visualstudio.com/docs/csharp/get-started) + +Para obtener la mejor experiencia, recomendamos utilizar Visual Studio 2022 con la carga de trabajo de .NET Aspire. Sin embargo, también puedes utilizar Visual Studio Code con el C# Dev Kit y la carga de trabajo de .NET Aspire. A continuación, se muestran las guías de configuración para cada plataforma. + +## Windows con Visual Studio + +- Instala [Visual Studio 2022 versión 17.10 o posterior](https://visualstudio.microsoft.com/vs/). + - Selecciona las siguientes cargas de trabajo: + - Carga de trabajo de `ASP.NET y desarrollo web`. + - Componente `.NET Aspire SDK` en `Componentes individuales`. + +## Mac, Linux y Windows sin Visual Studio + +- Instala la última versión del [.NET 8 SDK](https://dot.net/download?cid=eshop) +- Instala la carga de trabajo de [.NET Aspire](https://learn.microsoft.com/dotnet/aspire/fundamentals/setup-tooling?tabs=dotnet-cli%2Cunix#install-net-aspire) con los siguientes comandos: + +```powershell +dotnet workload update +dotnet workload install aspire +``` + +> Nota: Es posible que estos comandos requieran `sudo`. + +- Instala [Visual Studio Code con C# Dev Kit](https://code.visualstudio.com/docs/csharp/get-started) + +> Nota: Cuando se ejecuta en Mac con Apple Silicon (procesador de la serie M), se requiere Rosetta 2 para grpc-tools. + +## Prueba de la instalación + +Para probar tu instalación, consulta el [Crear tu primer proyecto de .NET Aspire](https://learn.microsoft.com/dotnet/aspire/get-started/build-your-first-aspire-app) para obtener más información. + diff --git a/workshop/localisation/es/2-servicedefaults.md b/workshop/localisation/es/2-servicedefaults.md new file mode 100644 index 0000000..2a29a7b --- /dev/null +++ b/workshop/localisation/es/2-servicedefaults.md @@ -0,0 +1,90 @@ +# Valores predeterminados del servicio, también conocidos como valores predeterminados inteligentes + +## Introducción + +.NET Aspire proporciona un conjunto de valores predeterminados inteligentes para los servicios que se utilizan comúnmente en las aplicaciones .NET. Estos valores predeterminados están diseñados para ayudarte a comenzar rápidamente y proporcionar una experiencia consistente en diferentes tipos de aplicaciones. Esto incluye: + +- Telemetría: Métricas, trazas, registro +- Resiliencia +- Comprobaciones de estado +- Descubrimiento de servicios + +## Crear proyecto de valores predeterminados del servicio + +### Visual Studio y Visual Studio Code + +1. Agrega un nuevo proyecto a la solución llamado `ServiceDefaults`: + + - Haz clic derecho en la solución y selecciona `Agregar` > `Nuevo proyecto`. + - Selecciona la plantilla de proyecto `.NET Aspire Service Defaults`. + - Nombra el proyecto `ServiceDefaults`. + - Haz clic en `Siguiente` > `Crear`. + + *Visual Studio* + ![Cuadro de diálogo de Visual Studio para agregar un proyecto de valores predeterminados del servicio](./../../media/vs-add-servicedefaults.png) + + *Visual Studio Code* + ![Cuadro de diálogo de Visual Studio Code para agregar un proyecto de valores predeterminados del servicio](./../../media/vsc-add-servicedefaults.png) + + +### Línea de comandos + +1. Crea un nuevo proyecto utilizando el comando `dotnet new aspire-servicedefaults`: + + ```bash + dotnet new aspire-servicedefaults -n ServiceDefaults + ``` + +## Configurar los valores predeterminados del servicio + +1. Agrega una referencia al proyecto `ServiceDefaults` en los proyectos `Api` y `MyWeatherHub`: + + - Haz clic derecho en el proyecto `Api` y selecciona `Agregar` > `Referencia`. + - Marca el proyecto `ServiceDefaults` y haz clic en `Aceptar`. + - Haz clic derecho en el proyecto `Api` y selecciona `Agregar` > `Referencia`. + - Marca el proyecto `MyWeatherHub` y haz clic en `Aceptar`. + + > Consejo: En Visual Studio 2022, puedes arrastrar y soltar el proyecto sobre otro proyecto para agregar una referencia. + +1. En los proyectos `Api` y `MyWeatherHub`, actualiza los archivos `Program.cs`, agregando la siguiente línea inmediatamente después de la línea `var builder = WebApplication.CreateBuilder(args);`: + + ```csharp + builder.AddServiceDefaults(); + ``` + +1. En los proyectos `Api` y `MyWeatherHub`, actualiza los archivos `Program.cs`, agregando la siguiente línea inmediatamente después de la línea `var app = builder.Build();`: + + ```csharp + app.MapDefaultEndpoints(); + ``` + +## Ejecutar la aplicación + +1. Ejecuta la aplicación utilizando una configuración de multiproyecto en Visual Studio o Visual Studio Code. + + - Visual Studio: Haz clic derecho en la solución `MyWeatherHub` y ve a propiedades. Selecciona `Api` y `MyWeatherHub` como proyectos de inicio, selecciona `Aceptar`. + - ![Propiedades de la solución de Visual Studio](./../../media/vs-multiproject.png) + - Haz clic en `Iniciar` para iniciar y depurar ambos proyectos. + - Visual Studio Code: Ejecuta los proyectos `Api` y `MyWeatherHub` utilizando el panel `Ejecutar y depurar`. Hemos proporcionado un archivo `launch.json` con las configuraciones necesarias para ejecutar ambos. + +1. Prueba la aplicación navegando a las siguientes URL: + + - [https://localhost:7032/swagger/index.html](https://localhost:7032/swagger/index.html) - API + - [https://localhost:7274/](https://localhost:7274/) - MyWeatherHub + +1. Deberías ver la interfaz de usuario de Swagger para la API y la página de inicio de MyWeatherHub. +1. También puedes ver las comprobaciones de estado de la API navegando a [https://localhost:7032/health](https://localhost:7032/health). +1. También puedes ver las comprobaciones de estado de MyWeatherHub navegando a [https://localhost:7274/health](https://localhost:7274/health). +1. Visualiza los registros en la terminal para ver las comprobaciones de estado y otros datos de telemetría, como la resiliencia con Polly: + + ```bash + Polly: Información: Intento de ejecución. Origen: '-standard//Standard-Retry', Clave de operación: '', Resultado: '200', Manejado: 'False', Intento: '0', Tiempo de ejecución: '13.0649' + ``` + +1. Haz clic en 5 ciudades diferentes y se lanzará un error "aleatorio". Verás la política de re-intento en acción. + + ```bash + Polly: Advertencia: Intento de ejecución. Origen: '-standard//Standard-Retry', Clave de operación: '', Resultado: '500', Manejado: 'True', Intento: '0', Tiempo de ejecución: '9732.8258' + Polly: Advertencia: Se produjo un evento de resiliencia. Nombre del evento: 'OnRetry', Origen: '-standard//Standard-Retry', Clave de operación: '', Resultado: '500' + System.Net.Http.HttpClient.NwsManager.ClientHandler: Información: Enviando solicitud HTTP GET http://localhost:5271/forecast/AKZ318 + ``` diff --git a/workshop/localisation/es/3-dashboard-apphost.md b/workshop/localisation/es/3-dashboard-apphost.md new file mode 100644 index 0000000..8b51354 --- /dev/null +++ b/workshop/localisation/es/3-dashboard-apphost.md @@ -0,0 +1,103 @@ +# Panel de control y orquestación con .NET Aspire App Host + +.NET Aspire proporciona APIs para expresar recursos y dependencias dentro de tu aplicación distribuida. Además de estas APIs, hay herramientas que permiten algunos escenarios interesantes. El orquestador está destinado a fines de desarrollo local. + +Antes de continuar, considera algunos términos comunes utilizados en .NET Aspire: + +* *Modelo de aplicación*: Una colección de recursos que conforman tu aplicación distribuida (DistributedApplication). +* *Proyecto de anfitrión de aplicación/orquestador*: El proyecto .NET que orquesta el modelo de aplicación, nombrado con el sufijo *.AppHost (por convención). +* *Recurso*: Un recurso representa una parte de una aplicación, ya sea un proyecto .NET, un contenedor, un ejecutable u otro recurso como una base de datos, una caché o un servicio en la nube (como un servicio de almacenamiento). +* *Referencia*: Una referencia define una conexión entre recursos, expresada como una dependencia mediante la API `WithReference`. + +## Crear proyecto de anfitrión de aplicación + +### Visual Studio y Visual Studio Code + +1. Agrega un nuevo proyecto a la solución llamado `AppHost`: + + - Haz clic derecho en la solución y selecciona `Agregar` > `Nuevo proyecto`. + - Selecciona la plantilla de proyecto `.NET Aspire App Host`. + - Nombra el proyecto `AppHost`. + - Haz clic en `Siguiente` > `Crear`. + + *Visual Studio* + ![Diálogo de Visual Studio para agregar un proyecto de anfitrión de aplicación](./../../media/vs-add-apphost.png) + + *Visual Studio Code* + ![Diálogo de Visual Studio Code para agregar un proyecto de anfitrión de aplicación](./../../media/vsc-add-apphost.png) + + +### Línea de comandos + +1. Crea un nuevo proyecto utilizando el comando `dotnet new aspire-apphost`: + + ```bash + dotnet new aspire-apphost -n AppHost + ``` + +## Configurar valores predeterminados del servicio + +1. Agrega una referencia a los proyectos `Api` y `MyWeatherHub` en el nuevo proyecto `AppHost`: + + - Haz clic derecho en el proyecto `AppHost` y selecciona `Agregar` > `Referencia`. + - Marca los proyectos `Api` y `MyWeatherHub` y haz clic en `Aceptar`. + + > Consejo: En Visual Studio 2022, puedes arrastrar y soltar el proyecto sobre otro proyecto para agregar una referencia. + +1. Cuando se agregan estas referencias, los generadores de código fuente generan automáticamente el código necesario para referenciar los proyectos en el anfitrión de la aplicación. + +## Orquestar la aplicación + +1. En el proyecto `AppHost`, actualiza el archivo `Program.cs`, agregando la siguiente línea inmediatamente después de la línea `var builder = DistributedApplication.CreateBuilder(args);`: + + ```csharp + var api = builder.AddProject("api"); + + var web = builder.AddProject("myweatherhub"); + ``` + +## Ejecutar la aplicación + +1. Establece el proyecto `AppHost` como proyecto de inicio en Visual Studio haciendo clic derecho en `AppHost` y seleccionando `Establecer como proyecto predeterminado`. +1. Si estás utilizando Visual Studio Code, abre el archivo `launch.json` y reemplaza todo el contenido con lo siguiente: + ```json + { + "version": "0.2.0", + "configurations": [ + { + "name": "Ejecutar AppHost", + "type": "dotnet", + "request": "launch", + "projectPath": "${workspaceFolder}\\AppHost\\AppHost.csproj" + } + ] + } + ``` + +1. Ejecuta el anfitrión de la aplicación utilizando el panel `Ejecutar y depurar` en Visual Studio Code o Visual Studio. +1. El Panel de control de .NET Aspire se abrirá en tu navegador predeterminado y mostrará los recursos y dependencias de tu aplicación. + + ![Panel de control de .NET Aspire](./../../media/dashboard.png) + +1. Abre el panel del clima haciendo clic en el punto de conexión para `MyWeatherHub`, que será [https://localhost:7274](https://localhost:7274). +1. Observa que los proyectos `Api` y `MyWeatherHub` se están ejecutando en el mismo proceso y pueden comunicarse entre sí de la misma manera que antes utilizando la configuración. +1. Haz clic en el botón `Ver registros` para ver los registros de los proyectos `Api` y `MyWeatherHub`. +1. Selecciona la pestaña `Traces` y selecciona `Ver` en un rastro donde se llame a la API. + + ![Panel de control de .NET Aspire](./../../media/dashboard-trace.png) + +1. Explora la pestaña `Métricas` para ver las métricas de los proyectos `Api` y `MyWeatherHub`. + + ![Panel de control de .NET Aspire](./../../media/dashboard-metrics.png) + +## Crear un error + +1. Abre la pestaña `Estructurado` en el panel de control. +1. Establece el `Nivel` en `Error` y observa que no aparecen errores. +1. En el sitio web de `MyWeatherApp`, haz clic en varias ciudades diferentes para generar errores. Por lo general, 5 ciudades diferentes generarán un error. +1. Después de generar los errores, la pestaña `Estructurado` se actualizará automáticamente en el panel de control y observa que se muestran los errores. + + ![Panel de control de .NET Aspire](./../../media/dashboard-error.png) + +1. Haz clic en el `Rastro` o en los `Detalles` para ver el mensaje de error y la traza de la pila. + diff --git a/workshop/localisation/es/4-servicediscovery.md b/workshop/localisation/es/4-servicediscovery.md new file mode 100644 index 0000000..0de59fa --- /dev/null +++ b/workshop/localisation/es/4-servicediscovery.md @@ -0,0 +1,83 @@ +# Descubrimiento de servicios + +.NET Aspire incluye funcionalidad para configurar el descubrimiento de servicios durante el desarrollo y las pruebas. La funcionalidad de descubrimiento de servicios funciona proporcionando configuración en el formato esperado para resolver puntos finales basado en configuración del proyecto .NET Aspire AppHost a los proyectos de servicios individuales agregados al modelo de aplicación. + +## Configuración de descubrimiento de servicios + +Actualmente, `MyWeatherHub` utiliza una configuración estática para conectarse a `Api`. Esto no es ideal por varias razones, incluyendo: + +- El número de puerto del servicio `Api` puede cambiar. +- La dirección IP del servicio `Api` puede cambiar. +- Se necesitarían definir múltiples configuraciones para los ajustes de http y https. +- A medida que agregamos más servicios, la configuración se volvería más compleja. + +Para abordar estos problemas, utilizaremos la funcionalidad de descubrimiento de servicios proporcionada por el proyecto .NET Aspire AppHost. Esto permitirá que el servicio `MyWeatherHub` descubra el servicio `Api` en tiempo de ejecución. + +1. Abre el archivo `Program.cs` en el proyecto `AppHost`. +2. Anteriormente agregamos orquestación para incluir varios proyectos usando el método `builder.AddProject`. Esto devolvió un `IResourceBuild` que se puede usar para hacer referencia a los proyectos. Vamos a hacer referencia al proyecto `Api` en el proyecto `MyWeatherHub` actualizando el código: + + ```csharp + var api = builder.AddProject("api"); + + var web = builder.AddProject("myweatherhub") + .WithReference(api) + .WithExternalHttpEndpoints(); + ``` + +3. El método `WithReference` se utiliza para hacer referencia al proyecto `Api`. Esto permitirá que el proyecto `MyWeatherHub` descubra el proyecto `Api` en tiempo de ejecución. +4. Si más adelante decides desplegar esta aplicación, necesitarías la llamada a `WithExternalHttpEndpoints` para asegurarte de que sea público para el mundo exterior. + +## Habilitar el descubrimiento de servicios en MyWeatherHub + +Cuando agregamos ServiceDefaults a los proyectos, automáticamente los inscribimos en el sistema de descubrimiento de servicios. Esto significa que el proyecto `MyWeatherHub` ya está configurado para usar el descubrimiento de servicios. + +Algunos servicios exponen múltiples puntos finales con nombres. Los puntos finales con nombres se pueden resolver especificando el nombre del punto final en la parte del host de la URI de la solicitud HTTP, siguiendo el formato `scheme://_nombrePuntoFinal.nombreServicio`. Por ejemplo, si un servicio llamado "basket" expone un punto final llamado "dashboard", entonces la URI `scheme+http://_dashboard.basket` se puede utilizar para especificar este punto final, por ejemplo: + +```csharp +builder.Services.AddHttpClient( + static client => client.BaseAddress = new("https+http://basket")); + +builder.Services.AddHttpClient( + static client => client.BaseAddress = new("https+http://_dashboard.basket")); +``` + +En el ejemplo anterior, `BasketServiceClient` utilizará el punto final predeterminado del servicio `basket`, mientras que `BasketServiceDashboardClient` utilizará el punto final `dashboard` del servicio `basket`. Ahora, actualicemos el proyecto `MyWeatherHub` para que use el descubrimiento de servicios para conectarse al servicio `Api`. + +Esto se puede lograr actualizando la configuración existente de `WeatherEndpoint` en el archivo `appsettings.json`. Esto es conveniente cuando se habilita .NET Aspire en una aplicación implementada existente, ya que puedes seguir utilizando la configuración existente. + +1. Abre el archivo `appsettings.json` en el proyecto `MyWeatherHub`. +2. Actualiza la configuración de `WeatherEndpoint` para usar el descubrimiento de servicios: + + ```json + "WeatherEndpoint": "https+http://api" + ``` + +3. Ahora, la configuración de `WeatherEndpoint` utiliza el descubrimiento de servicios para conectarse al servicio `Api`. + +Opcionalmente, podemos actualizar la URL para no utilizar la configuración de `WeatherEndpoint`. + +1. Abre el archivo `Program.cs` en el proyecto `MyWeatherHub`. +2. Actualiza la configuración de `WeatherEndpoint` para usar el descubrimiento de servicios: + + ```csharp + builder.Services.AddHttpClient( + static client => client.BaseAddress = new("https+http://api")); + ``` + +## Ejecutar la aplicación + +1. Ejecuta la aplicación presionando `F5` o seleccionando la opción `Iniciar depuración`. +2. Abre la aplicación `MyWeatheApp` seleccionando el punto final en el panel de control. +3. Observa que la aplicación `MyWeatherHub` sigue funcionando y ahora utiliza el descubrimiento de servicios para conectarse al servicio `Api`. +4. En el panel de control, haz clic en `Detalles` para el proyecto `MyWeatherHub`. Esto mostrará todas las configuraciones que .NET Aspire configuró al ejecutar la aplicación desde App Host. +5. Haz clic en el icono del ojo para revelar los valores y desplázate hasta la parte inferior donde verás `services__api_http_0` y `services__api_https_0` configurados con los valores correctos del servicio `Api`. + + ![Configuración de descubrimiento de servicios en el panel de control](media/dashboard-servicediscovery.png) + +## Conclusión + +Esto es solo el comienzo de lo que podemos hacer con el descubrimiento de servicios y .NET Aspire. A medida que nuestra aplicación crece y agregamos más servicios, podemos seguir utilizando el descubrimiento de servicios para conectar servicios en tiempo de ejecución. Esto nos permitirá escalar fácilmente nuestra aplicación y hacerla más resistente a los cambios en el entorno. + +## Obtén más información + +Puedes obtener más información sobre el uso y la configuración avanzada del descubrimiento de servicios en la documentación de [.NET Aspire Service Discovery](https://learn.microsoft.com/dotnet/aspire/service-discovery/overview). diff --git a/workshop/localisation/es/5-components.md b/workshop/localisation/es/5-components.md new file mode 100644 index 0000000..1e1813e --- /dev/null +++ b/workshop/localisation/es/5-components.md @@ -0,0 +1,121 @@ +# Componentes .NET Aspire + +Los componentes .NET Aspire son un conjunto curado de paquetes NuGet seleccionados específicamente para facilitar la integración de aplicaciones nativas de la nube con servicios y plataformas destacados, incluidos, entre otros, Redis y PostgreSQL. Cada componente proporciona funcionalidades esenciales para aplicaciones nativas de la nube a través de la provisión automática o patrones de configuración estandarizados. Los componentes .NET Aspire se pueden usar sin un proyecto de host de aplicación (orquestador), pero están diseñados para funcionar mejor con el host de aplicaciones .NET Aspire. + +Los componentes .NET Aspire no deben confundirse con los paquetes de alojamiento .NET Aspire, ya que sirven para propósitos diferentes. Los paquetes de alojamiento se utilizan para modelar y configurar varios recursos en una aplicación .NET Aspire, mientras que los componentes se utilizan para mapear la configuración a varias bibliotecas de clientes. + +Existe una lista en constante crecimiento de [Componentes .NET Aspire](https://learn.microsoft.com/dotnet/aspire/fundamentals/components-overview?tabs=dotnet-cli#available-components) creados y distribuidos por Microsoft y la comunidad. .NET Aspire es flexible y cualquiera puede crear su propio componente para integrarse con sus propios servicios. + + +Mejoremos nuestra aplicación añadiendo un componente. Vamos a añadir un componente que nos ayudará a conectarnos a una caché de Redis para mejorar el rendimiento de nuestra API. + +## Añadir el Componente Redis al Host de la Aplicación + +Existen dos tipos de caché que podríamos integrar en nuestra aplicación, incluyendo: + +- **Caché de salida**: Un método de caché configurable y extensible para almacenar respuestas HTTP completas para futuras solicitudes. +- **Caché distribuido**: Una caché compartida por varios servidores de aplicaciones que permite cachear piezas específicas de datos. Una caché distribuida se mantiene típicamente como un servicio externo a los servidores de aplicaciones que acceden a ella y puede mejorar el rendimiento y la escalabilidad de una aplicación ASP.NET Core. + +Integraremos el componente de _Caché de salida_ en nuestro host de la aplicación. Este componente nos ayudará a cachear la respuesta de nuestra API en la caché de Redis. + +Para añadir el componente Redis a nuestro host de la aplicación, necesitamos instalar el paquete NuGet `Aspire.Hosting.Redis`. Este paquete proporciona los componentes necesarios para configurar el servicio en el Host de la Aplicación. Redis se proporciona a través de una imagen de contenedor en este taller, y cuando iniciamos el Host de la Aplicación .NET Aspire, automáticamente descargará la imagen del contenedor de Redis y empezará el servidor de Redis. + +Con el NuGet instalado, podemos configurarlo. + +1. Abre el archivo `Program.cs` en el proyecto `AppHost`. +1. Añade el siguiente código debajo de `var builder = DistributedApplication.CreateBuilder(args);` + + ```csharp + var cache = builder.AddRedis("cache") + ``` + Aquí, hemos configurado la caché de Redis con el nombre `cache`. Este nombre se utiliza para identificar la caché en `Api` o `MyWeatherHub`. +1. Actualiza el `api` en el Host de la Aplicación con una referencia a la caché. + + ```csharp + var api = builder.AddProject("api") + .WithReference(cache); + ``` + +1. Adicionalmente, podríamos configurar [Redis Commander](https://joeferner.github.io/redis-commander/), una herramienta de gestión para Redis. Como parte del paquete `Aspire.Hosting.Redis`, Redis Commander está disponible en el mismo componente. Para añadir Redis Commander, agrega el siguiente código debajo de la nueva configuración de Redis añadida. + + ```csharp + var cache = builder.AddRedis("cache") + .WithRedisCommander(); + ``` + +## Ejecutar la aplicación + +No hemos realizado cambios en los proyectos `Api` o `MyWeatherHub`, pero podemos ver el inicio de la caché de Redis cuando iniciamos el Host de la Aplicación. + +> [!IMPORTANTE] +> Dado que Redis se ejecuta en un contenedor, necesitarás asegurarte de que Docker esté funcionando en tu máquina. + +1. Inicia Docker Desktop o Podman. +1. Inicia el proyecto del Host de la Aplicación. +1. Verás tanto el contenedor de Redis como el contenedor de Redis Commander descargarse e iniciar tanto en el dashboard como en Docker Desktop. + + ![Redis ejecutándose en el dashboard y en el desktop](./media/redis-started.png) + +## Integrar Caché de Salida en la API + +1. Instala el paquete NuGet `Aspire.StackExchange.Redis.OutputCaching` en el proyecto `Api` para obtener acceso a las APIs de Redis. +1. Abre el archivo `Program.cs` en el proyecto `Api`. +1. Añade el siguiente código debajo de `var builder = WebApplication.CreateBuilder(args);` en la parte superior del archivo: + + ```csharp + var cache = builder.AddRedisOutputCache("cache"); + ``` + + > Ten en cuenta que estamos usando el nombre "cache" para referenciar la caché de Redis que configuramos en el Host de la Aplicación. +1. El `NwsManager` ya ha sido configurado para usar caché de salida, pero con una caché en memoria. Lo actualizaremos para usar la caché de Redis. Abre el archivo `NwsManager.cs` en la carpeta `Data`. +1. En la clase `NwsManagerExtensions` encontrarás un método `AddNwsManager`. +1. **ELIMINA** el siguiente código: + + ```csharp + // Añadir caché de salida predeterminada + services.AddOutputCache(options => + { + options.AddBasePolicy(builder => builder.Cache()); + }); + ``` + + Debido a que configuramos la aplicación para usar la caché de Redis en el archivo `Program.cs`, ya no necesitamos añadir la política de caché de salida predeterminada. + +## Ejecutar la aplicación +1. Inicia el proyecto Host de la Aplicación y abre el proyecto `MyWeatherHub` desde el dashboard. +1. Haz clic en una ciudad y luego haz clic de nuevo. Verás que la respuesta está cacheada y la segunda solicitud es mucho más rápida que la primera bajo la pestaña `Traces`. + + ![Caché de salida en acción](./media/output-caching.png) + +1. También puedes ver la respuesta cacheada en el Redis Commander. Abre el Redis Commander haciendo clic en el endpoint `Redis Commander` en el dashboard. Bajo estadísticas verás conexiones y comandos procesados. + + ![Redis Commander](./media/redis-commander.png) +1. Además, puedes ver los registros de la caché de Redis y del Redis Commander en la pestaña `Console`. + + ![Registros de Redis](./media/redis-logs.png) + +## Contenedores Redis Personalizados + +Los componentes de .NET Aspire son flexibles y personalizables. Por defecto, el componente Redis utiliza una imagen de contenedor de Redis de Docker Hub. Sin embargo, puedes usar tu propia imagen de contenedor de Redis proporcionando el nombre de la imagen y la etiqueta después del método `AddRedis`. Por ejemplo, si tienes una imagen de contenedor de Redis personalizada como [Garnet](https://github.com/microsoft/garnet), puedes proporcionar el nombre de la imagen y la etiqueta en el Host de la Aplicación de la siguiente manera: + +```csharp +var cache = builder.AddRedis("cache") + .WithImage("ghcr.io/microsoft/garnet") + .WithImageTag("latest") + .WithRedisCommander(); +``` + +1. Ejecuta la aplicación y ahora verás Garnet ejecutándose en el dashboard y en Docker Desktop. + + ![Garnet ejecutándose en el dashboard y en el desktop](./media/garnet-started.png) +1. También puedes ver los registros de Garnet en la pestaña `Consola`. + + ![Registros de Garnet](./media/garnet-logs.png) + + +## Resumen +En esta sección, añadimos un componente Redis al Host de la Aplicación e integramos la caché de salida en la API. Vimos cómo la respuesta fue cacheada en la caché de Redis y cómo la segunda solicitud fue mucho más rápida que la primera. También vimos cómo usar Redis Commander para gestionar la caché de Redis. + +Hay muchos más componentes disponibles que puedes usar para integrar con tus servicios. Puedes encontrar la lista de componentes disponibles [en la documentación de .NET Aspire](https://learn.microsoft.com/dotnet/aspire/fundamentals/components-overview?tabs=dotnet-cli#available-components). + +Un siguiente paso natural sería integrar una base de datos o aprovechar Azure Redis Cache como una solución alojada. Componentes para estos y más están disponibles en NuGet. \ No newline at end of file diff --git a/workshop/localisation/es/6-deployment.md b/workshop/localisation/es/6-deployment.md new file mode 100644 index 0000000..2a84b9d --- /dev/null +++ b/workshop/localisation/es/6-deployment.md @@ -0,0 +1,165 @@ +# Desplegar una aplicación .NET Aspire en Azure Container Apps + +Las aplicaciones .NET Aspire están diseñadas para ejecutarse en entornos contenerizados. Azure Container Apps es un entorno completamente administrado que te permite ejecutar microservicios y aplicaciones contenerizadas en una plataforma sin servidor. Este artículo te guiará a través de la creación de una nueva solución .NET Aspire y su despliegue en Microsoft Azure Container Apps usando Visual Studio y la CLI de Desarrollador de Azure (`azd`). + +En este ejemplo, asumiremos que estás desplegando la aplicación MyWeatherHub de las secciones anteriores. Puedes usar el código que has construido, o puedes usar el código en el directorio **complete**. Sin embargo, los pasos son los mismos para cualquier aplicación .NET Aspire. + +## Desplegar la aplicación con Visual Studio + +1. En el explorador de soluciones, haz clic derecho en el proyecto **AppHost** y selecciona **Publicar** para abrir el diálogo de **Publicación**. + + > [!CONSEJO] + > Publicar .NET Aspire requiere la versión actual de la CLI `azd`. Esto debería instalarse con la carga de trabajo de .NET Aspire, pero si recibes una notificación de que la CLI no está instalada o actualizada, puedes seguir las instrucciones en la siguiente parte de este tutorial para instalarla. + +1. Selecciona **Azure Container Apps para .NET Aspire** como el destino de publicación. + ![Una captura de pantalla del flujo de trabajo del diálogo de publicación.](media/vs-deploy.png) +1. En el paso **Ambiente de AzDev**, selecciona los valores de **Suscripción** y **Ubicación** deseados y luego ingresa un **Nombre del ambiente** como _aspire-weather_. El nombre del ambiente determina la nomenclatura de los recursos del ambiente de Azure Container Apps. +1. Selecciona **Finalizar** para crear el ambiente, luego **Cerrar** para salir del flujo de trabajo del diálogo y ver el resumen del ambiente de despliegue. +1. Selecciona **Publicar** para aprovisionar y desplegar los recursos en Azure. + + > [!CONSEJO] + > Este proceso puede tardar varios minutos en completarse. Visual Studio proporciona actualizaciones de estado sobre el progreso del despliegue en los registros de salida y puedes aprender mucho sobre cómo funciona la publicación observando estas actualizaciones. Verás que el proceso implica la creación de un grupo de recursos, un Registro de Contenedores de Azure, un espacio de trabajo de Log Analytics y un ambiente de Azure Container Apps. La aplicación es entonces desplegada en el ambiente de Azure Container Apps. + +1. Cuando la publicación se completa, Visual Studio muestra las URLs de los recursos en la parte inferior de la pantalla del ambiente. Usa estos enlaces para ver los diversos recursos desplegados. Selecciona la URL de **webfrontend** para abrir un navegador a la aplicación desplegada. + ![Una captura de pantalla del proceso de publicación completado y los recursos desplegados.](media/vs-publish-complete.png) + +## Instalar la CLI de Desarrollador de Azure + +El proceso para instalar `azd` varía según tu sistema operativo, pero está ampliamente disponible a través de `winget`, `brew`, `apt`, o directamente mediante `curl`. Para instalar `azd`, consulta [Instalar la CLI de Desarrollador de Azure](https://learn.microsoft.com/azure/developer/azure-developer-cli/install-azd). + +### Inicializar la plantilla + +1. Abre una nueva ventana de terminal y navega (`cd`) a la raíz de tu proyecto .NET Aspire. +1. Ejecuta el comando `azd init` para inicializar tu proyecto con `azd`, el cual inspeccionará la estructura de directorios local y determinará el tipo de aplicación. + + ```console + azd init + ``` + + Para más información sobre el comando `azd init`, consulta [azd init](https://learn.microsoft.com/azure/developer/azure-developer-cli/reference#azd-init). +1. Si esta es la primera vez que has inicializado la aplicación, `azd` te pedirá el nombre del entorno: + + ```console + Inicializando una aplicación para ejecutar en Azure (azd init) + + ? Ingresa un nuevo nombre de entorno: [? para ayuda] + ``` + + Ingresa el nombre de entorno deseado para continuar. Para más información sobre la gestión de entornos con `azd`, consulta [azd env](https://learn.microsoft.com/azure/developer/azure-developer-cli/reference#azd-env). +1. Selecciona **Usar código en el directorio actual** cuando `azd` te ofrezca dos opciones de inicialización de la aplicación. + + ```console + ? ¿Cómo deseas inicializar tu aplicación? [Usa las flechas para moverte, escribe para filtrar] + > Usar código en el directorio actual + Seleccionar una plantilla + ``` + +1. Después de escanear el directorio, `azd` te pide confirmar que ha encontrado el correcto proyecto _AppHost_ de .NET Aspire. Selecciona la opción **Confirmar y continuar con la inicialización de mi aplicación**. + + ```console + Servicios detectados: + + .NET (Aspire) + Detectado en: D:\source\repos\letslearn-dotnet-aspire\complete\AppHost\AppHost.csproj + + azd generará los archivos necesarios para alojar tu aplicación en Azure usando Azure Container Apps. + + ? Selecciona una opción [Usa las flechas para moverte, escribe para filtrar] + > Confirmar y continuar con la inicialización de mi aplicación + Cancelar y salir + ``` + +1. `azd` presenta cada uno de los proyectos en la solución .NET Aspire y te pide identificar cuál desplegar con ingreso HTTP abierto públicamente a todo el tráfico de internet. Selecciona solo `myweatherhub` (usando las teclas ↓ y Espacio), ya que quieres que la API sea privada al entorno de Azure Container Apps y _no_ esté disponible públicamente. + + ```console + ? Selecciona una opción Confirmar y continuar con la inicialización de mi aplicación + Por defecto, un servicio solo puede ser alcanzado desde dentro del entorno de Azure Container Apps en el que se está ejecutando. Seleccionar un servicio aquí también permitirá que sea alcanzado desde Internet. + ? Selecciona qué servicios exponer a Internet [Usa las flechas para moverte, espacio para seleccionar, para todos, para ninguno, escribe para filtrar] + [ ] apiservice + > [x] myweatherhub + ``` + +1. Finalmente, especifica el nombre del entorno, que se utiliza para nombrar los recursos provisionados en Azure y gestionar diferentes entornos como `dev` y `prod`. + + ```console + Generando archivos para ejecutar tu aplicación en Azure: + + (✓) Hecho: Generando ./azure.yaml + (✓) Hecho: Generando ./next-steps.md + + ÉXITO: ¡Tu aplicación está lista para la nube! + Puedes provisionar y desplegar tu aplicación en Azure ejecutando el comando azd up en este directorio. Para más información sobre cómo configurar tu aplicación, consulta ./next-steps.md + ``` + +`azd` genera varios archivos y los coloca en el directorio de trabajo. Estos archivos son: + +- _azure.yaml_: Describe los servicios de la aplicación, como el proyecto .NET Aspire AppHost, y los mapea a recursos de Azure. +- _.azure/config.json_: Archivo de configuración que informa a `azd` cuál es el entorno activo actual. +- _.azure/aspireazddev/.env_: Contiene sobreescrituras específicas del entorno. +- _.azure/aspireazddev/config.json_: Archivo de configuración que informa a `azd` qué servicios deben tener un punto final público en este entorno. + +[](https://learn.microsoft.com/dotnet/aspire/deployment/azure/aca-deployment?tabs=visual-studio%2Cinstall-az-windows%2Cpowershell&pivots=azure-azd#deploy-the-app) + +### Desplegar la aplicación + +Una vez que `azd` está inicializado, el proceso de aprovisionamiento y despliegue se puede ejecutar como un solo comando, [azd up](https://learn.microsoft.com/azure/developer/azure-developer-cli/reference#azd-up). + +```console +Por defecto, un servicio solo puede ser alcanzado desde dentro del entorno de Azure Container Apps en el que se está ejecutando. Seleccionar un servicio aquí también permitirá que sea alcanzado desde Internet. +? Selecciona qué servicios exponer a Internet webfrontend +? Selecciona una Suscripción de Azure para usar: 1. +? Selecciona una ubicación de Azure para usar: 1. + +Empaquetando servicios (azd package) + + +ÉXITO: Tu aplicación fue empaquetada para Azure en menos de un segundo. + +Aprovisionando recursos de Azure (azd provision) +Aprovisionar recursos de Azure puede tomar algún tiempo. + +Suscripción: +Ubicación: + + Puedes ver el progreso detallado en el Portal de Azure: + + + (✓) Hecho: Grupo de recursos: + (✓) Hecho: Registro de Contenedores: + (✓) Hecho: Espacio de trabajo de Log Analytics: + (✓) Hecho: Entorno de Apps de Contenedor: + (✓) Hecho: App de Contenedor: + +ÉXITO: Tu aplicación fue aprovisionada en Azure en 1 minuto 13 segundos. +Puedes ver los recursos creados bajo el grupo de recursos en el Portal de Azure: + + +Desplegando servicios (azd deploy) + + (✓) Hecho: Desplegando servicio apiservice + - Endpoint: .azurecontainerapps.io/ + + (✓) Hecho: Desplegando servicio webfrontend + - Endpoint: .azurecontainerapps.io/ + + +ÉXITO: Tu aplicación fue desplegada en Azure en 1 minuto 39 segundos. +Puedes ver los recursos creados bajo el grupo de recursos en el Portal de Azure: + + +ÉXITO: Tu flujo de trabajo de up para aprovisionar y desplegar en Azure se completó en 3 minutos 50 segundos. +``` + +Primero, los proyectos se empaquetarán en contenedores durante la fase de `azd package`, seguido por la fase de `azd provision` durante la cual se aprovisionan todos los recursos de Azure que la aplicación necesitará. + +Una vez que la `provision` esté completa, se llevará a cabo `azd deploy`. Durante esta fase, los proyectos se envían como contenedores a una instancia de Azure Container Registry, y luego se utilizan para crear nuevas revisiones de Azure Container Apps en las cuales se alojará el código. + +En este punto, la aplicación ha sido desplegada y configurada, y puedes abrir el portal de Azure y explorar los recursos. + +## Limpiar recursos + +Ejecuta el siguiente comando de Azure CLI para eliminar el grupo de recursos cuando ya no necesites los recursos de Azure que creaste. Eliminar el grupo de recursos también elimina los recursos contenidos dentro de él. + +```console +az group delete --name +``` diff --git a/workshop/localisation/es/AspireWorkshop.pptx b/workshop/localisation/es/AspireWorkshop.pptx new file mode 100644 index 0000000..aa6ec35 Binary files /dev/null and b/workshop/localisation/es/AspireWorkshop.pptx differ