Architektura mikroserwisów w ostatnim czasie zyskała na popularności w branży jako realna alternatywa dla aplikacji monolitycznych i architektur zorientowanych na usługi. Często niestety nie wiemy jak poprawnie zaprojektować aplikację opartą na mikroserwisach. Używamy takiej architektury ze względu na trend a nie wymagania biznesowe. Z drugiej strony wiele firm odnalazło się w mikroserwisach i radzą sobie świetne. Baa.. w internecie można znaleźć dużo cennych artykułów o tym jak im szło lub idzie [1, 2].
I’ll keep saying this … if people can’t build monoliths properly, microservices won’t help.
Simon Brown
Cześć
To jest kolejny artykuł z serii wzorców o architekturach aplikacyjnych. Poprzednie artykuły znajdziesz pod tym linkiem mini-seria wpisów.
W dzisiejszym artykule:
Czym jest architektura mikroserwisów
Mikroserwisy to styl architektoniczny, w którym pojedyncza aplikacja jest tworzona jako zestaw małych usług. Każda usługa działa w ramach własnego procesu i jest – albo przynajmniej powinna być – niezależna od innych. Warto podkreślić, że mikroserwis to nie jest zawsze pojedyczny projekt (moduł). W ramach jednego mikroserwisu możemy mieć kilka projektów (modułów), które tworzą jeden niezależny mikroserwis. Całkiem dobrze obrazuje to poniższy rysunek.
Wracając do niezależności – co dokładnie miałem na myśli? Każdy z serwisów powinien móc być wdrażany/testowany całkowicie oddzielnie od pozostałych usług. Tylko wtedy osiągniemy pełnię korzyści z tej architektury!
Mikroserwisy są implementacją wzorca SOA (Service-Oriented Architecture) z tą różnicą, że usługi mikroserwisowe są rozbijane na mniejsze – łatwiejsze do ogarnięcia. Zamiast monolitycznej aplikacji otrzymujemy N niezależnych, które mogą być rozwijane niezależnie przez kilka odrębnych zespołów.
Podsumowując, charakterystykę mikroserwisów można zamknąć w kilku punktach:
- jest implementacją wzorca SOA
- nie ma punktów centralnych, które orkiestrują powiązaniami pomiędzy serwisami (poszczególne usługi same wiedzą w jaki sposób komunikować się z innymi)
- komponenty są luźno powiązane
- najlepiej nadaje się do chmury (tam wyciągnie największe korzyści – skalowalność)
Topologie mikroserwisów
Architekturę mikroserwisów można podzielić na 3 główne topologie: API REST, Application REST i centralized messaging topology.
API REST – charakteryzuje się 'drobnoziarnistymi’ (fine-grained) mikroserwisami. Oznacza to, że mikroserwisy są małe i wykonują konkretne zadanie biznesowe niezależnie od pozostałych mikroserwisów. Topologia przydatna dla stron internetowych, które udostępniają małe, niezależne, indywidualne usługi za pośrednictwem API.
Application REST – topologia typowa dla małych i średnich aplikacji biznesowych o stosunkowo niskim stopniu złożoności. Komponenty (moduły) usług różnią się od tych w topologii opartej na API-REST tym, że zwykle są większe (coarse-grained) i reprezentują niewielką część całej aplikacji biznesowej, a nie drobnoziarnistą, pojedynczą usługę.
Centralized messaging topology – jest podobna do Application REST, z tym wyjątkiem, że zamiast używać REST’a do komunikacji, używa lekkiego scentralizowanego brokera komunikatów (ActiveMQ, RabbitMQ, inna implementacja JMS). Scentralizowana topologia przesyłania wiadomości jest zwykle stosowana w większych aplikacjach biznesowych. Zalety to zaawansowane mechanizmy kolejkowania, asynchroniczne przesyłanie komunikatów, monitorowanie oraz lepszy load balancing i skalowalność.
Wady i zalety architektury
Zalety:
- serwisy są małe i niezależne – a zatem łatwiejsze w rozwoju i zrozumieniu
- łatwiejsza testowalność (mowa tylko o pojedynczym mikroserwisie)
- możliwość niezależnego wdrażania (przynajmniej w teorii tak powinno być)
- izolacja błędów – dzięki temu, że serwisy są od siebie niezależne, w przypadku gdy wystąpi błąd (np. wyciek pamięci) w jednym z serwisów nie powinno to wpłynąć na działanie innego
- pozwala na użycie dowolnej technologi w nowych serwisach (może to być również wadą)
- skalowalność (szczególnie zauważalne w technologiach chmurowych)
Wady:
- dowolność technologiczna może prowadzić do chaosu
- testowanie interakcji pomiędzy serwisami jest utrudnione
- skomplikowana infrastruktura
- utrudniona analiza komunikacji
- IDE/narzędzia developerskie wciąż nie wspierają tak dobrze projektów opartych o mikroserwisy jak projektów monolitycznych
Podsumowanie
Decyzja o tym czy nowy projekt powinien iść w stronę mikroserwisów powinna być odraczana możliwie jak najdłużej. Bardzo często zamiast iść w kierunku mikroserwisów (bo są popularne) powinniśmy zacząć od monolitu. Wyjątkiem będzie naprawdę dobrze przemyślana architektura i wizja na przyszłość, gdzie od razu wiemy, że prędzej czy później mikroserwisy faktycznie przyniosą nam korzyści.
Mikroserwisy to fajna architektura. Ale należy pamiętać – dobór architektury zawsze powinien być podyktowany problemem biznesowym. Nasze ego czy też chęć cv-driven-development nie powinno zwyciężać bo może się okazać, że zatopimy projekt.
Źródła:
- Software Architecture Patterns (Mark Richards) – Chapter 4. Microservices Architecture Pattern
- Pattern: Microservice Architecture
- Microservices
- Java Microservices: A Practical Guide
Za tydzień
Wejdziemy w świat DDD. Zaczniemy od poznawania fundamentów 🙂
Troszkę błędów jest.
Sugeruje nie brać się za tematy, jeśli faktycznie nie masz ich przepracowanych przez lata doświadczenia. Bo udając się na profil to takie 4-5 lat doświadczenia jest tak naprawdę rządnym doświadczeniem typ bardziej w kwestiach szeroko pojętej architektury.
Coś więcej rozwinięcia, czy tylko krytyka?
„[..] nie ma punktów centralnych, które orkiestrują powiązaniami pomiędzy serwisami (poszczególne usługi same wiedzą w jaki sposób komunikować się z innymi) […]”
Czyżby? Odsyłam do pojęć: Orkiestracja oraz Choreografia.
„poszczególne usługi same wiedzą w jaki sposób komunikować się z innymi”
To jest właśnie zaprzeczenie mikrousługom, a szczególnie niskiemu sprzężeniu czy atomowości. Jasne, stosuje się ten mechanizm w Orkiestracji, ale to jest jednak wciąż wada, którą rozwiązuje właśnie Orkiestracja, która zaprzecza temu, co piszesz tutaj:
„nie ma punktów centralnych”
Jeszcze jedno odnośnie „nie ma punktów centralnych” -czym w takim układzie jest API Gateway jak nie pewnego rodzaju punktem centralnym? Jasne, nie jest punktem centralnym w rozumieniu monolitu, ale wciąż należy rozpatrywać API Gateway jako punkt centralny…
Pozdrawiam