Rozwój chmury obliczeniowej przyniósł ze sobą nowy model tworzenia aplikacji - tzw. architekturę bezserwerową (serverless). Pozwala on programistom skupić się na pisaniu kodu, a nie na zarządzaniu infrastrukturą serwerową. W świecie .NET najpopularniejszym rozwiązaniem serverless są Azure Functions, które umożliwiają uruchamianie kodu w chmurze na żądanie, automatyczne skalowanie oraz rozliczanie pay-as-you-go (płacisz tylko za czas działania funkcji). W tym artykule wyjaśnię, czym jest podejście serverless, jak działają Azure Functions w .NET oraz jak zacząć z nich korzystać jako początkujący programista.
Czym jest architektura bezserwerowa i Azure Functions?
Architektura bezserwerowa to model chmurowy, w którym dostawca (np. Microsoft Azure) dynamicznie zarządza całą infrastrukturą potrzebną do uruchamiania aplikacji. Wbrew nazwie serwery nadal istnieją, ale są one w pełni zarządzane przez dostawcę. Jako deweloper nie musisz martwić się konfiguracją, utrzymaniem ani skalowaniem serwerów. Aplikacja w modelu serverless dzieli się na małe, niezależne fragmenty - funkcje, które uruchamiają się tylko w reakcji na określone zdarzenia (np. wywołanie HTTP, dodanie pliku do magazynu czy wiadomość w kolejce). Gdy funkcja nie jest akurat wykonywana, nie zużywa żadnych zasobów, więc nie generuje kosztów.
Azure Functions to właśnie takie funkcje bezserwerowe oferowane na platformie Azure. Microsoft określa Azure Functions jako rozwiązanie bezserwerowe umożliwiające tworzenie niezawodnych aplikacji przy użyciu mniejszej ilości kodu, mniejszej infrastruktury i niższych kosztów. Zamiast zarządzać serwerami i środowiskiem wykonawczym, wgrywasz do chmury jedynie swój kod, a Azure automatycznie zapewnia zasoby do jego uruchomienia. Możesz skupić się wyłącznie na logice aplikacji napisanej w ulubionym języku (np. C#), a platforma dba o całą "otoczkę" techniczną.
Azure Functions działa w modelu FaaS (Functions as a Service) - Twój kod jest wykonywany przez platformę w odpowiedzi na zdarzenia. Każda funkcja jest wywoływana przez wyzwalacz (trigger), którym może być np. przychodzące żądanie HTTP, czasowy harmonogram (timer), nowy plik w Azure Blob Storage, wiadomość w kolejce Azure Queue itp. Dzięki gotowym wyzwalaczom i tzw. powiązaniom (bindings) Twoja funkcja może łatwo komunikować się z innymi usługami Azure bez pisania dodatkowej integracji, np. automatycznie odczytać dane z kolejki lub zapisać wynik do bazy danych. To sprawia, że Azure Functions świetnie nadaje się do budowy reaktywnych, zdarzeniowych systemów w chmurze.
Warto dodać, że choć skupiamy się na .NET, Azure Functions obsługuje wiele języków programowania. Funkcje można pisać nie tylko w C#, lecz także m.in. w JavaScript, Pythonie, Javie czy PowerShell. My oczywiście skoncentrujemy się na wykorzystaniu Azure Functions z perspektywy programisty C#/.NET.
Azure Functions w praktyce - pierwsza funkcja w C#
Praca z Azure Functions jest prosta i nie wymaga dużego nakładu konfiguracji. Możesz tworzyć i uruchamiać funkcje lokalnie, a następnie wdrożyć je do chmury Azure dosłownie w kilka minut. Dostępne są różne narzędzia, np. Visual Studio z gotowym szablonem projektu funkcji, Visual Studio Code z rozszerzeniem Azure Functions, czy też CLI (Azure Functions Core Tools).
Pokażę Ci teraz krótko, jak wygląda przykładowa funkcja HTTP napisana w C#. Załóżmy, że chcemy utworzyć prostą funkcję zwracającą powitanie. W Visual Studio wystarczy wybrać szablon Azure Functions (wyzwalacz HTTP), a następnie wpisać kod logiki. Przykładowa implementacja może wyglądać tak:
[FunctionName("HelloFunction")]
public static IActionResult Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req,
ILogger log)
{
log.LogInformation("Przetwarzanie żądania HTTP w funkcji.");
string name = req.Query["name"];
if (string.IsNullOrEmpty(name))
{
return new BadRequestObjectResult("Proszę podać parametr 'name'.");
}
return new OkObjectResult($"Witaj, {name}!");
}Powyższa funkcja HelloFunction uruchamia się, gdy nadejdzie żądanie HTTP (GET lub POST). Korzysta z atrybutu [HttpTrigger], który deklaruje typ wyzwalacza i autoryzację. Funkcja pobiera parametr name z zapytania i zwraca powitanie dla podanej nazwy lub komunikat o błędzie, jeśli nie podano parametru. Zwracany wynik (OkObjectResult) powoduje, że klient HTTP otrzyma odpowiedź 200 OK z naszym tekstem. Całość jest bardzo zwięzła. Nie piszemy żadnego kodu obsługi serwera webowego, nie konfigurujemy kontrolera MVC ani routingu. Wystarczy jedna funkcja z atrybutem, a platforma Azure zajmie się resztą.
Po napisaniu kodu możemy uruchomić funkcję lokalnie (np. klawiszem F5 w Visual Studio). Zostanie uruchomiony lokalny serwer funkcji, dzięki czemu przetestujemy nasze API na własnym komputerze. Gdy wszystko działa, jedno kliknięcie (lub komenda CLI) publikuje funkcję do chmury Azure. Platforma utworzy tzw. Function App (kontener dla naszych funkcji) i udostępni HTTP endpoint, z którego będzie można korzystać tak jak z normalnego API. To naprawdę proste podejście. Początkujący docenią, że pierwszą funkcję da się uruchomić w chmurze praktycznie od ręki, bez żmudnej konfiguracji serwera.
Zalety korzystania z Azure Functions (serverless w .NET)
Jakie korzyści daje podejście serverless przy użyciu Azure Functions? Oto najważniejsze zalety z perspektywy dewelopera .NET:
• Brak zarządzania infrastrukturą: Nie musisz konfigurować ani utrzymywać serwerów, maszyn wirtualnych czy kontenerów. Całą infrastrukturą (prowizjonowanie maszyn, aktualizacje, skalowanie itp.) zajmuje się dostawca chmury, a Ty możesz skupić się wyłącznie na kodzie. To upraszcza proces tworzenia aplikacji i eliminuje wiele zadań administracyjnych.
• Automatyczne skalowanie: Azure Functions automatycznie dostosowuje zasoby do obciążenia. Gdy wzrasta liczba wywołań Twojej funkcji, platforma uruchamia więcej instancji, aby obsłużyć ruch, a przy mniejszym ruchu skalowanie następuje w dół. Dzięki temu aplikacja jest skalowalna bez dodatkowych zabiegów. Nawet nagłe skoki obciążenia są płynnie obsługiwane. Nie musisz przewidywać ruchu ani ręcznie zwiększać mocy serwerów.
• Efektywność kosztowa (pay-as-you-go): W modelu bezserwerowym płacisz tylko za czas działania Twojego kodu i zużyte zasoby. Jeśli funkcja nie jest wywoływana, nie generuje kosztów. Taki model płatności za rzeczywiste użycie często oznacza duże oszczędności w porównaniu do ciągłego utrzymywania serwera działającego 24/7. Dla małych aplikacji lub nieregularnych zadań koszty mogą być zredukowane do ułamka wydatków tradycyjnego hostingu.
• Integracja z ekosystemem Azure: Azure Functions oferuje bogaty zestaw wyzwalaczy i powiązań integrujących się z innymi usługami Azure (Storage, Service Bus, Event Grid, SQL itp.). Możesz łatwo reagować na zdarzenia w tych usługach i korzystać z nich w swojej funkcji bez pisania dodatkowego "kleju" kodu. To przyspiesza budowanie kompleksowych rozwiązań opartych na chmurze. Ponadto funkcje świetnie współpracują z narzędziami .NET, np. możesz debugować je lokalnie w Visual Studio, a do monitorowania użyć Azure Application Insights.
Podsumowanie
Azure Functions to potężne, a zarazem proste w użyciu narzędzie umożliwiające tworzenie aplikacji w modelu serverless przy użyciu .NET. Dla początkujących programistów stanowi świetny sposób na pierwsze kroki w chmurze. Pozwala szybko zbudować działający fragment aplikacji (np. endpoint API, zadanie cron czy reakcję na zdarzenie) bez konieczności konfigurowania całej infrastruktury. Korzystając z Azure Functions zyskujemy automatyczne skalowanie, płatność tylko za realne wykorzystanie oraz gotową integrację z usługami Azure, co przekłada się na szybsze tempo tworzenia oprogramowania i mniej problemów operacyjnych.
Jeśli chcesz dalej rozwijać swoje umiejętności .NET i tworzenia nowoczesnych aplikacji (także chmurowych), rozważ dołączenie do jednego z moich kursów online. W ramach platformy szkoleniowej znajdziesz m.in. kurs Zostań Programistą .NET dla podstaw .NET, a także bardziej zaawansowane szkolenia (ASP.NET Core, Blazor, aplikacje SaaS, bezpieczeństwo, AI i inne). Pełną listę szkoleń wraz z opisami znajdziesz na mojej stronie - zapraszam do zapoznania się tutaj: modestprogrammer.pl/kursy.