Mikroserwisy

Mikroserwisy, architektura mikroserwisów – styl tworzenia architektury aplikacji komputerowych implementujący wzorzec architektury zorientowanej na usługi, który aranżuje aplikację jako zbiór luźno połączonych ze sobą niewielkich serwisów komunikujących się poprzez lekkie protokoły komunikacyjne. Celem jest zapewnienie niezależności poszczególnych komponentów, które mogą być rozwijane niezależnie od pozostałych elementów składowych systemu oraz wyraźny podział komponentów tak, by realizowały jedną, konkretną logikę biznesową lub programową.

Historia

Przykład aplikacji wykorzystującej wzorzec mikroserwisów: wyraźnie widać podział pomiędzy komponentami realizującymi poszczególne logiki systemu oraz kanały komunikacji pomiędzy nimi; każdy z serwisów wchodzących w skład aplikacji jest niezależny od pozostałych

Dokładna data powstania koncepcji mikroserwisów nie jest znana. Jednym z jej prekursorów był wiceprezes ThoughtWorks Fred George, który w 2004 roku rozpoczął prace nad prototypową architekturą bazującą na zasadach sformułowanych przez Jeffa Baya[1].

Silny wpływ na tworzenie nowej architektury miały prace Petera Rodgersa, które rozpoczęły się w 1999 roku w ramach projektu „Dexter” prowadzonego w laboratoriach firmy Hewlett-Packard. Celem było utwardzenie kodu i opracowanie rozwiązań, które uodporniłyby duże systemy informatyczne na negatywne efekty zachodzących w nich zmian[2]. Na początku 2005 podczas konferencji Web Services Edge Rodgers wprowadził termin „mikro-web-serwis”, sugerując, że poszczególne komponenty oprogramowania są jak mikrousługi sieciowe[3].

W 2007 roku Juval Löwy w swojej książce[4] i wypowiedziach[5][6] wezwał do tworzenia systemów, w których każda klasa byłaby serwisem. Ponieważ wymagało to technologii wspierającej tworzenie tak granularnych serwisów, rozszerzył on framework Windows Communication Foundation w taki sposób, by wspierał on traktowanie klas jak serwisów przy zachowaniu standardowego modelu obiektowego[7][8].

Podczas warsztatów dla architektów oprogramowania prowadzonych w pobliżu Wenecji w maju 2011 roku użyto terminu „mikroserwis” do opisu tego stylu architektonicznego[9], a rok później określenie to zostało przyjęte jako najbardziej trafne. James Lewis przedstawił część tych pomysłów jako studium przypadku podczas konferencji 33rd Degree w Krakowie w marcu 2012 roku[10].

Charakterystyka

Mikroserwisem nazywamy część większej aplikacji – komponent, proces lub usługę – dostarczający określoną funkcję w sposób całkowicie niezależny od pozostałych składowych systemu, dzięki czemu może być on rozwijany, wdrażany i utrzymywany w sposób autonomiczny[11]. Wbrew swojej nazwie taki byt nie musi być niewielkim elementem, gdyż jego zadanie jest ściśle powiązane z realizowaną funkcją biznesową, która jest dostarczana do pozostałych składowych systemu[12]. Komunikacja pomiędzy poszczególnymi mikroserwisami odbywa się poprzez neutralne z punktu widzenia technologii protokoły, takie jak przykładowo HTTP[13][14]. Pod względem strategii wpisują się one w wywodzący się z filozofii Unixa termin „rób jedną rzecz i rób ją dobrze”[15].

Do zalet wynikających z architektury mikroserwisów zalicza się[11][16]:

  • skalowalność – poszczególne komponenty mogą być skalowane niezależnie od pozostałych;
  • dowolność technologii – każdy element może być tworzony w technologii najlepiej odpowiadającej jego funkcjonalności, dodatkowo łatwiej jest kontrolować poziom długu technologicznego;
  • modularność – małe komponenty pozwalają na łatwe wdrożenie i rozbudowę bez konieczności ingerencji w całą aplikację;
  • stabilność – błąd w jednym obszarze jest łatwiejszy do zidentyfikowania i naprawienia, redukując ryzyko zatrzymania systemu.

Krytyka

Architektura mikroserwisów niesie ze sobą poważne konsekwencje względem procesu tworzenia i utrzymania oprogramowania. Duża liczba rozproszonych mikroserwisów komplikuje projekt i wymusza wprowadzenie systemu komunikacji zarówno pomiędzy poszczególnymi procesami, jak i pod względem obsługi wyjątków[16]. Ponadto tworzenie znacznej liczby małych elementów jest czasochłonne, wymagając dodatkowo zarządzania infrastrukturą, na której będą one działać i się skalować[11]. Testowanie takiego systemu wymaga złożonego podejścia i jest często mocno utrudnione ze względu na mnogość powiązanych usług[16].

W porównaniu do systemów monolitycznych koszt komunikacji między kolejnymi serwisami jest znacznie wyższy od analogicznych wywołań w trakcie procesu ze względu na opóźnienia sieci i konieczność właściwego przetworzenia odpowiedzi[17].

Alternatywnym rozwiązaniem dla architektury mikroserwisów jest modularny monolit. To podejście również posiada strukturę modułową, ale jednocześnie ma prostszą infrastrukturę. Dzięki temu, taki system jest łatwiejszy w testowaniu funkcji biznesowych czy w komunikacji technicznej. [18][19]

Przypisy

  1. Fred George: Episode 14 - The Grandfather of Microservices, Fred George. Acast, 2021-05-11. [dostęp 2021-10-16]. (ang.).
  2. Perry Russell, Peter Rodgers, Royston Sellman: Architecture and Design of an XML Application Platform. HP Technical Reports, 2004. s. 62. [dostęp 2021-10-16].
  3. Peter Rodgers: Service-Oriented Development on NetKernel- Patterns, Processes & Products to Reduce System Complexity Web Services Edge 2005 East: CS-3. SYS-CON TV. [dostęp 2021-10-16]. [zarchiwizowane z tego adresu (2018-05-20)].
  4. Juval Löwy: Programming WCF Services, 1st ed.. O’Reilly Media, 2007, s. 543–553. ISBN 978-0-596-52699-3.
  5. Juval Löwy "Every Class a WCF Service". (Channel9, ARCast.TV, October 2007).
  6. Juval Löwy "Every Class As a Service" (Microsoft TechEd Conference, May 2009), SOA206. Archived from the original on 2010.
  7. Juval Löwy: Programming WCF Services, 1st ed.. O’Reilly Media, 2007, s. 48–51. ISBN 978-0-596-52699-3.
  8. Juval Löwy: Programming WCF Services, 3rd ed.. O’Reilly Media, 2010, s. 74–75. ISBN 978-0-596-80548-7.
  9. Nicola Dragoni, Saverio Giallorenzo, Alberto Lluch Lafuente, Manuel Mazzara i inni. Microservices: yesterday, today, and tomorrow. „Present and Ulterior Software Engineering”, s. 195–216, 2017. DOI: 10.1007/978-3-319-67425-4_12. arXiv:1606.04036. 
  10. James Lewis: Micro services - Java, the Unix Way. 33rd Degree Conference. [dostęp 2021-10-16].
  11. a b c Andrzej Lewandowski: Mikroserwisy – architektura oparta o mikrousługi. Czym są? Jakie są ich zalety i wady?. RST Software Masters, 2019-09-09. [dostęp 2021-10-17]. (pol.).
  12. Mateusz Książek: Mikroserwisy – zbiór informacji. DEV:ENV, 2018-05-03. [dostęp 2021-10-17]. (pol.).
  13. Sam Newman: Building Microservices. O'Reilly Media, 2015-02-20. ISBN 978-1491950357.
  14. Eberhard Wolff: Microservices: Flexible Software Architectures. 2016-10-12. ISBN 978-0134602417.
  15. Lucas Krause: Microservices: Patterns and Applications. ISBN 978-0692424278.
  16. a b c Jakie zalety i wady mają mikroserwisy?. Serwis Rzeczypospolitej Polskiej. [dostęp 2021-10-18]. (pol.).
  17. Martin Fowler: Microservices. [zarchiwizowane z tego adresu (2018-02-14)].
  18. Rosłoniec A., Modular software architecture: advantages and disadvantages of using monolith, microservices and modular monolith, Pretius, 27 kwietnia 2023 [dostęp 2023-05-25] (ang.).
  19. Modular Monolith: A Primer — Kamil Grzybek [online], www.kamilgrzybek.com [dostęp 2023-05-25] .