Aby stworzyć swoją aplikację webową, wystarczy już znać jej rozwój. Ważnym aspektem jest konfiguracja narzędzi do wdrażania aplikacji, monitorowania i zarządzania oraz administracji środowiskiem, w którym działa. Era ręcznego wdrażania odchodzi w zapomnienie, nawet dla małych projektów narzędzia automatyzacji mogą przynieść znaczące korzyści. Przy ręcznym wdrażaniu często zapominamy przenieść coś, uwzględnić jakiś szczegół, uruchomić zapomniany test – lista ta może być długa.
Ten artykuł może pomóc tym, którzy dopiero poznają podstawy tworzenia aplikacji webowych i chcą nieco zrozumieć podstawowe pojęcia i konwencje.
Budowanie aplikacji można podzielić na 2 części: wszystkie aspekty związane z kodem aplikacji oraz te związane ze środowiskiem, w którym ten kod się wykonuje. Kod aplikacji dzieli się z kolei na serwerowy (wykonywany na serwerze, często: logika biznesowa, autoryzacja, przechowywanie danych itp.) i kliencki (wykonywany na maszynie użytkownika: często interfejs i związana z nim logika).
Zacznijmy od środowiska.
Podstawą działania każdego kodu, systemu, oprogramowania jest system operacyjny, dlatego poniżej omówimy najpopularniejsze systemy obecne na rynku hostingowym i przedstawimy ich krótką charakterystykę:
Windows Server – to ta sama Windows, ale w wersji serwerowej. Niektóre funkcje dostępne w wersji klienta (zwykłej) są tutaj niedostępne, na przykład niektóre usługi zbierania statystyk i podobne oprogramowanie, jednak dostępny jest zestaw narzędzi do administracji siecią, podstawowe oprogramowanie do wdrażania serwerów (web, ftp, …). Ogólnie rzecz biorąc, Windows Server wygląda jak zwykła Windows, działa jak zwykła Windows, ale kosztuje 2 razy więcej niż jej zwykły odpowiednik. Jednak biorąc pod uwagę, że wdrażanie aplikacji będziesz najprawdopodobniej robić na serwerze dedykowanym/wirtualnym, ostateczny koszt dla Ciebie może wzrosnąć, ale nie jest to krytyczne. Platforma Windows zajmuje dominującą pozycję na rynku systemów operacyjnych dla użytkowników, więc jej wersja serwerowa będzie najbardziej znajoma dla większości użytkowników.
Unix-podobna systema. Tradycyjna praca w tych systemach nie przewiduje obecności tradycyjnego interfejsu graficznego, oferując użytkownikowi jedynie konsolę jako element sterujący. Dla niedoświadczonego użytkownika praca w takim formacie może stanowić trudność, co tylko wartym uwagi jest wyjście z dość popularnego w tych edytorze tekstowym. Vim, pytanie związane z tym w ciągu 6 lat zdobyło już ponad 1,8 mln wyświetleń. Głównymi dystrybucjami (edycjami) tej rodziny są: Debian — popularna dystrybucja, wersje pakietów w niej są głównie ukierunkowane na LTS (Long Term Support – wsparcie przez długi czas), co przejawia się w całkiem dużej niezawodności i stabilności systemu oraz pakietów; Ubuntu – zawiera dystrybucje wszystkich pakietów w ich najnowszych wersjach, co może wpływać na stabilność, jednak pozwala korzystać z funkcjonalności dostarczanych z nowymi wersjami; Red Hat Enterprise Linux – system operacyjny, pozycjonowany do użytku komercyjnego, jest płatny, jednak zawiera wsparcie ze strony dostawców oprogramowania, niektóre własnościowe pakiety i pakiety sterowników; CentOS – opensource wariacja Red Hat Enterprise Linux, różni się brakiem własnościowych pakietów oraz wsparcia.
Dla tych, którzy dopiero odkrywają tę dziedzinę, moją rekomendacją będą systemy Windows Server, albo Ubuntu. Jeśli rozważać Windows, to przede wszystkim znajomość systemu, Ubuntu – większa tolerancja na aktualizacje, i z drugiej strony, na przykład, mniej problemów przy uruchamianiu projektów na technologiach wymagających nowych wersji.
A więc, ustalając system operacyjny, przejdźmy do zestawu narzędzi, które pozwolą na wdrażanie (instalowanie), aktualizowanie i monitorowanie stanu aplikacji lub jej części na serwerze.
Następnym ważnym rozwiązaniem będzie – umiejscowienie twojej aplikacji oraz serwera dla niej. Na chwilę obecną, najbardziej powszechne są 3 drogi:
- Hostować (trzymać) serwer u siebie, samodzielnie — najtańsza opcja, ale trzeba zamówić u dostawcy statyczny IP, aby twój zasób nie zmieniał swojego adresu w czasie.
- Wynająć Serwer Dedykowany (VDS) – i samodzielnie zajmować się jego administracją oraz skalowaniem obciążeń.
- Opłacić (często oferują również bezpłatny okres próbny) subskrypcję na którejś z platform chmurowych, gdzie powszechna jest model płatności za wykorzystane zasoby. Najbardziej znane reprezentatywne usługi w tym zakresie to: Amazon AWS (oferują bezpłatny rok korzystania z usług, ale z limitem miesięcznym), Google Cloud (oferują 300$ na koncie, które można wykorzystać przez rok na usługi chmurowe hostingu), Yandex.Cloud (oferują 4000 rubli na 2 miesiące), Microsoft Azure (oferują bezpłatny dostęp do popularnych usług na rok, + 12 500 rubli na dowolne usługi przez jeden miesiąc). Dzięki temu można wypróbować któregokolwiek z tych dostawców, nie wydając ani grosza, a jednocześnie zyskując przybliżone zdanie o jakości i poziomie świadczonych usług.
W zależności od wybranej drogi, później zmieni się jedynie fakt, na kim, w większości, spoczywa odpowiedzialność za daną dziedzinę administracji. Jeśli hostujesz samodzielnie, musisz rozumieć, że wszelkie przerwy w dostawie prądu, internetu, samego serwera, oprogramowania, które na nim zainstalowano – to wszystko jest całkowicie na Twoich barkach. Jednakże, do nauki i testowania, to więcej niż wystarczająco.
Jeśli jednak nie masz dodatkowego komputera, który mógłby pełnić rolę serwera, będziesz chciał skorzystać z drugiej lub trzeciej drogi. Drugi przypadek jest identyczny z pierwszym, z tą różnicą, że przenosisz odpowiedzialność za dostępność serwera i jego moc na barki dostawcy hostingu. Administracja serwera i oprogramowania nadal pozostaje pod Twoją kontrolą.
I w końcu, opcja wynajmu mocy obliczeniowej od dostawców chmurowych. Tutaj możesz skonfigurować automatyczne zarządzanie niemal wszystkim, nie zagłębiając się zbytnio w techniczne niuanse. Dodatkowo, zamiast jednego komputera, możesz mieć kilka jednocześnie uruchomionych instancji, które mogą odpowiadać za różne części aplikacji, przy czym ich koszt nie różni się znacząco od posiadania dedykowanego serwera. A ponadto, dostępne są tutaj narzędzia orkiestracji, konteneryzacji, automatycznego wdrażania, ciągłej integracji i wiele innych! Niektóre z tych rzeczy omówimy poniżej.
Ogólnie rzecz biorąc, infrastruktura serwera wygląda następująco: mamy tzw. „orkiestrator” („orkiestrowanie” – proces zarządzania wieloma instancjami serwerów), który zarządza zmianami w środowisku na instancji serwera, opcjonalny kontener wirtualizacji, który pozwala na podział aplikacji na izolowane warstwy logiczne, oraz oprogramowanie do Ciągłej Integracji – umożliwiające aktualizację wdrożonego kodu za pomocą „skryptów”.
Zatem orkiestracja pozwala na monitorowanie statusów serwerów, wykonywanie „nakładania” lub „wycofywania” aktualizacji środowiska serwera itd. Na początku ten aspekt raczej nie będzie Cię dotyczyć, ponieważ aby coś orkiestrzyć, potrzebujesz kilku serwerów (można mieć tylko jeden, ale po co?). Aby mieć kilka serwerów, musisz mieć potrzebę ich posiadania. W tym zakresie na uszach jest głównie Kubernetes, opracowany Google.
Następny krok to wirtualizacja na poziomie systemu operacyjnego. Obecnie szerokie zastosowanie ma pojęcie „dockerizacji”, które pochodzi od narzędzia Docker, zapewniając funkcjonalność izolowanych od siebie kontenerów, które działają w kontekście jednego systemu operacyjnego. Co to oznacza: w każdym z takich kontenerów można uruchomić aplikację lub nawet zestaw aplikacji, które będą myśleć, że są jedyne w całym systemie, nawet nie podejrzewając o istnieniu kogoś jeszcze na danej maszynie. Ta funkcja jest bardzo przydatna zarówno do uruchamiania tych samych aplikacji w różnych wersjach, jak i po prostu konfliktujących aplikacji, a także do dzielenia kawałków aplikacji na warstwy. Ten odcisk warstw można później zapisać w obrazie, który można wykorzystać na przykład do wdrożenia aplikacji. Oznacza to, że instalując ten obraz i uruchamiając kontenery, które on zawiera, otrzymujesz gotowe środowisko do uruchomienia Twojej aplikacji! Na pierwszych krokach możesz wykorzystać to narzędzie zarówno w celach zapoznawczych, jak i do uzyskania prawdziwych korzyści, rozdzielając logikę aplikacji na różne warstwy. Jednak warto zauważyć, że dokeryzacja nie jest potrzebna wszystkim i nie zawsze. Dokeryzacja jest uzasadniona w przypadkach, gdy aplikacja jest „fragmentaryczna”, podzielona na małe części, z których każda odpowiada za swoje zadanie, tzw. „architektura mikroserwisowa”.
Ponadto, oprócz zapewnienia środowiska, musimy również zapewnić właściwe wdrożenie aplikacji, które obejmuje różne transformacje kodu, instalacje związanych z aplikacją bibliotek i pakietów, uruchamianie testów, powiadomienia o tych operacjach i tak dalej. Tutaj musimy zwrócić uwagę na takie pojęcie jak „Ciągła Integracja” (CI – Continuous Integration). Główne narzędzia w tej dziedzinie w tej chwili to Jenkins (oprogramowanie do CI, napisane w Javie, może wydawać się dość trudne na początku), Travis CI (napisany w Ruby, subiektywnie, nieco prostszy niż Jenkins’a, jednak wciąż wymaga pewnej wiedzy w zakresie konfiguracji wdrożenia), Gitlab CI (napisany w Ruby i Go).
Zatem, rozmawiając o środowisku, w którym będzie działać Twoja aplikacja, nadszedł czas, aby wreszcie zobaczyć, jakie narzędzia oferuje nam nowoczesny świat do tworzenia tych aplikacji.
Zacznijmy od podstaw: Backend (backend) – część serwerowa. Wybór języka, zestawu podstawowych funkcji i predefiniowanej struktury (frameworka) jest tutaj w głównym stopniu zdeterminowany przez osobiste preferencje, niemniej jednak warto to wspomnieć do rozważenia (opinia autora na temat języków jest dosyć subiektywna, choć aspiruje do obiektywnego opisu):
- Python – przyjazny język dla początkującego użytkownika, toleruje pewne błędy, ale może być również dość rygorystyczny wobec programisty, aby nie popełnił poważnych błędów. Już dojrzały i przemyślany język programowania, pojawił się w 1991 roku.
- Go – język od firmy Google, również dość przyjazny i wygodny, łatwo go skompilować i uzyskać plik wykonywalny na dowolnej platformie. Może być prosty i przyjemny, a także skomplikowany i poważny. Nowy i świeży, pojawił się stosunkowo niedawno, w 2009 roku.
- Rust – nieco starszy od swojego poprzednika, pojawił się w 2006 roku, nadal jest dość młody w porównaniu do swoich krewnych. Skierowany do bardziej doświadczonych programistów, choć wciąż stara się rozwiązywać wiele niskopoziomowych zadań za programistę.
- Java – weteran programowania komercyjnego, pojawił się w 1995 roku, jeden z najczęściej używanych języków do tworzenia aplikacji korporacyjnych obecnie. Z jego podstawowymi koncepcjami i skomplikowaną konfiguracją środowiska wykonawczego może być dość skomplikowany dla nowicjusza.
- ASP.net – platforma do tworzenia aplikacji wydana przez firmę Microsoft. Do pisania funkcjonalności głównie używa się języka C# (czytanego jako C si Sharp), który pojawił się w 2000 roku. Pod względem skomplikowania porównywalny z poziomem między Javą a Rustem.
- PHP – początkowo używany do przetwarzania HTML, obecnie mimo utrzymywania absolutnej przewagi na rynku języków, można dostrzec tendencję spadkową jego użycia. Cechuje się niskim progiem wejścia, prostotą w pisaniu kodu, ale w przypadku tworzenia dość dużych aplikacji, funkcjonalność języka może okazać się niewystarczająca.
I ostatnia część naszej aplikacji – najbardziej namacalna dla użytkownika – Frontend (frontend) – jest twarzą Twojej aplikacji, to z tą częścią użytkownik wchodzi w bezpośrednią interakcję.
Nie wnikając w szczegóły, nowoczesny frontend oparty jest na trzech filarach, frameworkach (i nie tylko), do tworzenia interfejsów użytkownika. W związku z tym, trzy najbardziej popularne to:
- ReactJS – to nie framework, a biblioteka. Właściwie, od dumnego tytułu frameworka różni się jedynie brakiem pewnych funkcji „z pudełka” i koniecznością ich ręcznego zainstalowania. W związku z tym, istnieje kilka wariantów „przygotowania” tej biblioteki, tworzących swoiste frameworki. Dla nowicjusza może być to trudne, z powodu niektórych podstawowych zasad i dość agresywnej konfiguracji środowiska budowy. Jednakże, aby szybko zacząć, można skorzystać z pakietu „create-react-app”.
- VueJS – framework do budowania interfejsów użytkownika. Z tej trojki z pewnością zasługuje na miano najbardziej przyjaznego dla użytkownika frameworka, ponieważ próg wejścia w rozwój w Vue jest niższy niż u pozostałych wymienionych kolegów. Ponadto, wśród nich jest najmłodszy.
- Angular – uznawany za najbardziej skomplikowany z wymienionych frameworków, jedyny, który wymaga obecności TypeScript (rozszerzenie języka Javascript). Często stosowany do budowy dużych aplikacji korporacyjnych.
Podsumowując, można stwierdzić, że obecnie wdrożenie aplikacji diametralnie różni się od tego, jak ten proces przebiegał wcześniej. Niemniej jednak, nikt nie przeszkadza w realizacji „deploy” w tradycyjny sposób. Ale czy zaoszczędzone trochę czasu na początku jest warte ogromnej ilości pułapek, na które może natknąć się programista, który wybrał tę drogę? Uważam, że odpowiedź brzmi „nie”. Poświęcając nieco więcej czasu na zapoznanie się z tymi narzędziami (a więcej nie jest potrzebne, ponieważ musisz zrozumieć, czy są one potrzebne w Twoim aktualnym projekcie, czy nie), możesz zredukować czas spędzony na przykłady błędów środowiskowych, które pojawiają się tylko na serwerze produkcyjnym, nocne rozkminy nad tym, co doprowadziło do awarii serwera oraz dlaczego się nie uruchamia, i wiele innych rzeczy.
Źródło: habr.com
