Sdílet prostřednictvím


Styl architektury mikroslužeb

Mikroslužby jsou oblíbeným stylem architektury pro vytváření aplikací, které jsou odolné, vysoce škálovatelné a umožňují nezávislé nasazení a rychlý rozvoj. Vytvoření úspěšné architektury mikroslužeb vyžaduje zásadní posun v myšlení. Přesahuje dekompisování aplikace do menších služeb. Musíte také znovu promyslet, jak jsou systémy navržené, nasazené a provozované.

Architektura mikroslužeb se skládá z kolekce malých, autonomních služeb. Každá služba je samostatná a měla by implementovat jednu obchodní funkci v rámci omezeného kontextu. Ohraničený kontext je přirozené rozdělení v rámci firmy a poskytuje explicitní hranici, ve které existuje doménový model.

Logický diagram stylu architektury mikroslužeb

Co jsou mikroslužby?

Mikroslužby jsou malé, nezávislé a volně svázané komponenty, které může psát a udržovat jeden malý tým vývojářů. Každá služba se spravuje jako samostatný základ kódu, který umožňuje malému týmu efektivně zpracovávat. Vzhledem k tomu, že služby je možné nasadit nezávisle, můžou týmy aktualizovat stávající služby bez opětovného sestavení nebo opětovného nasazení celé aplikace. Na rozdíl od tradičních modelů, které mají centralizovanou datovou vrstvu, zodpovídají mikroslužby za zachování vlastních dat nebo externího stavu. Komunikují prostřednictvím dobře definovaných rozhraní API, která udržují interní implementace skryté před jinými službami. Tato architektura také podporuje polyglotní programování, což znamená, že služby nemusí sdílet stejnou technologickou sadu, knihovny nebo architektury.

Součásti

Kromě samotných služeb se další komponenty zobrazují v typické architektuře mikroslužeb:

  • Správa nebo orchestrace: Tato komponenta pro správu zpracovává orchestraci mikroslužeb. Plánuje a nasazuje služby napříč uzly, zjišťuje chyby, obnovuje se z chyb a umožňuje automatické škálování na základě poptávky. Tato funkce obvykle poskytuje platforma pro orchestraci kontejnerů, jako je Kubernetes. V cloudových nativních prostředích poskytují řešení, jako je Azure Container Apps, spravovanou orchestraci a integrované škálování. Tyto nástroje snižují složitost nasazení a provozní režii.

  • Brána rozhraní API: Brána rozhraní API slouží jako vstupní bod pro klienty. Klienti odesílají požadavky do brány rozhraní API místo volání služeb přímo. Brána tyto požadavky předává příslušným back-endovým službám. Řeší také průřezové aspekty, jako je ověřování, protokolování a vyrovnávání zatížení. V architekturách mikroslužeb nativních pro cloud podporují jednoduché proxy služby, jako je Envoy a Nginx, interní komunikaci mezi službami. Tento typ interního provozu, označovaného jako provoz východ-západ, umožňuje pokročilé směrování a řízení provozu.

  • Middleware orientovaný na zprávy: Platformy pro zasílání zpráv, jako jsou Apache Kafka a Azure Service Bus, umožňují asynchronní komunikaci v mikroslužbách tím, že podporují volné párování a podporují vysokou škálovatelnost. Tvoří základ architektur řízených událostmi. Tento přístup umožňuje službám reagovat na události v reálném čase a komunikovat prostřednictvím asynchronního zasílání zpráv.

  • Pozorovatelnost: Efektivní strategie pozorovatelnosti pomáhá týmům udržovat spolehlivost systému a rychle řešit problémy. Centralizované protokolování spojuje protokoly, které podporují snadnější diagnostiku. Monitorování v reálném čase pomocí agentů a architektur monitorování výkonu aplikací, jako je OpenTelemetry, poskytuje přehled o stavu a výkonu systému. Distribuované trasování sleduje požadavky napříč hranicemi služeb. Pomáhá týmům najít kritické body a zlepšit výkon.

  • Řízení dat: Dobře navržená architektura databáze podporuje autonomii a škálovatelnost. Mikroslužby často používají polyglotní trvalost výběrem různých typů databází, jako je SQL nebo NoSQL, na základě konkrétních potřeb jednotlivých služeb. Tento přístup je v souladu s návrhem řízeným doménou (DDD) a myšlenkou ohraničeného kontextu. Každá služba vlastní svá data a schéma. Toto vlastnictví snižuje závislosti mezi službami a umožňuje nezávislému vývoji služeb. Tento decentralizovaný model zlepšuje flexibilitu, výkon a odolnost systému.

Výhody

  • Hbitost: Vzhledem k tomu, že mikroslužby se nasazují nezávisle, je jednodušší spravovat opravy chyb a vydané verze funkcí. Službu můžete aktualizovat bez opětovného nasazení celé aplikace a vrátit aktualizaci zpět, pokud se něco nepovede. Pokud v mnoha tradičních aplikacích zjistíte chybu v jedné části aplikace, může blokovat celý proces vydání. Chyba může například zastavit nové funkce, pokud potřebujete integrovat, testovat a publikovat opravu chyb.

  • Malé, zaměřené týmy: Mikroslužba by měla být dostatečně malá, aby ji mohl sestavit, otestovat a nasadit jeden tým funkcí. Malá velikost týmu znamená větší flexibilitu. Velké týmy mají tendenci být méně produktivní, protože komunikace je pomalejší, zvyšují se režijní náklady na správu a snižuje se flexibilita.

  • Malý základ kódu: V monolitické aplikaci se závislosti kódu často zamotávají v průběhu času. Přidání nové funkce může vyžadovat změny v mnoha částech základu kódu. Architektura mikroslužeb se tomuto problému vyhne tím, že nesdílí kód nebo úložiště dat. Tento přístup minimalizuje závislosti a usnadňuje zavádění nových funkcí.

  • Kombinace technologií: Týmy si můžou vybrat technologii, která nejlépe vyhovuje jejich službám, pomocí kombinace technologických zásobníků podle potřeby.

  • Izolace chyb: Pokud se jednotlivá mikroslužba stane nedostupnou, nenaruší celou aplikaci, pokud jsou všechny nadřazené mikroslužby navržené tak, aby správně zpracovávaly chyby. Můžete například implementovat vzor Jistič nebo navrhnout řešení tak, aby mikroslužby mezi sebou komunikovaly pomocí asynchronních komunikačních vzorů.

  • Škálovatelnost: Služby je možné škálovat nezávisle. Tento přístup umožňuje škálovat subsystémy, které vyžadují více prostředků bez horizontálního navýšení kapacity celé aplikace. Pomocí orchestrátoru, jako je Kubernetes, přidejte do jednoho hostitele vyšší hustotu služeb, což umožňuje efektivnější využití prostředků.

  • Izolace dat: Aktualizace schématu je v architektuře mikroslužeb jednodušší, protože to má vliv jenom na jednu mikroslužbu. Naproti tomu monolitické aplikace mohou komplikovat změny schématu, protože více komponent často pracuje se stejnými daty. Díky tomuto sdílenému přístupu může být jakákoli změna potenciálně riziková.

Výzvy

Výhody mikroslužeb mají kompromisy. Než vytvoříte architekturu mikroslužeb, zvažte následující výzvy:

  • Komplexnost: Aplikace mikroslužeb má více pohyblivých částí než ekvivalentní monolitická aplikace. Každá služba je jednodušší, ale celý systém jako celek je složitější. Při návrhu aplikace se ujistěte, že zvažujete výzvy, jako je zjišťování služeb, konzistence dat, správa transakcí a komunikace mezi službami.

  • Vývoj a testování: Vytvoření malé služby, která závisí na jiných závislých službách, vyžaduje jiný přístup než psaní tradiční monolitické nebo vrstvené aplikace. Existující nástroje nejsou vždy navržené tak, aby fungovaly se závislostmi služeb. Refaktoring mezi službami může být obtížný. Testování závislostí služeb je také náročné, zejména když se aplikace rychle vyvíjí.

  • Nedostatek zásad správného řízení: Decentralizovaný přístup k vytváření mikroslužeb má výhody, ale může také vést k problémům. Můžete skončit s tolika různými jazyky a architekturami, že aplikace se obtížně udržuje. Může být užitečné zavést některé standardy pro celý projekt bez nadměrného omezení flexibility týmů. Tato metoda se vztahuje zejména na průřezové funkce, jako je protokolování.

  • Zahlcení sítě a latence: Použití mnoha malých podrobných služeb může vést k větší komunikaci mezi službami. Pokud je řetěz závislostí služeb příliš dlouhý (služba A volá B, která volá C...), může se stát problém s další latencí. Potřebujete navrhovat rozhraní API pečlivě. Vyhněte se příliš chatovacím rozhraním API, zamyslete se nad formáty serializace a hledejte místa pro použití asynchronních komunikačních vzorů, jako je model vyrovnávání zatíženíQueue-Based.

  • Integrita dat: Každá mikroslužba zodpovídá za trvalost vlastních dat. V důsledku toho může být konzistence dat napříč více službami výzvou. Různé služby uchovávají data v různých časech, používají různé technologie a potenciálně různé úrovně úspěchu. Pokud se zachování nových nebo změněných dat týká více než jedné mikroslužby, je nepravděpodobné, že by se úplná změna dat mohla považovat za atomické, konzistentní, izolované a odolné transakce (ACID). Místo toho je tato technika více sladěná s konceptem Basic Availability, Soft State, Eventual Consistency (BASE). Pokud je to možné, přijměte konečnou konzistenci.

  • Management: Úspěšná architektura mikroslužeb vyžaduje vyspělou kulturu DevOps. Korelované protokolování napříč službami může být náročné. Protokolování obvykle musí korelovat více služebních volání pro jednu uživatelskou operaci.

  • Správa verzí: Aktualizace služby nesmí přerušit služby, které na ní závisejí. V jednom okamžiku je možná aktualizace více služeb, takže bez pečlivého návrhu můžete mít problémy se zpětnou nebo dopřednou kompatibilitou.

  • Sada dovedností: Mikroslužby jsou vysoce distribuované systémy. Pečlivě vyhodnoťte, jestli má tým dovednosti a zkušenosti, které mají být úspěšné.

Osvědčené postupy

  • Modelujte služby kolem obchodní domény. DDD slouží k identifikaci ohraničených kontextů a definování jasných hranic služby. Vyhněte se vytváření příliš podrobných služeb, které můžou zvýšit složitost a snížit výkon.

  • Decentralizované všechno. Jednotlivé týmy zodpovídají za návrh a vytváření služeb až do konce. Vyhněte se sdílení kódu nebo schémat dat.

  • Standardizujte volby technologií omezením počtu jazyků a architektur, které používáte. Vytvořte standardy pro celou platformu pro protokolování, monitorování a nasazení.

  • Úložiště dat by mělo být privátní pro službu, která vlastní data. Pro každou službu a datový typ použijte nejlepší úložiště.

  • Služby komunikují prostřednictvím dobře navržených rozhraní API. Vyhněte se úniku podrobností implementace. Rozhraní API by měla modelovat doménu, ne interní implementaci služby.

  • Vyhněte se párování mezi službami. Příčiny párování zahrnují schémata sdílených databází a pevné komunikační protokoly.

  • Pro asynchronní komunikaci používejte architektury zasílání zpráv. Přistupte k nástrojům, jako je MassTransit nebo NServiceBus , které zpracovávají směrování, opakování, stálost a vzory pracovních postupů místo vytváření vlastní logiky zasílání zpráv. Architektury pomáhají snížit složitost distribuovaného systému, zlepšit spolehlivost a vyhnout se běžným nástrahám při implementaci mikroslužeb řízených zprávami.

  • Zlepšení zabezpečení pomocí vzájemného šifrování mTLS (Transport Layer Security) pro šifrování mezi službami. Implementujte řízení přístupu na základě role a pomocí bran rozhraní API vynucujte zásady.

  • Přenést mezirozešířené záležitosti, jako je například ověřování a ukončení připojení SSL, do brány. Sítě služeb a frameworky jako Dapr mohou také pomoci s běžnými průřezovými problémy, jako je ověřování mTLS a resilienci.

  • Udržujte znalosti domény mimo bránu. Brána by měla zpracovávat a směrovat požadavky klientů bez znalostí obchodních pravidel nebo logiky domény. Jinak se brána stane závislostí a může způsobit párování mezi službami.

  • Služby by měly mít volné spojení a vysokou funkční soudržnost. Funkce, které se pravděpodobně změní společně, by se měly zabalit a nasadit společně. Pokud se nacházejí v samostatných službách, tyto služby jsou úzce propojené, protože změna v jedné službě vyžaduje aktualizaci druhé služby. Příliš ukecaná komunikace mezi dvěma službami může být příznakem silné vazby a nízké koheze.

  • K automatizaci testování a nasazení používejte kanály kontinuální integrace a průběžného nasazování (CI/CD). Nasaďte služby nezávisle a monitorujte stav zavedení.

  • Izolace selhání Použijte strategie odolnosti, abyste zabránili selháním ve službě v kaskádovém vytváření. Další informace najdete v tématu Vzory odolnosti a Návrh spolehlivých aplikací.

  • Pomocí chaosu otestujte odolnost architektury mikroslužeb a jejích závislostí. Vyhodnoťte a vylepšete, jak systém zpracovává částečná selhání.

  • Implementujte centralizované protokolování, distribuované trasování (OpenTelemetry) a shromažďování metrik, abyste zajistili pozorovatelnost.

Antipatterny pro mikroslužby

Při návrhu a implementaci mikroslužeb dochází často ke konkrétním nástrahám, které můžou podkopávat výhody tohoto stylu architektury. Rozpoznávání těchto antipatternů pomáhá týmům vyhnout se nákladným chybám a vytvářet odolnější a udržovatelné systémy. Vyhněte se následujícím antipatternům:

  • Implementace mikroslužeb bez hlubokého porozumění obchodní doméně vede ke špatně sladěným hranicím služeb a podkopává zamýšlené výhody.

  • Navrhování událostí, které závisí na minulých nebo budoucích událostech, porušuje princip atomických a samostatných zpráv. Tato závislost nutí spotřebitele čekat a snižuje spolehlivost systému.

  • Použití databázových entit jako událostí zveřejňuje interní podrobnosti o službách a často nedokáže sdělit správný obchodní záměr, což vede k úzce propojeným a nejasným integracím.

  • Zabránění duplikaci dat za každou cenu je antipattern. Použití vzorů, jako jsou materializovaná zobrazení k udržování místních kopií, zlepšuje autonomii služeb a snižuje závislosti mezi službami.

  • Použití obecných událostí vynutí uživatele k interpretaci a filtrování zpráv. Tento přístup zvyšuje zbytečnou složitost a snižuje přehlednost komunikace řízené událostmi.

  • Sdílení společných knihoven nebo závislostí mezi mikroslužbami vytváří úzkou vazbu, což vede k rizikovým a rozšířeným změnám a jde proti principu samostatných služeb.

  • Přímá expozice mikroslužeb spotřebitelům vede k těsnému párování, k problémům s škálovatelností a bezpečnostním rizikům. Použití brány rozhraní API poskytuje čistý, spravovatelný a zabezpečený vstupní bod.

  • Udržování konfiguračních hodnot uvnitř mikroslužeb je úzce páruje s konkrétními prostředími, což ztěžuje nasazení. Externalizace konfigurace ale podporuje flexibilitu a přenositelnost prostředí.

  • Vkládání logiky zabezpečení, jako je ověřování tokenů přímo do mikroslužeb, komplikuje jejich kód a údržbu. Další možností je přenesení zabezpečení na vyhrazené komponenty, aby byly služby zaměřené a čistší.

  • Nenabstrakce běžných úloh mikroslužeb vede k opakovanému, chybám náchylnému kódu a omezuje flexibilitu. Alternativně použití architektur abstrakce, jako je Dapr, zjednodušuje vývoj oddělením obchodní logiky od obav z infrastruktury.

Vytvoření architektury mikroslužeb

Následující články představují strukturovaný přístup pro navrhování, sestavování a provoz architektury mikroslužeb.

Použití analýzy domény: Abyste se vyhnuli běžným nástrahám při návrhu mikroslužeb, definujte hranice mikroslužeb pomocí analýzy domény. Proveďte následující kroky:

  1. Použití analýzy domény k modelování mikroslužeb
  2. Použití taktické technologie DDD k návrhu mikroslužeb
  3. Identifikace hranic mikroslužeb

Návrh služeb: Mikroslužby vyžadují decentralizovaný a agilní přístup k návrhu a vytváření aplikací. Další informace najdete v tématu Návrh architektury mikroslužeb.

Provoz v produkčním prostředí: Vzhledem k tomu, že se distribuují architektury mikroslužeb, musíte mít robustní operace pro nasazení a monitorování.