Wraz z wydaniem .NET 9.0, Microsoft kontynuuje rozwój swojego potężnego ekosystemu do tworzenia aplikacji, oferując szereg innowacji, które zmieniają sposób, w jaki programiści podchodzą do tworzenia oprogramowania w chmurze, aplikacji internetowych czy integracji z nowoczesnymi technologiami, takimi jak sztuczna inteligencja i uczenie maszynowe. Wersja 9.0 skupia się na poprawie wydajności, uproszczeniu procesów oraz zwiększeniu bezpieczeństwa aplikacji, co czyni ją najlepszym wyborem zarówno dla dużych, jak i małych projektów.

Zwiększona integracja z chmurą i zoptymalizowana wydajność kontenerów sprawiają, że .NET 9.0 staje się kluczowym rozwiązaniem dla tworzenia aplikacji natywnych w chmurze. Zmiany obejmują także rozbudowę narzędzi i wsparcie dla mikroserwisów oraz aplikacji serverless. Jednak najbardziej interesującym wprowadzeniem jest Minimal API w ASP.NET Core 9, które znacząco uprościło tworzenie aplikacji HTTP, redukując zbędną złożoność i ilość kodu.

Minimalne API w ASP.NET Core

Minimal API w wersji 9.0 ASP.NET Core to nowa filozofia podejścia do tworzenia API, które oferują wyjątkową prostotę oraz niską złożoność. Projektowanie takich aplikacji w .NET 9.0 staje się bardziej przejrzyste i wymaga mniej konfiguracji, dzięki czemu idealnie nadają się one do budowy mikroserwisów czy niewielkich usług internetowych. Minimalne API eliminuje większość standardowego "boilerplate code", który zwykle towarzyszy tworzeniu nowego API w tradycyjny sposób.

Główne cechy Minimal API to przede wszystkim:

  • Prostota i zwięzłość: Minimal API pozwala na szybkie i łatwe rozpoczęcie nowego projektu API, co szczególnie przydaje się w przypadku małych serwisów i mikroserwisów.

  • Integracja z routingiem i middleware: Minimal API obsługują routing, co umożliwia pełną integrację z istniejącymi mechanizmami middleware w ekosystemie ASP.NET Core.

  • Wstrzykiwanie zależności: Dzięki wbudowanemu wsparciu dla dependency injection, serwisy mogą być bezpośrednio wstrzykiwane do handlerów tras, co upraszcza organizację kodu.

Korzyści płynące z używania Minimal API obejmują:

  • Zredukowaną złożoność: Wymaga mniej konfiguracji, co oznacza prostszy rozwój i utrzymanie mniejszych aplikacji.

  • Poprawioną wydajność: Minimalne API jest zoptymalizowane pod kątem mniejszego zużycia pamięci i szybszego uruchamiania aplikacji, co jest szczególnie korzystne przy pracy z mikroserwisami.

  • Elastyczność i testowalność: Uproszczona struktura kodu pozwala na łatwiejsze przeprowadzanie testów jednostkowych oraz wprowadza większą elastyczność w rozwoju aplikacji.

Nowe możliwości w Blazorze i WebAssembly

W .NET 9.0 Blazor, framework do tworzenia interaktywnych aplikacji webowych za pomocą C#, przeszedł znaczące zmiany, które umożliwiają jeszcze szybsze i bardziej efektywne budowanie aplikacji klienta w przeglądarkach. Dzięki wsparciu dla WebAssembly, Blazor umożliwia uruchamianie kodu C# w przeglądarkach bez potrzeby wtyczek, co czyni go idealnym rozwiązaniem dla nowoczesnych aplikacji internetowych, które wymagają szybkiej i responsywnej interakcji z użytkownikiem.

Zmiany w Blazorze obejmują poprawę wydajności, co pozwala na lepsze działanie aplikacji Blazor WebAssembly, czyniąc je bardziej konkurencyjnymi w stosunku do tradycyjnych aplikacji JavaScript. Rozwój Blazora otwiera także nowe możliwości dla programistów C#, którzy mogą teraz tworzyć pełnoprawne aplikacje front-endowe, nie przechodząc na JavaScript.

Rozwój w dziedzinie sztucznej inteligencji i uczenia maszynowego

Z kolei w kontekście sztucznej inteligencji, .NET 9.0 stawia na silniejsze wsparcie dla integracji z biblioteką ML.NET. Dzięki nowym funkcjom i ulepszeniom, integracja uczenia maszynowego staje się łatwiejsza, a programiści mogą zyskać dostęp do bardziej zaawansowanych algorytmów, które będą wspierały tworzenie rozwiązań wykorzystujących dane w sposób bardziej inteligentny. .NET 9.0 umożliwia łatwiejsze tworzenie aplikacji opartych na danych i na sztucznej inteligencji, co jest niezbędnym elementem współczesnych aplikacji, które muszą działać na dynamicznych i złożonych zbiorach danych.

Zwiększone bezpieczeństwo i zgodność

Bezpieczeństwo to zawsze kluczowy aspekt w budowaniu oprogramowania, a .NET 9.0 stawia na jego poprawę na każdym etapie. Wzmacniając mechanizmy zabezpieczeń i dodając nowe funkcje zgodności, .NET 9.0 zapewnia, że aplikacje będą bardziej odporne na ataki i będą spełniały najwyższe standardy branżowe. Nowe funkcje bezpieczeństwa obejmują między innymi ulepszoną ochronę przed atakami typu SQL injection czy lepsze zarządzanie certyfikatami SSL w aplikacjach webowych. W tej wersji szczególny nacisk położono na kompatybilność z regulacjami dotyczącymi ochrony danych, takimi jak RODO.

Optymalizacja doświadczenia dewelopera

Jednym z kluczowych celów Microsoftu było również poprawienie doświadczeń programistów. Nowości w Visual Studio i Visual Studio Code pozwalają na bardziej płynne i efektywne tworzenie aplikacji w .NET 9.0. Rozbudowane narzędzia diagnostyczne, udoskonalone środowisko debugowania i integracja z chmurą zapewniają lepsze wsparcie dla programistów. Dzięki tym udoskonaleniom, proces tworzenia aplikacji w .NET 9.0 jest bardziej intuicyjny i szybki.

Warto również zauważyć, że nowa wersja .NET przynosi istotne zmiany w zakresie integracji z narzędziami CI/CD, co ułatwia wdrażanie i automatyzację procesów związanych z budową i testowaniem aplikacji. Dzięki nowym funkcjom, programiści mogą skupić się bardziej na kodzie, a mniej na konfiguracji i utrzymaniu infrastruktury.

Wszystkie te zmiany, od uproszczenia pracy z Minimal API, przez rozwój Blazora, po ulepszenia w zakresie sztucznej inteligencji i bezpieczeństwa, sprawiają, że .NET 9.0 jest jedną z najbardziej wszechstronnych i nowoczesnych platform do tworzenia aplikacji. Przyszłość programowania w .NET zapowiada się bardzo obiecująco, zwłaszcza dla tych, którzy pragną tworzyć aplikacje chmurowe, szybkie mikroserwisy oraz rozwiązania oparte na danych i AI.

Jak wdrożyć i monitorować stan zdrowia aplikacji ASP.NET Core 9.0 Minimal API za pomocą niestandardowych kontroli zdrowia?

Tworzenie i wdrażanie aplikacji w architekturze mikroserwisów wiąże się z koniecznością zapewnienia wysokiej dostępności oraz monitorowania stanu zdrowia poszczególnych komponentów. Jednym z podstawowych elementów, które pozwalają na bieżąco kontrolować status usług, są tzw. health checks – kontrole stanu zdrowia. W tej części omówimy, jak zaimplementować niestandardową kontrolę stanu zdrowia w aplikacji ASP.NET Core 9.0 Minimal API oraz jak ją zarejestrować i testować.

Pierwszym krokiem w implementacji jest stworzenie nowej klasy, która będzie implementować interfejs IHealthCheck. Klasa ta będzie odpowiedzialna za wykonywanie zapytania HTTP do zewnętrznej witryny, a jeśli odpowiedź będzie pomyślna, zwróci wynik zdrowia pozytywny (Healthy), w przeciwnym razie oznaczy usługę jako niezdrową (Unhealthy). Oto przykład implementacji takiej klasy:

csharp
using Microsoft.Extensions.Diagnostics.HealthChecks; using System.Net.Http; using System.Threading; using System.Threading.Tasks;
public class ExternalEndpointHealthCheck : IHealthCheck
{
private readonly string _externalUrl; public ExternalEndpointHealthCheck(string externalUrl) { _externalUrl = externalUrl; }
public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken)
{
using (var httpClient = new HttpClient()) { try { var response = await httpClient.GetAsync(_externalUrl, cancellationToken); if (response.IsSuccessStatusCode) { return HealthCheckResult.Healthy($"The check for {_externalUrl} is healthy."); } return HealthCheckResult.Unhealthy($"The check for {_externalUrl} failed."); } catch { return HealthCheckResult.Unhealthy($"The check for {_externalUrl} failed."); } } } }

W tej implementacji, jeśli zapytanie HTTP do wskazanej zewnętrznej witryny zwróci kod statusu HTTP wskazujący na sukces, wynik zdrowia będzie pozytywny. W przeciwnym przypadku, system uzna, że zewnętrzna usługa jest niedostępna.

Po stworzeniu klasy, konieczne jest jej zarejestrowanie w kontenerze zależności w pliku Program.cs lub Startup.cs:

csharp
var builder = WebApplication.CreateBuilder(args); builder.Services.AddHealthChecks() .AddCheck("ExternalEndpointHealthCheck", sp => new ExternalEndpointHealthCheck("https://www.google.com"), new[] { "external_endpoint" }); var app = builder.Build(); app.MapHealthChecks("/health");

Powyższy kod rejestruje naszą niestandardową kontrolę zdrowia w kontenerze usług, wskazując zewnętrzną witrynę do monitorowania (w tym przypadku "https://www.google.com"). Następnie, za pomocą metody MapHealthChecks, możemy utworzyć punkt końcowy /health, który zwróci stan zdrowia aplikacji, w tym status monitorowanej witryny.

Po skonfigurowaniu zdrowia aplikacji, wystarczy uruchomić aplikację i przejść do endpointu /health. Zostanie wyświetlony stan zdrowia, uwzględniający zarówno status samej aplikacji, jak i zewnętrznych usług, na które aplikacja jest zależna.

Jednakże, podczas projektowania i wdrażania kontroli zdrowia w większych aplikacjach lub w architekturze mikroserwisów, warto rozważyć kilka dodatkowych aspektów, które mogą znacznie poprawić skuteczność monitorowania:

  1. Zarządzanie zależnościami między serwisami: Aplikacja często korzysta z zewnętrznych usług (np. baz danych, serwisów HTTP, kolejki komunikatów). Monitorowanie tych zależności jest niezbędne, aby w porę wykryć ewentualne problemy i zapobiec awariom systemu.

  2. Złożoność aplikacji: W przypadku dużych aplikacji lub systemów, które składają się z wielu usług, warto wdrożyć bardziej zaawansowane mechanizmy monitorowania, takie jak tzw. circuit breakers (przełączniki obwodów) lub inne techniki pozwalające na zarządzanie błędami oraz automatyczne przełączanie na alternatywne usługi w razie problemów z głównym punktem końcowym.

  3. Bezpieczeństwo: Kontrole zdrowia nie powinny ujawniać wrażliwych informacji o systemie, dlatego warto rozważyć zastosowanie odpowiednich mechanizmów autoryzacji i uwierzytelniania dla punktów końcowych takich jak /health. W przeciwnym razie, złośliwi użytkownicy mogą próbować wykorzystać te dane do ataków na aplikację.

  4. Alertowanie i reakcja na problemy: Zaimplementowanie mechanizmów powiadamiania administratorów o problemach (np. za pomocą e-maili lub integracji z systemami monitorowania jak Prometheus) pozwala na szybkie reagowanie w przypadku, gdy któryś z serwisów stanie się niedostępny. Może to zapobiec eskalacji problemów i minimalizować czas przestoju.

  5. Testowanie i weryfikacja: Ostateczne testowanie zdrowia aplikacji i usług powinno obejmować zarówno testy jednostkowe, jak i testy integracyjne. Należy upewnić się, że punkt końcowy /health rzeczywiście działa prawidłowo w różnych scenariuszach, w tym w przypadku awarii zewnętrznych usług.

Powyższa procedura wdrożenia oraz monitorowania stanu zdrowia aplikacji za pomocą niestandardowej kontroli zdrowia pozwala na utrzymanie wysokiej dostępności i szybką reakcję na problemy z zależnymi serwisami. W mikroserwisowej architekturze takie podejście może okazać się kluczowe dla utrzymania sprawności całego systemu.