.NET Aspire
Indledning
I denne artikel vil jeg gå i dybden med .NET Aspire og hvad aspire's nøglefunktioner kan tilbyde vores projekt. Herudover vil jeg også beskrive hvilke læringsaktiveter jeg vil gennemføre for at lærer om Aspire.
Læringsaktiviteter
-
Videoserie fra Microsoft: Welcome to .NET Aspire! (opens in a new tab)
-
Video tutorial fra James Montemagno på YouTube: Build Better Apps with .NET Aspire - Complete Beginner's Guide & Tutorial (opens in a new tab)
Introduktion til .NET Aspire
.NET Aspire er Microsofts nye framework, som gør det muligt at bygge cloud-native applikationer. Tænk på det som en værktøjskasse, der hjælper med at sætte microservices og distribuerede applikationer op.
Microsoft lancerede .NET Aspire i slutningen af 2023 for at løse problemet, at det er blevet for komplekst at bygge cloud-applikationer. Flere udviklere er udfordrede med at håndtere forskellige services, overvågning og opsætning af udviklingsmiljøer.
Arkitektur og Design
.NET Aspire er bygget som en tilføjelse til .NET, der giver en masse praktiske funktioner. Det smarte er, at det fungerer som byggeklodser, man kan bruge præcis de dele, man har brug for. Byggeklodserne består bl.a. af:
- Orchestrator: Som styrer hvordan forskellige services kører
- Dashboard: Som giver et godt overblik over applikationen, om tjenesterne er online og hvilken port og adresse de har.
- Components: Som er færdige integrationer til ting som databaser og caching
Det er lidt ligesom at have en erfaren udvikler ved sin side, der hjælper med at sætte det rigtigt sammen fra starten af.
Installation og Opsætning
Jeg vil kort gennemgå hvordan man starter en Aspire applikation op.
Sådan kommer man i gang
Fra CLI kan man skrive nedenstående kommando og dette vil skabe en Aspire starter applikation. I dette tilfælde kalder vi den for "MinApp".
dotnet new install Aspire.ProjectTemplates
dotnet new aspire-starter --name MinApp
Basis projektstruktur
Nedenstående viser hvordan filstrukturen ser ud fra starten af.
MinApp/
├── MinApp.ApiService/
├── MinApp.Web/
└── MinApp.AppHost/
Kodeeksempel - tilføj en service
I programklassen kan man tilføje services, nedenstående er et eksempel på hvordan redis caching er opsat.
var builder = WebApplication.CreateBuilder(args);
builder.AddServiceDefaults();
builder.AddRedis("cache");
Database Integration
Herunder har jeg skrevet et kode eksempel på hvordan man kan integrere databaser til sin Aspire applikation.
// Tilføj SQL Server
builder.AddSqlServer("katalog");
// Tilføj MongoDB
builder.AddMongoDb("dokumenter");
Funktioner og Fordele
Overordnet er det en fornøjelse at der kommer så meget boilerplate kode med fra starten af når man benytter Aspire Starter skabelonen.
Dashboardet er en kæmpe fordel, sammenlignet med sidste semester hvor vi skulle jonglere med systemerne uden dette overblik.
Monitorering
Dashboardet som medfølger i et .NET Aspire projekt giver os overblikket over både hvorvidt vores tjenester er online, men også hvilke URL og port de er på.
Ude til venstre er der endnu flere muligheder: Console, Structured, Traces og Metrics. Console giver os mulighed for at se konsol outputtet fra hver service. Hvis nu en fejl opstår på en enkelt tjeneste kan vi læse om den fejl der. Dropdown menuen på nedenstående billed giver os mulighed for at bladre imellem vores tjenester.
Structured giver os mulighed for at se en log over samtlige tjenester i samme vindue. Dette er unikt og en kæmpe fordel for udviklere, når vi arbejder med flere tjenester som kommunikere på tværs. Det kan hjælpe os med at se om kommunikationen går flydende igennem systemet når det modtager forespørgsler.
Traces viser når forespørgsler på tværs af vores tjenester i Aspire applikationen. Så hvis en GET request eksempelvis skal både bede om navnet på en person fra en SQL database, samt et billed fra en tjeneste den person - Så vil vi kunne se under traces hvilke tjenester som bliver spurgt om information på baggrund den pågældende request. Hvis der skulle opstå en fejl på baggrund af denne request er det væsentligt at vide om der kommer fejl fra begge tjenester eller kun den ene i forhold til at fejlsøge. Traces viser også meget præcise timestamps og sætter det hele i rækkefølge eftersom beskederne kommer.
Hvis vi leder efter noget bestemt i mængden af information, så kan man filtrere informationerne og finde lige præcis det man leder efter. Det er vist på billedet nedenfor.
Traces kan også vise os den præcise tid det tog at gennemføre en bestemt request i hver tjeneste så vi kan meget nøjagtigt så hvor opstår en flaskehals. Når vi bruger internettet vil vi gerne have at alting går så hurtigt som muligt, så hastighed er en konkurrenceparameter for mange e commerce forhandlere. Derfor er det en kæmpe fordel at det er blevet så nemt med Aspire at dykke ned i hvordan man kan optimere.
Informationerne omkring hvor flaskehalsen opstår kan også hjælpe os med at revurdere vores skaleringsstrategi for applikationen.
Metrics er den sidste af de fem menupunkter for Aspire. Den giver en bedre visuel repræsentation af hvordan applikationen klarer opgaverne i realtid.
Nedenfor er et billed hvor http.client.request.duration
er valgt. Det betyder at hver gang den metode bliver brugt, så viser grafen hvor lang tid det tager. Forudsætning for at vi ser noget på grafen er at filtrene ude til højre er opfyldt, så den viser nu både GET og POST requests. Men det giver et overblik i realtid over om hvor meget trafikken belaster hastigheden på systemet.
Reflektion
Da vi startede på dette semester og havde besluttet at vi ville forsøge at distribuere dette system med microservices, så var jeg meget overvældet. At et IT system kan fungere som en enhed, men på tværs af maskiner og netværk er ret fascinerende i sig selv.
Problemstillingerne fyldte meget i mit hoved: Hvordan debugger vi på tværs?, Hvordan holder vi styr på kald mellem vores services? og hvordan kan vi holde overblikket?
Jeg havde kort læst om at der ville komme en nemmere løsning til at lave cloud applikationer med .NET i .NET 9 - Så semestret her virkede som en perfekt mulighed for at udforske det.
Hvis man spørger chatGPT efter hvordan man kan bygge en Microservice applikation uden .NET Aspire applikation med de samme muligheder som Aspire tilbyder i forhold til overvågning og logging så kan man benytte nogle af følgende:
1. Logging
- Serilog: A diagnostic logging library for .NET applications.
- NLog: Another popular logging library for .NET.
- ELK Stack: Elasticsearch, Logstash, and Kibana for centralized logging and visualization.
2. Tracing
- Jaeger: An open-source, end-to-end distributed tracing tool.
- Zipkin: Another distributed tracing system.
3. Metrics
- Prometheus: An open-source monitoring and alerting toolkit.
- Grafana: A powerful visualization tool that integrates well with Prometheus.
4. Health Checks
- Consul: A service mesh solution providing service discovery, configuration, and segmentation.
5. Service Mesh
- Istio: An open-source service mesh that provides a way to control how microservices share data with one another.
- Linkerd: Another service mesh for Kubernetes.
6. Container Orchestration
- Kubernetes: An open-source system for automating the deployment, scaling, and management of containerized applications.
- Docker Swarm: Native clustering and orchestration for Docker.
Så jeg er meget tilfreds med den pakke som .NET Aspire tilbyder.