Paweł Łukasiewicz
2019-02-04
Paweł Łukasiewicz
2019-02-04
Wprowadzenie
W tym artykule skupimy się na serwerze jakim jest Kestrel. Odpowiemy na pytania związane z jego działaniem, omówimy korzyści płynące z jego użycia i wiele, wiele więcej.
Kestrel jest serwerem używanym do hostowania aplikacji ASP.NET Core na dowolnej platformie. Kod źródłowy jest upubliczniony i dostępny na platformie GitHub pod adresem: https://github.com/aspnet/KestrelHttpServer. Jest to sterowany zdarzeniami (event-driven), asynchroniczny serwer oparty na operacjach typu I/O (operacje wejścia/wyjścia)
Został uruchomiony przez Microsoft wraz z pojawieniem się ASP.NET Core. Wszystkie aplikacje ASP.NET Core wykorzystują nowe środowisko MVC i serwer www Kestrel. Technologia ASP.NET jest używana w przypadku około 15% wszystkich witryn internetowych dostępnych w sieci, które wykorzystują języki programowania do działania po stronie serwera. Niezwykle ważne jest zatem zrozumienie jak działa Kestrel i jakie korzyści może nam zaoferować. Na te pytania postaram się odpowiedzieć w powyższym artykule.
Serwer WWW Kestrel
Kestrel jest wskazywany jako preferowany serwer WWW dla najnowszych aplikacji ASP.NET. Oparty jest na bibliotece libuv - tej samej, która jest używana przez Node.js. Biblioteka libuv wspiera styl programowania w którym kładzie się nacisk na pisanie programów z perspektywy przekazywania sterowania między poszczególnymi modułami tej samej aplikacji. Co jest niezwykle istotne w tym podejściu? Aplikacja cały czas dostaje nowe zdarzenia (events), na które musi odpowiadać. W takim podejściu zakłada się, że przepływ sterowania w programie jest niemożliwy do przewidzenia z góry (event-driving programming).
Aplikacje ASP.NET Core mogą być w prosty sposób uruchamiane na innych wieloplatformowych serwerach sieciowych takich jak Nginx czy Apache - nie jest wymagana konieczność adresowania różnych konfiguracji startowych. Dzięki używaniu Kestrel’a jako sewera in-process (program wykonywalny, który działa jako usługa dla innego programu – a nie samodzielnie) aplikacje wieloplatformowe będą miały zachowany spójny proces konfiguracyjny. Mówimy tutaj o metodach startowych:
-
Startup.Main()
-
Startup.ConfigureServices()
-
Startup.Configure();
Jak działa Kestrel?
Aplikacje przeważnie pisane są w sposób pozwalający na odpowiedź związaną z interakcją użytkownika. W przypadku programu sterowanego zdarzeniami istnieje, swojego rodzaju, pętla, która nasłuchuje zdarzeń. Następstwem tego działania jest uruchomienie funkcji zwrotnej, tzw. function callback.
Kestrel implementuje pętle zdarzeń i powiadomienia oparte na wywołaniach zwrotnych wejścia-wyjścia. Libuv zarządza gromadzeniem i monitrowaniem zdarzeń z systemu operacyjnego. Co więcej, użytkownik może rejestrować wywołania zwrotne w momencie wystąpienia zdarzenia. Kestrel używa biblioteki libuv do wykonywania operacji I/O oraz obsługuje uruchamianie wielu pętli zdarzeń.
Lekka implementacja serwera Kestrel nie pozwala na wykonywanie niektórych operacji. Zaliczamy do nich m.in. kompresję GZip czy przepisywanie adresów URL (URL rewrites). Aby dokonać tego typu operacji należy skorzystać z odpowiedniego oprogramowania pośredniego (middleware). Warto jednak mieć na uwadzę, że tak lekka konstrukcja może okazać się zdecydowania szybsza niż konkurencyjne serwery. Taki też był zamiar implementacji serwera Kestrel - w rzeczywistości jest sześciokrotnie szybszy w przeprowadzaniu operacji statycznych i przetwarzania tekstu niż node.js.
Kestrel: główne korzyści
Kestrel obsługuje wszystkie platformy i wersje obsługiwane przez platformę .NET Core. Ponadto, jest częscią nowych szablonów aplikacji ASP.NET Core pozwalając na lepszą wydajność przy przetwarzaniu żądań. Każdy nowo utworzony projekt w Visual Studio jest automatycznie skonfigurowany do działania na serwerze Kestrel.
Tak jak już wcześniej wspomniałem, nie jest to w pełni funkcjonalny serwer WWW - jego budowa jest jednak zaletą zapewniającą szybkosć działania – jest ona niezwykle ważna w przypadku tworzenia aplikacji opartych o technologię ASP.NET Core.
Nic oczywiście nie stoi na przeszkodzie przed uruchomieniem go za w pełni funkcjonalnym serwerem internetowym takim jak IIS czy Nginx. Może zostać uruchomiony na platformie IIS przy użyciu HttpPlatformHandler. Kestrel jednak pozwala na uruchamianie projektów ASP.NET Core na dowolnej, obsługiwanej platformie dlatego jest tak częstym wyborem:
Taka architektura to tzw. serwer pośredniczący (reverse proxy). Jej zastsowanie ma szereg zalet do których możemy zaliczyć:
- cachowanie statycznych zasobów;
- load balancing;
- zarządzanie ceryfikatem HTTP/SSL w jednym miejscu a wewnątrz samej sieci można używać protokołów HTTP/HTTP2, które pozbawione są zabezpieczeń – dzięki temu są zdecydowanie szybsze.
Kolejną zaletą, nawet jeżeli nie przygotowujesz aplikacji wieloplatformowej, jest możliwość uruchomienia projektu ASP.NET Core na serwerze WWW bezpośrednio z linii poleceń.
Podsumowanie
Artykuł miał na celu przybliżenie pojęć związanych z serwerem Kestrel, pokazanie korzyści płynących z jego użycia a jednoczeście ograniczeń wynikających z jego lekkiej implementacji. Niebywałą zaletą tego serwera jest możliwość hostowania aplikacji .NET Core na różnych środowiskach w tym Linux czy Mac. Serwer ten nie ma jednak jeszcze statusu mature product - jest rozwijany tak jak cała platforma .NET Core. Dopiero niedawno (z perspektywy dnia opublikowania artykułu) została dodana funkcjonalność rate-limiting, która pozwala zwiększyć bezpieczeństwo związane z atakami typu DDoS.