{"id":35906,"date":"2019-10-31T22:07:29","date_gmt":"2019-10-31T19:07:29","guid":{"rendered":"https:\/\/prohoster.info\/blog\/perehod-ot-monolita-k-mikroservisam-istoriya-i-praktika\/"},"modified":"2019-10-31T22:07:29","modified_gmt":"2019-10-31T19:07:29","slug":"perehod-ot-monolita-k-mikroservisam-istoriya-i-praktika","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/perehod-ot-monolita-k-mikroservisam-istoriya-i-praktika","title":{"rendered":"P\u0159echod od monolitu k mikroslu\u017eb\u00e1m: historie a praxe","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>V tomto \u010dl\u00e1nku v\u00e1m pov\u00edm, jak se projekt, na kter\u00e9m pracuji, prom\u011bnil z velk\u00e9ho monolitu na soubor mikroslu\u017eeb.<\/p>\n<p>Projekt za\u010dal svou historii pom\u011brn\u011b d\u00e1vno, na za\u010d\u00e1tku 2000. Prvn\u00ed verze byly naps\u00e1ny na Visual Basic 6. S postupem \u010dasu se uk\u00e1zalo, \u017ee v\u00fdvoj v tomto jazyce bude v budoucnu obt\u00ed\u017en\u011b udr\u017eovateln\u00fd, jeliko\u017e IDE i samotn\u00fd jazyk se vyv\u00edjej\u00ed pomalu. Na konci 2000. let bylo rozhodnuto p\u0159ej\u00edt na perspektivn\u011bj\u0161\u00ed C#. Nov\u00e1 verze se psala paraleln\u011b s vylep\u0161ov\u00e1n\u00edm star\u00e9, postupn\u011b byl st\u00e1le v\u011bt\u0161\u00ed objem k\u00f3du v .NET. Backend na C# byl p\u016fvodn\u011b orientov\u00e1n na slu\u017ebovou architekturu, av\u0161ak p\u0159i v\u00fdvoji se pou\u017e\u00edvaly spole\u010dn\u00e9 knihovny s logikou, a slu\u017eby se spou\u0161t\u011bly v jednom procesu. Vznikla aplikace, kterou jsme nazvali \u201eservisn\u00ed monolit\u201c. <\/p>\n<p>Jedn\u00edm z m\u00e1la v\u00fdhod takov\u00e9 kombinace byla mo\u017enost, aby se slu\u017eby vz\u00e1jemn\u011b vyvol\u00e1valy prost\u0159ednictv\u00edm extern\u00edho API. Byly jasn\u00e9 p\u0159edpoklady pro p\u0159echod na spr\u00e1vn\u011bj\u0161\u00ed slu\u017ebovou, a v budoucnu i mikroslu\u017ebovou architekturu. <\/p>\n<p>Na\u0161e pr\u00e1ce na dekompozici za\u010dala p\u0159ibli\u017en\u011b v roce 2015. I kdy\u017e jsme je\u0161t\u011b nedos\u00e1hli ide\u00e1ln\u00edho stavu \u2014 z\u016fstaly \u010d\u00e1sti velk\u00e9ho projektu, kter\u00e9 u\u017e t\u011b\u017eko nazvat monolity, ale ani mikroslu\u017ebami nep\u0159ipom\u00ednaj\u00ed. P\u0159esto v\u0161ak pokrok je z\u00e1sadn\u00ed. <br \/>\nO tom se zm\u00edn\u00edm v tomto \u010dl\u00e1nku.<\/p>\n<p><img decoding=\"async\" alt=\"P\u0159echod od monolitu k mikroslu\u017eb\u00e1m: historie a praxe\" src=\"\/wp-content\/uploads\/2019\/07\/132bb4ea6b9dbcdd202ee090f2b86289.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Obsah<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#1\"> Architektura a probl\u00e9my st\u00e1vaj\u00edc\u00edho \u0159e\u0161en\u00ed<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#2\">O\u010dek\u00e1v\u00e1n\u00ed od mikroslu\u017eeb<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#3\">Probl\u00e9my s p\u0159echodem<\/a><\/noindex><\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"#4\">Jak p\u0159ej\u00edt od monolitu k mikroslu\u017eb\u00e1m<\/a><\/noindex>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#5\">Prvn\u00ed zp\u016fsob<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#6\">Druh\u00fd zp\u016fsob<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#7\">T\u0159et\u00ed zp\u016fsob<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#8\">\u010ctvrt\u00fd zp\u016fsob<\/a><\/noindex><\/li>\n<\/ul>\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#9\">Pr\u00e1ce s DB<\/a><\/noindex>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#10\">Odd\u011blen\u00ed existuj\u00edc\u00edch tabulek<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#11\">Odd\u011blen\u00ed s p\u0159epracov\u00e1n\u00edm<\/a><\/noindex><\/li>\n<\/ul>\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#12\">Pr\u00e1ce se zdrojov\u00fdm k\u00f3dem<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#13\">Probl\u00e9my infrastruktury<\/a><\/noindex>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"#16\">Ru\u010dn\u011b instalovat do prost\u0159ed\u00ed<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#14\">Odd\u011blen\u00e9 logov\u00e1n\u00ed<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#15\">Testov\u00e1n\u00ed a lad\u011bn\u00ed souvisej\u00edc\u00edch slu\u017eeb<\/a><\/noindex><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><noindex><a rel=\"nofollow\" name=\"1\"><\/a><\/noindex><b><\/p>\n<h3>Architektura a probl\u00e9my st\u00e1vaj\u00edc\u00edho \u0159e\u0161en\u00ed<\/h3>\n<p><\/b><br \/>\nP\u016fvodn\u011b architektura vypadala n\u00e1sledovn\u011b: UI \u2014 samostatn\u00e1 aplikace, monolitick\u00e1 \u010d\u00e1st napsan\u00e1 na Visual Basic 6, aplikace na .NET p\u0159edstavovala soubor vz\u00e1jemn\u011b propojen\u00fdch slu\u017eeb, pracuj\u00edc\u00edch s pom\u011brn\u011b velkou datab\u00e1z\u00ed.<\/p>\n<p><b>Nev\u00fdhody p\u0159edchoz\u00edho \u0159e\u0161en\u00ed<\/b><\/p>\n<p><u>Jednotn\u00fd bod selh\u00e1n\u00ed<\/u><br \/>\nM\u011bli jsme jedin\u00fd bod selh\u00e1n\u00ed: aplikace na .NET b\u011b\u017eela v jednom procesu. Pokud v n\u011bkter\u00e9m z modul\u016f do\u0161lo k chyb\u011b, selhalo cel\u00e9 aplikace a muselo se restartovat. Vzhledem k tomu, \u017ee automatizujeme velk\u00e9 mno\u017estv\u00ed proces\u016f pro r\u016fzn\u00e9 u\u017eivatele, kv\u016fli selh\u00e1n\u00ed v jednom z nich nemohli n\u011bjakou dobu pracovat v\u0161ichni. A p\u0159i programov\u00e9 chyb\u011b nepomohlo ani z\u00e1lohov\u00e1n\u00ed. <\/p>\n<p><u>Fronta zm\u011bn<\/u><br \/>\nTato nev\u00fdhoda je sp\u00ed\u0161e organiza\u010dn\u00ed. V na\u0161\u00ed aplikaci je mnoho z\u00e1kazn\u00edk\u016f a v\u0161ichni cht\u011bj\u00ed zm\u011bny co nejd\u0159\u00edve. D\u0159\u00edve to bylo nemo\u017en\u00e9 prov\u00e1d\u011bt paraleln\u011b, a v\u0161ichni z\u00e1kazn\u00edci se museli postavit do fronty. Tento proces vzbuzoval v podnik\u00e1n\u00ed negativn\u00ed emoce, proto\u017ee museli prokazovat, \u017ee jejich \u00fakol m\u00e1 hodnotu. A v\u00fdvojov\u00fd t\u00fdm str\u00e1vil \u010das organizov\u00e1n\u00edm t\u00e9to fronty. To zab\u00edralo mnoho \u010dasu a sil, a produkt nakonec nemohl m\u011bnit tak rychle, jak by po n\u011bm cht\u011bli.<\/p>\n<p><u>Neoptim\u00e1ln\u00ed vyu\u017eit\u00ed zdroj\u016f<\/u><br \/>\nP\u0159i nasazen\u00ed slu\u017eeb v jednotn\u00e9m procesu jsme v\u017edy pln\u011b kop\u00edrovali konfiguraci ze serveru na server. Cht\u011bli jsme um\u00edstit nejv\u00edce zat\u00ed\u017een\u00e9 slu\u017eby zvl\u00e1\u0161\u0165, abychom nepl\u00fdtvali zdroji a z\u00edskali pru\u017en\u011bj\u0161\u00ed \u0159\u00edzen\u00ed na\u0161\u00ed \u0161k\u00e1lov\u00e1n\u00ed.<\/p>\n<p><u>T\u011b\u017ek\u00e9 zav\u00e1d\u011bn\u00ed modern\u00edch technologi\u00ed<\/u><br \/>\nZn\u00e1ma probl\u00e9m, kter\u00fd v\u0161ichni v\u00fdvoj\u00e1\u0159i znaj\u00ed: existuje touha zav\u00e9st modern\u00ed technologie do projektu, ale nen\u00ed na to mo\u017enost. P\u0159i velk\u00e9m monolitick\u00e9m \u0159e\u0161en\u00ed se ka\u017ed\u00e1 aktualizace aktu\u00e1ln\u00ed knihovny, nemluv\u011b o p\u0159echodu na novou, st\u00e1v\u00e1 pom\u011brn\u011b nejednoduch\u00fdm \u00fakolem. Dlouho je pot\u0159eba dokazovat t\u00fdmov\u00e9mu vedouc\u00edmu, \u017ee to p\u0159inese v\u00edce v\u00fdhod, ne\u017e str\u00e1ven\u00fdch nerv\u016f. <\/p>\n<p><u>Slo\u017eitost vyd\u00e1v\u00e1n\u00ed zm\u011bn<\/u><br \/>\nTo byla nejz\u00e1va\u017en\u011bj\u0161\u00ed probl\u00e9m \u2014 vyd\u00e1vali jsme verze ka\u017ed\u00e9 dva m\u011bs\u00edce. <br \/>\nKa\u017ed\u00e9 vyd\u00e1n\u00ed se stalo skute\u010dnou katastrofou pro banku, navzdory testov\u00e1n\u00ed a \u00fasil\u00ed v\u00fdvoj\u00e1\u0159\u016f. Podnik\u00e1n\u00ed ch\u00e1palo, \u017ee na za\u010d\u00e1tku t\u00fddne nebude fungovat \u010d\u00e1st funk\u010dnosti. A v\u00fdvoj\u00e1\u0159i si uv\u011bdomovali, co je \u010dek\u00e1, v\u00e1\u017en\u00fd t\u00fdden incident\u016f. <br \/>\nV\u0161ichni m\u011bli touhu situaci zm\u011bnit. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"2\"><\/a><\/noindex><b><\/p>\n<h3>O\u010dek\u00e1v\u00e1n\u00ed od mikroslu\u017eeb<\/h3>\n<p><\/b><br \/>\n<u>Vyd\u00e1v\u00e1n\u00ed komponent\u016f podle p\u0159ipravenosti. <\/u>Vyd\u00e1v\u00e1n\u00ed komponent\u016f podle p\u0159ipravenosti d\u00edky dekompozici \u0159e\u0161en\u00ed a odd\u011blen\u00ed r\u016fzn\u00fdch proces\u016f.<\/p>\n<p><u>Mal\u00e9 produktov\u00e9 t\u00fdmy.<\/u> To je d\u016fle\u017eit\u00e9, proto\u017ee s velk\u00fdm t\u00fdmem pracuj\u00edc\u00edm na star\u00e9m monolitu je t\u011b\u017ek\u00e9 \u0159\u00eddit. Takov\u00fd t\u00fdm byl nucen pracovat podle p\u0159\u00edsn\u00e9ho procesu, zat\u00edmco by cht\u011bl v\u00edce kreativity a nez\u00e1vislosti. To si mohly dovolit pouze mal\u00e9 t\u00fdmy.<\/p>\n<p><u>Izolace slu\u017eeb v odd\u011blen\u00fdch procesech.<\/u> Ide\u00e1ln\u011b bychom cht\u011bli izolovat do kontejner\u016f, ale velk\u00e9 mno\u017estv\u00ed slu\u017eeb napsan\u00fdch na .NET Framework b\u011b\u017e\u00ed pouze pod Windows. V sou\u010dasnosti se objevuj\u00ed slu\u017eby na .NET Core, ale t\u011bch je zat\u00edm m\u00e1lo.<\/p>\n<p><u>Flexibilita nasazen\u00ed.<\/u> Cht\u011bli bychom kombinovat slu\u017eby tak, jak to pot\u0159ebujeme, a ne tak, jak to vy\u017eaduje k\u00f3d.<\/p>\n<p><u>Vyu\u017eit\u00ed nov\u00fdch technologi\u00ed.<\/u> To zaj\u00edm\u00e1 ka\u017ed\u00e9ho program\u00e1tora.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"3\"><\/a><\/noindex><b><\/p>\n<h3>Probl\u00e9my s p\u0159echodem<\/h3>\n<p><\/b><br \/>\nSamoz\u0159ejm\u011b, kdyby bylo snadn\u00e9 rozd\u011blit monolit na mikroslu\u017eby, nemuseli bychom o tom mluvit na konferenc\u00edch a ps\u00e1t \u010dl\u00e1nky. V tomto procesu je mnoho \u00faskal\u00ed, pop\u00ed\u0161u hlavn\u00ed, kter\u00e1 n\u00e1m br\u00e1nila.<\/p>\n<p><b>Prvn\u00ed probl\u00e9m<\/b> je typick\u00fd pro v\u011bt\u0161inu monolit\u016f: prov\u00e1zanost obchodn\u00ed logiky. Kdy\u017e p\u00ed\u0161eme monolit, chceme znovu pou\u017e\u00edvat na\u0161e t\u0159\u00eddy, abychom nenapsali zbyte\u010dn\u00fd k\u00f3d. Ale p\u0159i p\u0159echodu na mikroslu\u017eby se to st\u00e1v\u00e1 probl\u00e9mem: cel\u00fd k\u00f3d je dost pevn\u011b spojen a je t\u011b\u017ek\u00e9 slu\u017eby rozd\u011blit.<\/p>\n<p>V dob\u011b zah\u00e1jen\u00ed prac\u00ed bylo v repozit\u00e1\u0159i v\u00edce ne\u017e 500 projekt\u016f a v\u00edce ne\u017e 700 tis\u00edc \u0159\u00e1dk\u016f k\u00f3du. To je dost velk\u00e9 \u0159e\u0161en\u00ed a <b>druh\u00fd probl\u00e9m<\/b>. Jednodu\u0161e vz\u00edt a rozd\u011blit to na mikroslu\u017eby nebylo mo\u017en\u00e9.<\/p>\n<p><b>T\u0159et\u00ed probl\u00e9m<\/b> je nedostatek pot\u0159ebn\u00e9 infrastruktury. V podstat\u011b jsme se zab\u00fdvali ru\u010dn\u00edm kop\u00edrov\u00e1n\u00edm zdrojov\u00e9ho k\u00f3du na servery.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"4\"><\/a><\/noindex><b><\/p>\n<h3>Jak p\u0159ej\u00edt od monolitu k mikroslu\u017eb\u00e1m<\/h3>\n<p><\/b><br \/>\n<u>Vy\u010dlen\u011bn\u00ed mikroslu\u017eeb<\/u><\/p>\n<p>Za prv\u00e9, hned jsme si ur\u010dili, \u017ee rozd\u011blen\u00ed mikroslu\u017eeb je iterativn\u00ed proces. Od n\u00e1s se v\u017edy vy\u017eadovalo sou\u010dasn\u011b vyv\u00edjet obchodn\u00ed \u00falohy. Jak to provedeme technicky \u2014 to u\u017e je n\u00e1\u0161 probl\u00e9m. Tak\u017ee jsme se p\u0159ipravovali na iterativn\u00ed proces. Jinak to nep\u016fjde, pokud m\u00e1te velkou aplikaci a nebyla p\u016fvodn\u011b p\u0159ipravena na to, aby se p\u0159episovala.<\/p>\n<p>Jak\u00e9 m\u00e1me zp\u016fsoby pro vy\u010dlen\u011bn\u00ed mikroslu\u017eeb?<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"5\"><\/a><\/noindex><b>Prvn\u00ed zp\u016fsob <\/b>\u2014 vy\u010dle\u0148ovat st\u00e1vaj\u00edc\u00ed moduly jako slu\u017eby. V t\u00e9to souvislosti jsme m\u011bli \u0161t\u011bst\u00ed: ji\u017e existovaly slu\u017eby, kter\u00e9 pracovaly na protokolu WCF. Byly rozd\u011bleny do samostatn\u00fdch sestaven\u00ed. P\u0159en\u00e1\u0161eli jsme je jednotliv\u011b, p\u0159id\u00e1vali k ka\u017ed\u00e9 sestaven\u00ed mal\u00fd spou\u0161t\u011bc\u00ed modul. Ten byl naps\u00e1n s pomoc\u00ed \u00fa\u017easn\u00e9 knihovny Topshelf, kter\u00e1 umo\u017e\u0148uje spou\u0161t\u011bt aplikaci jak jako slu\u017ebu, tak jako konzoli. To je praktick\u00e9 pro lad\u011bn\u00ed, proto\u017ee to nevy\u017eaduje \u017e\u00e1dn\u00e9 dal\u0161\u00ed projekty v \u0159e\u0161en\u00ed.<\/p>\n<p>Slu\u017eby byly propojeny na z\u00e1klad\u011b obchodn\u00ed logiky, proto\u017ee pou\u017e\u00edvaly spole\u010dn\u00e1 sestaven\u00ed a pracovaly se spole\u010dnou datab\u00e1z\u00ed. T\u011b\u017eko je bylo nazvat \u010dist\u00fdmi mikroservisy. Nicm\u00e9n\u011b, tyto slu\u017eby jsme mohli poskytovat odd\u011blen\u011b, v r\u016fzn\u00fdch procesech. U\u017e to umo\u017enilo sn\u00ed\u017eit vz\u00e1jemn\u00fd vliv, \u010d\u00edm\u017e se vy\u0159e\u0161il probl\u00e9m s paraleln\u00edm v\u00fdvojem a jedin\u00fdm bodem selh\u00e1n\u00ed.<\/p>\n<p>Sestaven\u00ed s hostitelem je pouze jeden \u0159\u00e1dek k\u00f3du ve t\u0159\u00edd\u011b Program. Pr\u00e1ci s Topshelf jsme skryli ve pomocn\u00e9 t\u0159\u00edd\u011b.<\/p>\n<pre><code class=\"plaintext\">namespace RBA.Services.Accounts.Host\n{\n   internal class Program\n   {\n      private static void Main(string[] args)\n      {\n        HostRunner.Run(\"RBA.Services.Accounts.Host\");\n\n       }\n    }\n}\n<\/code><\/pre>\n<p>\n<noindex><a rel=\"nofollow\" name=\"6\"><\/a><\/noindex><b>Druh\u00fd zp\u016fsob vy\u010dlen\u011bn\u00ed mikroservis\u016f:<\/b> vytv\u00e1\u0159et je pro vy\u0159e\u0161en\u00ed nov\u00fdch \u00fakol\u016f. Pokud monolit p\u0159itom neroste, u\u017e to je skv\u011bl\u00e9, znamen\u00e1 to, \u017ee se ub\u00edr\u00e1me spr\u00e1vn\u00fdm sm\u011brem. Pro \u0159e\u0161en\u00ed nov\u00fdch \u00fakol\u016f jsme se sna\u017eili vytv\u00e1\u0159et samostatn\u00e9 slu\u017eby. Pokud to bylo mo\u017en\u00e9, vytv\u00e1\u0159eli jsme v\u00edce \"kanonick\u00e9\" slu\u017eby, kter\u00e9 pln\u011b spravuj\u00ed sv\u016fj datov\u00fd model a odd\u011blenou datab\u00e1zi. <\/p>\n<p>My, jako mnoho jin\u00fdch, jsme za\u010d\u00ednali se slu\u017ebami autentizace a autorizace. Ty se pro tento \u00fa\u010del ide\u00e1ln\u011b hod\u00ed. Jsou nez\u00e1visl\u00e9, obvykle maj\u00ed odd\u011blen\u00fd datov\u00fd model. Sami neinteraguj\u00ed s monolitem, pouze se s n\u00edm spoj\u00ed pro vy\u0159e\u0161en\u00ed n\u011bjak\u00fdch \u00fakol\u016f. Na t\u011bchto slu\u017eb\u00e1ch lze za\u010d\u00edt p\u0159echod na novou architekturu, otestovat na nich infrastrukturu, vyzkou\u0161et n\u011bjak\u00e9 p\u0159\u00edstupy souvisej\u00edc\u00ed se s\u00ed\u0165ov\u00fdmi knihovnami, atd. V na\u0161\u00ed organizaci nejsou t\u00fdmy, kter\u00e9 by nedok\u00e1zaly vytvo\u0159it slu\u017ebu autentizace. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"7\"><\/a><\/noindex><b>T\u0159et\u00ed zp\u016fsob vy\u010dlen\u011bn\u00ed mikroservis\u016f<\/b>, kter\u00fd pou\u017e\u00edv\u00e1me, je pro n\u00e1s trochu specifick\u00fd. Jedn\u00e1 se o odd\u011blen\u00ed byznys logiky od u\u017eivatelsk\u00e9ho rozhran\u00ed. Na\u0161e hlavn\u00ed u\u017eivatelsk\u00e1 aplikace je desktopov\u00e1, stejn\u011b jako backend je naps\u00e1na v C#. V\u00fdvoj\u00e1\u0159i se \u010das od \u010dasu dopou\u0161t\u011bli chyb a p\u0159en\u00e1\u0161eli do UI \u010d\u00e1sti logiky, kter\u00e9 m\u011bly existovat v backendu a b\u00fdt znovu vyu\u017eiteln\u00e9. <\/p>\n<p>Pokud se pod\u00edv\u00e1me na skute\u010dn\u00fd p\u0159\u00edklad z k\u00f3du u\u017eivatelsk\u00e9 \u010d\u00e1sti, vid\u00edme, \u017ee v\u011bt\u0161ina tohoto \u0159e\u0161en\u00ed obsahuje skute\u010dnou byznys logiku, kter\u00e1 je u\u017eite\u010dn\u00e1 v jin\u00fdch procesech, nejen pro vytv\u00e1\u0159en\u00ed u\u017eivatelsk\u00e9ho rozhran\u00ed. <\/p>\n<p><img decoding=\"async\" alt=\"P\u0159echod od monolitu k mikroslu\u017eb\u00e1m: historie a praxe\" src=\"\/wp-content\/uploads\/2019\/07\/74c7b90ff94b343816ab3ac2fa0673c6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSkute\u010dn\u00e1 logika u\u017eivatelsk\u00e9ho rozhran\u00ed je tam jen v posledn\u00edch dvou \u0159\u00e1dc\u00edch. P\u0159esunuli jsme ji na server, abychom ji mohli znovu vyu\u017e\u00edt, \u010d\u00edm\u017e jsme zmen\u0161ili u\u017eivatelsk\u00e9 rozhran\u00ed a dos\u00e1hli spr\u00e1vn\u00e9 architektury.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"8\"><\/a><\/noindex><b>\u010ctvrt\u00fd, nejd\u016fle\u017eit\u011bj\u0161\u00ed zp\u016fsob, jak odd\u011blit mikroslu\u017eby<\/b>, kter\u00fd umo\u017e\u0148uje sni\u017eovat monolit, je p\u0159enesen\u00ed existuj\u00edc\u00edch slu\u017eeb s p\u0159epracov\u00e1n\u00edm. Kdy\u017e p\u0159en\u00e1\u0161\u00edme existuj\u00edc\u00ed moduly tak, jak jsou, v\u00fdsledek se v\u00fdvoj\u00e1\u0159\u016fm ne v\u017edy l\u00edb\u00ed a byznys proces mohl \u010dasem zastarat. D\u00edky refaktoringu m\u016f\u017eeme podpo\u0159it nov\u00fd byznys proces, proto\u017ee po\u017eadavky podnik\u00e1n\u00ed se neust\u00e1le m\u011bn\u00ed. M\u016f\u017eeme vylep\u0161it p\u016fvodn\u00ed k\u00f3d, odstranit zn\u00e1m\u00e9 defekty a vytvo\u0159it kvalitn\u011bj\u0161\u00ed datov\u00fd model. Z\u00edsk\u00e1v\u00e1me mnoho v\u00fdhod.<\/p>\n<p>Odd\u011blen\u00ed slu\u017eeb s p\u0159epracov\u00e1n\u00edm je nerozlu\u010dn\u011b spojeno s konceptem omezen\u00e9ho kontextu. Tento koncept poch\u00e1z\u00ed z objektov\u011b orientovan\u00e9ho n\u00e1vrhu. Ozna\u010duje \u010d\u00e1st dom\u00e9nov\u00e9ho modelu, ve kter\u00e9 jsou v\u0161echny term\u00edny jednotn\u00e9ho jazyka jednozna\u010dn\u011b definov\u00e1ny. Uvedeme na p\u0159\u00edkladu kontextu poji\u0161t\u011bn\u00ed a \u00fa\u010dt\u016f. M\u00e1me monolitn\u00ed aplikaci a je t\u0159eba v poji\u0161t\u011bn\u00ed pracovat s \u00fa\u010dtem. O\u010dek\u00e1v\u00e1me, \u017ee v\u00fdvoj\u00e1\u0159 najde v jin\u00e9 sestav\u011b existuj\u00edc\u00ed t\u0159\u00eddu \u201e\u00da\u010det\u201c, odkazuje na ni z t\u0159\u00eddy \u201ePoji\u0161t\u011bn\u00ed\u201c a my dostaneme funguj\u00edc\u00ed k\u00f3d. Principe DRY bude dodr\u017eeno, \u00fakol bude d\u00edky vyu\u017eit\u00ed existuj\u00edc\u00edho k\u00f3du spln\u011bn rychleji.<\/p>\n<p>Ukazuje se, \u017ee kontexty \u00fa\u010dt\u016f a poji\u0161t\u011bn\u00ed jsou propojen\u00e9. Jakmile se objev\u00ed nov\u00e9 po\u017eadavky, toto spojen\u00ed zkomplikuje v\u00fdvoj a zv\u00fd\u0161\u00ed slo\u017eitost ji\u017e tak slo\u017eit\u00e9 obchodn\u00ed logiky. Pro \u0159e\u0161en\u00ed tohoto probl\u00e9mu je t\u0159eba v k\u00f3du nal\u00e9zt hranice mezi kontexty a odstranit jejich poru\u0161en\u00ed. Nap\u0159\u00edklad kontextu poji\u0161t\u011bn\u00ed bude pravd\u011bpodobn\u011b sta\u010dit 20mi\u00edstn\u00e9 \u010d\u00edslo \u00fa\u010dtu \u010cNB a datum otev\u0159en\u00ed \u00fa\u010dtu. <\/p>\n<p>Abychom tyto omezen\u00e9 kontexty odd\u011blili a zah\u00e1jili proces vy\u010dle\u0148ov\u00e1n\u00ed mikroslu\u017eeb z monolitick\u00e9ho \u0159e\u0161en\u00ed, pou\u017eili jsme p\u0159\u00edstup, jeho\u017e z\u00e1kladem je vytv\u00e1\u0159en\u00ed extern\u00edch API uvnit\u0159 aplikace. Pokud jsme v\u011bd\u011bli, \u017ee by se n\u011bjak\u00fd modul m\u011bl st\u00e1t mikroslu\u017ebou a n\u011bjak se m\u011bnit v r\u00e1mci procesu, ihned jsme prov\u00e1d\u011bli vol\u00e1n\u00ed logiky, kter\u00e1 pat\u0159\u00ed do jin\u00e9ho omezen\u00e9ho kontextu, prost\u0159ednictv\u00edm extern\u00edch v\u00fdzev. Nap\u0159\u00edklad pomoc\u00ed REST nebo WCF.<\/p>\n<p>Rozhodli jsme se, \u017ee se nebudeme vyh\u00fdbat k\u00f3du, kter\u00fd bude vy\u017eadovat prov\u00e1d\u011bn\u00ed distribuovan\u00fdch transakc\u00ed. V na\u0161em p\u0159\u00edpad\u011b se uk\u00e1zalo, \u017ee dodr\u017eovat toto pravidlo je dost snadn\u00e9. Dosud nenastaly situace, kdy by byly opravdu pot\u0159ebn\u00e9 tvrd\u00e9 distribuovan\u00e9 transakce \u2014 sta\u010d\u00ed kone\u010dn\u00e1 konzistence mezi moduly.<\/p>\n<p>Zva\u017eme konkr\u00e9tn\u00ed p\u0159\u00edklad. M\u00e1me pojem orchestr\u00e1tora \u2014 potrub\u00ed, kter\u00e9 zpracov\u00e1v\u00e1 entitu \u201e\u017e\u00e1dosti\u201c. Postupn\u011b vytv\u00e1\u0159\u00ed klienta, \u00fa\u010det a bankovn\u00ed kartu. Pokud jsou klient a \u00fa\u010det \u00fasp\u011b\u0161n\u011b vytvo\u0159eny, ale vytvo\u0159en\u00ed karty sel\u017ee, \u017e\u00e1dost nep\u0159ejde do stavu \u201e\u00fasp\u011b\u0161n\u011b\u201c a z\u016fstane ve stavu \u201ekart\u011b nebyla vytvo\u0159ena\u201c. V budoucnu tuto \u017e\u00e1dost zpracuje pozad\u00ed a dokon\u010d\u00ed ji. Syst\u00e9m je n\u011bjakou dobu v nesourod\u00e9m stavu, ale celkov\u011b n\u00e1s to uspokojuje.<\/p>\n<p>Pokud p\u0159ece jen nastane situace, kdy bude t\u0159eba souhlasn\u011b ulo\u017eit \u010d\u00e1st dat, pravd\u011bpodobn\u011b p\u0159istoup\u00edme ke zv\u011bt\u0161en\u00ed slu\u017eby, abychom to zpracovali v jednom procesu. <\/p>\n<p>Zva\u017eme p\u0159\u00edklad vy\u010dlen\u011bn\u00ed mikroslu\u017eby. Jak\u00fdm zp\u016fsobem lze relativn\u011b bezpe\u010dn\u011b dostat tuto mikroslu\u017ebu do produkce? V tomto p\u0159\u00edkladu m\u00e1me samostatnou \u010d\u00e1st syst\u00e9mu \u2014 modul v\u00fdplaty, z jeho\u017e \u010d\u00e1sti k\u00f3du bychom cht\u011bli vytvo\u0159it mikroslu\u017ebu.<\/p>\n<p><img decoding=\"async\" alt=\"P\u0159echod od monolitu k mikroslu\u017eb\u00e1m: historie a praxe\" src=\"\/wp-content\/uploads\/2019\/07\/346af271b0c3f99897d330e56f713f18.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNejd\u0159\u00edve vytvo\u0159\u00edme mikroslu\u017ebu p\u0159eps\u00e1n\u00edm k\u00f3du. Zlep\u0161ujeme n\u011bkter\u00e9 aspekty, kter\u00e9 n\u00e1m nevyhovovaly. Implementujeme nov\u00e9 obchodn\u00ed po\u017eadavky od z\u00e1kazn\u00edka. P\u0159id\u00e1v\u00e1me do spojen\u00ed mezi UI a backendem API Gateway, kter\u00fd zajist\u00ed zprost\u0159edkov\u00e1n\u00ed vol\u00e1n\u00ed. <\/p>\n<p><img decoding=\"async\" alt=\"P\u0159echod od monolitu k mikroslu\u017eb\u00e1m: historie a praxe\" src=\"\/wp-content\/uploads\/2019\/07\/bec8d68f20f3ec53af0cef225a51c2b3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00e1sledn\u011b nasazujeme tuto konfiguraci do provozu, ale v pilotn\u00edm stavu. V\u011bt\u0161ina u\u017eivatel\u016f st\u00e1le pracuje se star\u00fdmi obchodn\u00edmi procesy. Pro nov\u00e9 u\u017eivatele vyv\u00edj\u00edme novou verzi monolitick\u00e9 aplikace, kter\u00e1 tento proces ji\u017e neobsahuje. V podstat\u011b m\u00e1me v pilotn\u00edm re\u017eimu spojen\u00ed monolitu a mikroslu\u017eby.<\/p>\n<p><img decoding=\"async\" alt=\"P\u0159echod od monolitu k mikroslu\u017eb\u00e1m: historie a praxe\" src=\"\/wp-content\/uploads\/2019\/07\/27e98812746bb7f142fa3a3c3a03b52f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u0159i \u00fasp\u011b\u0161n\u00e9m pilotu ch\u00e1peme, \u017ee nov\u00e1 konfigurace je skute\u010dn\u011b funk\u010dn\u00ed, m\u016f\u017eeme odstranit star\u00fd monolit a ponechat novou konfiguraci na m\u00edst\u011b star\u00e9ho \u0159e\u0161en\u00ed.<\/p>\n<p><img decoding=\"async\" alt=\"P\u0159echod od monolitu k mikroslu\u017eb\u00e1m: historie a praxe\" src=\"\/wp-content\/uploads\/2019\/07\/11dcf1d771b57d3921c0aa91b82646e1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCelkov\u011b pou\u017e\u00edv\u00e1me prakticky v\u0161echny existuj\u00edc\u00ed metody rozd\u011blen\u00ed zdrojov\u00e9ho k\u00f3du monolitu. V\u0161echny n\u00e1m umo\u017e\u0148uj\u00ed zmen\u0161ovat velikost \u010d\u00e1st\u00ed aplikace a p\u0159ev\u00e1d\u011bt je na nov\u00e9 knihovny, \u010d\u00edm\u017e zaji\u0161\u0165ujeme kvalitn\u011bj\u0161\u00ed zdrojov\u00fd k\u00f3d.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"9\"><\/a><\/noindex><b><\/p>\n<h3>Pr\u00e1ce s DB<\/h3>\n<p><\/b><br \/>\nDB se d\u011bl\u00ed h\u016f\u0159e ne\u017e zdrojov\u00fd k\u00f3d, proto\u017ee obsahuje nejen aktu\u00e1ln\u00ed sch\u00e9ma, ale tak\u00e9 shrom\u00e1\u017ed\u011bn\u00e9 historick\u00e9 \u00fadaje.<\/p>\n<p>Na\u0161e DB, jako u mnoha dal\u0161\u00edch, m\u011bla je\u0161t\u011b jednu d\u016fle\u017eitou nev\u00fdhodu \u2013 obrovskou velikost. Tato DB byla navr\u017eena podle slo\u017eit\u00e9 obchodn\u00ed logiky monolitu, a mezi tabulkami r\u016fzn\u00fdch omezen\u00fdch kontext\u016f se nahromadily vazby.<\/p>\n<p>V na\u0161em p\u0159\u00edpad\u011b, aby toho nebylo m\u00e1lo (velk\u00e1 datab\u00e1ze, mno\u017estv\u00ed vazeb, n\u011bkdy nejasn\u00e9 hranice mezi tabulkami), vznikl probl\u00e9m, se kter\u00fdm se setk\u00e1v\u00e1me v mnoha velk\u00fdch projektech: pou\u017eit\u00ed vzoru sd\u00edlen\u00e9 datab\u00e1ze. Data se brala z tabulek prost\u0159ednictv\u00edm pohled\u016f, prost\u0159ednictv\u00edm replikace a byla pos\u00edl\u00e1na do jin\u00fdch syst\u00e9m\u016f, kde byla tato replikace pot\u0159ebn\u00e1. V d\u016fsledku toho jsme nemohli p\u0159esunout tabulky do samostatn\u00e9ho sch\u00e9matu, proto\u017ee byly aktivn\u011b pou\u017e\u00edv\u00e1ny.<\/p>\n<p>V rozd\u011blen\u00ed n\u00e1m pom\u00e1h\u00e1 pr\u00e1v\u011b ono rozd\u011blen\u00ed na omezen\u00e9 kontexty v k\u00f3du. Obvykle n\u00e1m d\u00e1v\u00e1 dostate\u010dn\u011b dobr\u00e9 p\u0159edstavy o tom, jak rozd\u011blujeme data na \u00farovni datab\u00e1ze. Ch\u00e1peme, kter\u00e9 tabulky pat\u0159\u00ed do jednoho omezen\u00e9ho kontextu, a kter\u00e9 do jin\u00e9ho.<\/p>\n<p>Zavedli jsme dva glob\u00e1ln\u00ed zp\u016fsoby odd\u011blen\u00ed datab\u00e1ze: odd\u011blen\u00ed st\u00e1vaj\u00edc\u00edch tabulek a odd\u011blen\u00ed s p\u0159epracov\u00e1n\u00edm.<\/p>\n<p>Odd\u011blen\u00ed st\u00e1vaj\u00edc\u00edch tabulek je metoda, kter\u00e1 se dob\u0159e pou\u017e\u00edv\u00e1, pokud je struktura dat kvalitn\u00ed, vyhovuje obchodn\u00edm po\u017eadavk\u016fm a v\u0161em vyhovuje. V takov\u00e9m p\u0159\u00edpad\u011b m\u016f\u017eeme st\u00e1vaj\u00edc\u00ed tabulky vy\u010dlenit do samostatn\u00e9 sch\u00e9matu.<\/p>\n<p>Odd\u011blen\u00ed s p\u0159epracov\u00e1n\u00edm je pot\u0159eba, kdy\u017e se obchodn\u00ed model v\u00fdrazn\u011b zm\u011bnil a tabulky n\u00e1s u\u017e v\u016fbec nevyhovuj\u00ed.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"10\"><\/a><\/noindex><b>Odd\u011blen\u00ed st\u00e1vaj\u00edc\u00edch tabulek.<\/b> Mus\u00edme ur\u010dit, co budeme odd\u011blovat. Bez t\u00e9to znalosti nic nez\u00edsk\u00e1me a zde n\u00e1m pom\u016f\u017ee odd\u011blen\u00ed omezen\u00fdch kontext\u016f v k\u00f3du. Obvykle, pokud je mo\u017en\u00e9 pochopit hranice kontext\u016f ve zdrojov\u00e9m k\u00f3du, st\u00e1v\u00e1 se jasn\u00e9, kter\u00e9 tabulky by m\u011bly b\u00fdt na seznamu k odd\u011blen\u00ed.<\/p>\n<p>P\u0159edstavme si, \u017ee m\u00e1me \u0159e\u0161en\u00ed, kde dva moduly monolitu komunikuj\u00ed s jednou datab\u00e1z\u00ed. Mus\u00edme zajistit, aby s odd\u011blen\u00fdmi tabulkami komunikoval pouze jeden modul, zat\u00edmco druh\u00fd za\u010dal komunikovat s n\u00edm p\u0159es API. Zpo\u010d\u00e1tku sta\u010d\u00ed, aby se p\u0159es API prov\u00e1d\u011blo pouze zapisov\u00e1n\u00ed. To je nezbytn\u00fd p\u0159edpoklad, abychom mohli mluvit o nez\u00e1vislosti mikroslu\u017eeb. \u010cten\u00e1\u0159sk\u00e9 vazby mohou z\u016fstat, pokud v tom nen\u00ed \u017e\u00e1dn\u00fd velk\u00fd probl\u00e9m.<\/p>\n<p><img decoding=\"async\" alt=\"P\u0159echod od monolitu k mikroslu\u017eb\u00e1m: historie a praxe\" src=\"\/wp-content\/uploads\/2019\/07\/1602637ad752ac055f475cfa45d95e95.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDal\u0161\u00edm krokem ji\u017e m\u016f\u017eeme \u010d\u00e1st k\u00f3du pracuj\u00edc\u00ed s odd\u011blen\u00fdmi tabulkami, a\u0165 u\u017e s p\u0159epracov\u00e1n\u00edm nebo bez n\u011bj, vy\u010dlenit do samostatn\u00e9 mikroslu\u017eby a spustit v samostatn\u00e9m procesu, konteineru. To bude samostatn\u00e1 slu\u017eba s vazbou na datab\u00e1zi monolitu a na ty tabulky, kter\u00e9 se jej p\u0159\u00edmo net\u00fdkaj\u00ed. Monolit je\u0161t\u011b interaguje na \u010dten\u00ed s odd\u011blenou \u010d\u00e1st\u00ed. <\/p>\n<p><img decoding=\"async\" alt=\"P\u0159echod od monolitu k mikroslu\u017eb\u00e1m: historie a praxe\" src=\"\/wp-content\/uploads\/2019\/07\/36011f4e6be4f6a2f19f2f074b645dcb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPozd\u011bji tuto vazbu odstran\u00edme, tedy \u010dten\u00ed dat monolitick\u00e9 aplikace z odd\u011blen\u00fdch tabulek tak\u00e9 p\u0159evedeme na API.<\/p>\n<p><img decoding=\"async\" alt=\"P\u0159echod od monolitu k mikroslu\u017eb\u00e1m: historie a praxe\" src=\"\/wp-content\/uploads\/2019\/07\/290f91bbfccac2a4b384078e4cf4e337.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nD\u00e1le vy\u010dlen\u00edme z obecn\u00e9 datab\u00e1ze tabulky, se kter\u00fdmi pracuje pouze nov\u00e1 mikroslu\u017eba. M\u016f\u017eeme vyv\u00e9st tabulky do samostatn\u00e9 sch\u00e9matu nebo dokonce do samostatn\u00e9 fyzick\u00e9 datab\u00e1ze. Z\u016fstala vazba na \u010dten\u00ed mezi mikroslu\u017ebou a datab\u00e1z\u00ed monolitu, ale na tom nen\u00ed nic hrozn\u00e9ho; v takov\u00e9 konfiguraci m\u016f\u017ee existovat dost dlouho.<\/p>\n<p><img decoding=\"async\" alt=\"P\u0159echod od monolitu k mikroslu\u017eb\u00e1m: historie a praxe\" src=\"\/wp-content\/uploads\/2019\/07\/ab947ac6a38ffbccd4e2b51103aef609.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPosledn\u00ed krok \u2014 zcela odstranit v\u0161echny vazby. V tomto p\u0159\u00edpad\u011b mo\u017en\u00e1 budeme pot\u0159ebovat migraci dat z hlavn\u00ed datab\u00e1ze. N\u011bkdy budeme cht\u00edt znovu pou\u017e\u00edt v n\u011bkolika datab\u00e1z\u00edch n\u011bjak\u00e9 replikovan\u00e9 z extern\u00edch syst\u00e9m\u016f data nebo referen\u010dn\u00ed informace. S t\u00edm se u n\u00e1s ob\u010das setk\u00e1v\u00e1me.<\/p>\n<p><img decoding=\"async\" alt=\"P\u0159echod od monolitu k mikroslu\u017eb\u00e1m: historie a praxe\" src=\"\/wp-content\/uploads\/2019\/07\/f40cf17dd56b9575751e370c44f08344.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<noindex><a rel=\"nofollow\" name=\"11\"><\/a><\/noindex><b>Odd\u011blen\u00ed s p\u0159epracov\u00e1n\u00edm.<\/b> Tato metoda je velmi podobn\u00e1 prvn\u00ed, jen prob\u00edh\u00e1 v opa\u010dn\u00e9m po\u0159ad\u00ed. Ihned si vytvo\u0159\u00edme novou datab\u00e1zi a nov\u00fd mikroslu\u017ebu, kter\u00e1 komunikuje s monolitick\u00fdm syst\u00e9mem p\u0159es API. Av\u0161ak z\u016fst\u00e1v\u00e1 soubor tabulek datab\u00e1ze, kter\u00e9 chceme v budoucnu odstranit. Nebude n\u00e1m ji\u017e pot\u0159ebn\u00e9, v nov\u00e9m modelu jsme je nahradili.<\/p>\n<p><img decoding=\"async\" alt=\"P\u0159echod od monolitu k mikroslu\u017eb\u00e1m: historie a praxe\" src=\"\/wp-content\/uploads\/2019\/07\/c94932033e47cfa1fd56595ab9a19246.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAby tento sch\u00e9ma fungovalo, pravd\u011bpodobn\u011b budeme pot\u0159ebovat p\u0159echodn\u00e9 obdob\u00ed.<\/p>\n<p>D\u00e1le existuj\u00ed dva mo\u017en\u00e9 p\u0159\u00edstupy.<\/p>\n<p><b>Prvn\u00ed<\/b>: duplikujeme v\u0161echny \u00fadaje v nov\u00e9 a star\u00e9 datab\u00e1zi. V tomto p\u0159\u00edpad\u011b vznik\u00e1 redundance dat, mohou nastat probl\u00e9my se synchronizac\u00ed. Ale m\u016f\u017eeme m\u00edt dva r\u016fzn\u00e9 klienty. Jeden bude pracovat s novou verz\u00ed, druh\u00fd se starou.<\/p>\n<p><b>Druh\u00fd<\/b>: rozd\u011bl\u00edme \u00fadaje podle n\u011bjak\u00e9ho obchodn\u00edho znaku. Nap\u0159\u00edklad v na\u0161em syst\u00e9mu bylo 5 produkt\u016f, kter\u00e9 jsou uchov\u00e1v\u00e1ny ve star\u00e9 datab\u00e1zi. \u0160est\u00fd v r\u00e1mci nov\u00e9 obchodn\u00ed \u00falohy vkl\u00e1d\u00e1me do nov\u00e9 datab\u00e1ze. Ale budeme pot\u0159ebovat API Gateway, kter\u00fd tyto \u00fadaje synchronizuje a uk\u00e1\u017ee klientovi, odkud a co br\u00e1t.<\/p>\n<p>Oba p\u0159\u00edstupy jsou efektivn\u00ed, vyberte podle situace.<\/p>\n<p>Jakmile se ujist\u00edme, \u017ee v\u0161e funguje, \u010d\u00e1st monolitu, kter\u00e1 pracuje se star\u00fdmi strukturami datab\u00e1ze, lze odpojit. <\/p>\n<p><img decoding=\"async\" alt=\"P\u0159echod od monolitu k mikroslu\u017eb\u00e1m: historie a praxe\" src=\"\/wp-content\/uploads\/2019\/07\/973bf5015bdf49a290a5b901f89628cc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPosledn\u00edm krokem bude odstran\u011bn\u00ed star\u00fdch datov\u00fdch struktur. <\/p>\n<p><img decoding=\"async\" alt=\"P\u0159echod od monolitu k mikroslu\u017eb\u00e1m: historie a praxe\" src=\"\/wp-content\/uploads\/2019\/07\/fe83acc07077b7eb3717138e3c20c005.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nShrneme-li, m\u016f\u017eeme \u0159\u00edci, \u017ee m\u00e1me probl\u00e9my s datab\u00e1zemi: je obt\u00ed\u017en\u00e9 s nimi pracovat v porovn\u00e1n\u00ed se zdrojov\u00fdm k\u00f3dem, je t\u011b\u017e\u0161\u00ed je rozd\u011blit, ale je to mo\u017en\u00e9 a nutn\u00e9. Na\u0161li jsme n\u011bkter\u00e9 zp\u016fsoby, kter\u00e9 umo\u017e\u0148uj\u00ed to d\u011blat dostate\u010dn\u011b bezpe\u010dn\u011b, p\u0159ece jen chyba v datech je snaz\u0161\u00ed ne\u017e ve zdrojov\u00e9m k\u00f3du. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"12\"><\/a><\/noindex><b><\/p>\n<h3>Pr\u00e1ce se zdrojov\u00fdm k\u00f3dem<\/h3>\n<p><\/b><br \/>\nTakto vypadala sch\u00e9ma zdrojov\u00e9ho k\u00f3du, kdy\u017e jsme za\u010dali analyzovat monolitick\u00fd projekt.<\/p>\n<p><img decoding=\"async\" alt=\"P\u0159echod od monolitu k mikroslu\u017eb\u00e1m: historie a praxe\" src=\"\/wp-content\/uploads\/2019\/07\/a6d886e37117ccf8f63106d6616aa653.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLze ji podm\u00edn\u011bn\u011b rozd\u011blit na t\u0159i vrstvy. Prvn\u00ed vrstva zahrnuje spou\u0161t\u011bn\u00e9 moduly, pluginy, slu\u017eby a jednotliv\u00e9 aktivity. Ve skute\u010dnosti to byly vstupn\u00ed body uvnit\u0159 monolitick\u00e9ho \u0159e\u0161en\u00ed. V\u0161echny byly pevn\u011b spojeny vrstvou Common. Obsahovala spole\u010dnou obchodn\u00ed logiku, kterou vyu\u017e\u00edvaly slu\u017eby, a mno\u017estv\u00ed vazeb. Ka\u017ed\u00e1 slu\u017eba a plugin pou\u017e\u00edvaly a\u017e 10 a v\u00edce spole\u010dn\u00fdch sestaven\u00ed, v z\u00e1vislosti na jejich velikosti a sv\u011bdom\u00ed v\u00fdvoj\u00e1\u0159\u016f.<\/p>\n<p>M\u011bli jsme \u0161t\u011bst\u00ed, proto\u017ee jsme m\u011bli infrastrukturn\u00ed knihovny, kter\u00e9 bylo mo\u017en\u00e9 pou\u017e\u00edvat samostatn\u011b. <\/p>\n<p>Ob\u010das se objevila situace, \u017ee n\u011bkter\u00e9 objekty Common ve skute\u010dnosti nepat\u0159ily do t\u00e9to vrstvy, ale byly infrastrukturn\u00edmi knihovnami. To se \u0159e\u0161ilo p\u0159ejmenov\u00e1n\u00edm.<\/p>\n<p>Nejv\u011bt\u0161\u00ed obavy vyvol\u00e1valy omezen\u00e9 kontexty. N\u011bkdy se 3-4 kontexty m\u00edsily v jednom sestaven\u00ed Common a vz\u00e1jemn\u011b se vyu\u017e\u00edvaly v r\u00e1mci stejn\u00fdch obchodn\u00edch funkc\u00ed. Bylo nutn\u00e9 pochopit, kde je mo\u017en\u00e9 prov\u00e9st odd\u011blen\u00ed a jak\u00e9 hranice stanovit, a co d\u00e1l d\u011blat s mapov\u00e1n\u00edm tohoto rozd\u011blen\u00ed na sestaven\u00ed zdrojov\u00e9ho k\u00f3du.<\/p>\n<p>Formulovali jsme n\u011bkolik pravidel pro proces rozd\u011blen\u00ed k\u00f3du.<\/p>\n<p><b>Prvn\u00ed<\/b>: necht\u011bli jsme ji\u017e sd\u00edlet obchodn\u00ed logiku mezi slu\u017ebami, aktivitami a pluginy. Cht\u011bli jsme, aby byla obchodn\u00ed logika nez\u00e1visl\u00e1 v r\u00e1mci mikroslu\u017eeb. Na druh\u00e9 stran\u011b, mikroslu\u017eby by ide\u00e1ln\u011b m\u011bly b\u00fdt vn\u00edm\u00e1ny jako slu\u017eby, kter\u00e9 existuj\u00ed zcela nez\u00e1visle. Pova\u017euji tento p\u0159\u00edstup za pon\u011bkud pl\u00fdtvav\u00fd a je obt\u00ed\u017en\u00e9 ho dos\u00e1hnout, proto\u017ee nap\u0159\u00edklad slu\u017eby v C# budou v ka\u017ed\u00e9m p\u0159\u00edpad\u011b spojeny se standardn\u00ed knihovnou. N\u00e1\u0161 syst\u00e9m je naps\u00e1n v C#, zat\u00edm jsme nem\u011bli pot\u0159ebu pou\u017e\u00edvat jin\u00e9 technologie. Proto jsme se rozhodli, \u017ee si m\u016f\u017eeme dovolit pou\u017e\u00edvat spole\u010dn\u00e1 technick\u00e1 sestaven\u00ed. Hlavn\u011b aby v nich nebyly \u017e\u00e1dn\u00e9 fragmenty obchodn\u00ed logiky. Pokud m\u00e1te pohodln\u00fd obal nad ORM, kter\u00e9 pou\u017e\u00edv\u00e1te, pak jeho kop\u00edrov\u00e1n\u00ed z jedn\u00e9 slu\u017eby do druh\u00e9 je velmi n\u00e1kladn\u00e9.<\/p>\n<p>N\u00e1\u0161 t\u00fdm je fanou\u0161kem dom\u00e9nov\u011b orientovan\u00e9ho n\u00e1vrhu, tak\u017ee n\u00e1m \"cibulov\u00e1 architektura\" skv\u011ble vyhovuje. Z\u00e1kladem na\u0161ich slu\u017eeb se stal nikoli datov\u00fd p\u0159\u00edstupov\u00fd vrstva, ale sestaven\u00ed s dom\u00e9novou logikou, kter\u00e9 obsahuje pouze obchodn\u00ed logiku a je zbaveno vazeb na infrastrukturu. P\u0159itom m\u016f\u017eeme nez\u00e1visle rozv\u00edjet dom\u00e9nov\u00e9 sestaven\u00ed za \u00fa\u010delem \u0159e\u0161en\u00ed probl\u00e9m\u016f souvisej\u00edc\u00edch s frameworky.<\/p>\n<p>Na t\u00e9to \u00farovni jsme \u010delili prvn\u00ed v\u00e1\u017en\u00e9 v\u00fdzv\u011b. Slu\u017eba m\u011bla odkazovat na jednu dom\u00e9novou sestavu, logiku jsme cht\u011bli ud\u011blat nez\u00e1vislou, a princip DRY n\u00e1m v tom velmi p\u0159ek\u00e1\u017eel. V\u00fdvoj\u00e1\u0159i cht\u011bli, aby se vyhnuli duplikaci, a tak za\u010dali znovu pou\u017e\u00edvat t\u0159\u00eddy ze sousedn\u00edch sestav, co\u017e vedlo k tomu, \u017ee se dom\u00e9ny op\u011bt za\u010daly vz\u00e1jemn\u011b propojovat. Analyzovali jsme v\u00fdsledky a usoudili, \u017ee probl\u00e9m m\u016f\u017ee spo\u010d\u00edvat tak\u00e9 v oblasti struktury \u00falo\u017ei\u0161t\u011b zdrojov\u00e9ho k\u00f3du. M\u011bli jsme velk\u00fd repozit\u00e1\u0159, kde byly ulo\u017eeny v\u0161echny zdrojov\u00e9 k\u00f3dy. \u0158e\u0161en\u00ed pro cel\u00fd projekt se velmi obt\u00ed\u017en\u011b shroma\u017e\u010fovalo na lok\u00e1ln\u00edm stroji. Proto byly pro \u010d\u00e1sti projektu vytv\u00e1\u0159eny samostatn\u00e9 mal\u00e9 \u0159e\u0161en\u00ed, a nikdo nezakazoval p\u0159idat do nich n\u011bjakou spole\u010dnou nebo dom\u00e9novou sestavu a op\u011btovn\u011b je pou\u017e\u00edvat. Jedin\u00fdm n\u00e1strojem, kter\u00fd n\u00e1m to nedovoloval, byla revize k\u00f3du. Ale n\u011bkdy i ten selhal.<\/p>\n<p>Tehdy jsme za\u010dali p\u0159ech\u00e1zet na model se samostatn\u00fdmi repozit\u00e1\u0159i. Obchodn\u00ed logika p\u0159estala unikat ze slu\u017eby do slu\u017eby, dom\u00e9ny se skute\u010dn\u011b staly nez\u00e1visl\u00fdmi. Omezen\u00e9 kontexty jsou podporov\u00e1ny jasn\u011bji. Jak jsme p\u0159itom znovu pou\u017e\u00edvali infrastrukturn\u00ed knihovny? Vy\u010dlenili jsme je do samostatn\u00e9ho repozit\u00e1\u0159e, pot\u00e9 jsme je um\u00edstili do Nuget bal\u00ed\u010dk\u016f, kter\u00e9 jsme ulo\u017eili do Artifactory. P\u0159i jak\u00e9koli zm\u011bn\u011b se sestaven\u00ed a publikov\u00e1n\u00ed prov\u00e1d\u00ed automaticky.<\/p>\n<p><img decoding=\"async\" alt=\"P\u0159echod od monolitu k mikroslu\u017eb\u00e1m: historie a praxe\" src=\"\/wp-content\/uploads\/2019\/07\/8ddbc750dc7c6d397a459acf7825de90.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNa\u0161e slu\u017eby za\u010daly odkazovat na intern\u00ed infrastrukturn\u00ed bal\u00ed\u010dky p\u0159esn\u011b tak, jak na extern\u00ed. Extern\u00ed knihovny stahujeme z Nugetu. Pro pr\u00e1ci s Artifactory, kde jsme tyto bal\u00ed\u010dky um\u00edstili, jsme pou\u017eili dva spr\u00e1vce bal\u00ed\u010dk\u016f. V mal\u00fdch repozit\u00e1\u0159\u00edch jsme tak\u00e9 pou\u017e\u00edvali Nuget. V repozit\u00e1\u0159\u00edch se v\u00edce slu\u017ebami jsme pou\u017eili Paket, kter\u00fd zaji\u0161\u0165uje v\u011bt\u0161\u00ed konzistenci verz\u00ed mezi moduly.<\/p>\n<p><img decoding=\"async\" alt=\"P\u0159echod od monolitu k mikroslu\u017eb\u00e1m: historie a praxe\" src=\"\/wp-content\/uploads\/2019\/07\/672a25a70a481bff68baebe963184ccd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPrac\u00ed na zdrojov\u00e9m k\u00f3du, m\u00edrn\u011b m\u011bn\u00edme architekturu a odd\u011blujeme repozit\u00e1\u0159e, \u010din\u00edme na\u0161e slu\u017eby nez\u00e1vislej\u0161\u00edmi.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"13\"><\/a><\/noindex><b><\/p>\n<h3>Probl\u00e9my infrastruktury<\/h3>\n<p><\/b><br \/>\nV\u011bt\u0161ina probl\u00e9m\u016f p\u0159i p\u0159echodu na mikroslu\u017eby souvis\u00ed s infrastrukturou. Budete pot\u0159ebovat automatizovan\u00e9 nasazen\u00ed a nov\u00e9 knihovny na pr\u00e1ci s infrastrukturou.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"16\"><\/a><\/noindex><b>Ru\u010dn\u011b instalovat do prost\u0159ed\u00ed<\/b><\/p>\n<p>P\u016fvodn\u011b jsme \u0159e\u0161en\u00ed na prost\u0159ed\u00ed instalovali ru\u010dn\u011b. Abychom automatizovali tento proces, vytvo\u0159ili jsme CI\/CD pipeline. Zvolili jsme proces continuous delivery, proto\u017ee continuous deployment se pro n\u00e1s zat\u00edm jev\u00ed jako nep\u0159ijateln\u00fd z hlediska obchodn\u00edch proces\u016f. Nasazen\u00ed se proto prov\u00e1d\u00ed na tla\u010d\u00edtko, zat\u00edmco testov\u00e1n\u00ed prob\u00edh\u00e1 automaticky.<\/p>\n<p><img decoding=\"async\" alt=\"P\u0159echod od monolitu k mikroslu\u017eb\u00e1m: historie a praxe\" src=\"\/wp-content\/uploads\/2019\/07\/0fc092326a48813398c6f3a031197bab.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPou\u017e\u00edv\u00e1me Atlassian, Bitbucket pro ukl\u00e1d\u00e1n\u00ed zdrojov\u00fdch k\u00f3d\u016f a Bamboo pro sestaven\u00ed. R\u00e1di p\u00ed\u0161eme sestavovac\u00ed skripty v Cake, proto\u017ee to je stejn\u00fd jazyk jako C#. V Artifactory p\u0159ich\u00e1zej\u00ed hotov\u00e9 bal\u00ed\u010dky a Ansible je automaticky nasazuje na testovac\u00ed servery, kter\u00e9 lze ihned otestovat.<\/p>\n<p><img decoding=\"async\" alt=\"P\u0159echod od monolitu k mikroslu\u017eb\u00e1m: historie a praxe\" src=\"\/wp-content\/uploads\/2019\/07\/fcc743cfaa4a24b906ceeb40ec1ba0a0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<noindex><a rel=\"nofollow\" name=\"14\"><\/a><\/noindex><b><\/p>\n<h3>Odd\u011blen\u00e9 logov\u00e1n\u00ed<\/h3>\n<p><\/b><br \/>\nV dob\u011b vzniku byla jednou z my\u0161lenek monolitu zaji\u0161\u0165ov\u00e1n\u00ed spole\u010dn\u00e9ho logov\u00e1n\u00ed. Tak\u00e9 jsme pot\u0159ebovali pochopit, co d\u011blat s individu\u00e1ln\u00edmi logy, kter\u00e9 jsou na disc\u00edch. Logy zapisujeme do textov\u00fdch soubor\u016f. Rozhodli jsme se pou\u017e\u00edt standardn\u00ed ELK stack. Nep\u00ed\u0161eme p\u0159\u00edmo do ELK p\u0159es providery, ale rozhodli jsme se, \u017ee uprav\u00edme textov\u00e9 logy tak, aby obsahovaly ID trasov\u00e1n\u00ed ve form\u011b identifik\u00e1toru, p\u0159i\u010dem\u017e p\u0159id\u00e1me jm\u00e9no slu\u017eby, aby se tyto logy daly pozd\u011bji analyzovat.<\/p>\n<p><img decoding=\"async\" alt=\"P\u0159echod od monolitu k mikroslu\u017eb\u00e1m: historie a praxe\" src=\"\/wp-content\/uploads\/2019\/07\/8e58c66ac134e65abe34b59939f31483.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS pomoc\u00ed Filebeat z\u00edsk\u00e1v\u00e1me mo\u017enost shroma\u017e\u010fovat na\u0161e logy z <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/cs\/server\/\"   title=\"servery\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1338\">servery<\/a>, pak je transformovat, pomoc\u00ed Kibany sestavovat dotazy v u\u017eivatelsk\u00e9m rozhran\u00ed a sledovat, jak prob\u00edhaly vol\u00e1n\u00ed mezi slu\u017ebami. To v\u00fdrazn\u011b pom\u00e1h\u00e1 ID trasov\u00e1n\u00ed.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"15\"><\/a><\/noindex><b><\/p>\n<h3>Testov\u00e1n\u00ed a lad\u011bn\u00ed souvisej\u00edc\u00edch slu\u017eeb<\/h3>\n<p><\/b><br \/>\nZpo\u010d\u00e1tku jsme si \u00fapln\u011b nebyli jisti, jak ladit vyv\u00edjen\u00e9 slu\u017eby. S monolitem to bylo jednoduch\u00e9, spustili jsme ho na m\u00edstn\u00edm po\u010d\u00edta\u010di. Zpo\u010d\u00e1tku jsme se o to pokou\u0161eli i s mikroslu\u017ebami, ale n\u011bkdy pro pln\u00e9 spu\u0161t\u011bn\u00ed jedn\u00e9 mikroslu\u017eby je t\u0159eba spustit i n\u011bkolik dal\u0161\u00edch, co\u017e je nepohodln\u00e9. Pochopili jsme, \u017ee je nutn\u00e9 p\u0159ej\u00edt k modelu, kde na m\u00edstn\u00edm po\u010d\u00edta\u010di nech\u00e1me pouze slu\u017ebu nebo slu\u017eby, kter\u00e9 chceme ladit. Ostatn\u00ed slu\u017eby jsou pou\u017e\u00edv\u00e1ny ze server\u016f, kter\u00e9 se konfigurac\u00ed shoduj\u00ed s produk\u010dn\u00edm prost\u0159ed\u00edm. Po lad\u011bn\u00ed se p\u0159i testov\u00e1n\u00ed na testovac\u00ed server nasazuj\u00ed pouze zm\u011bn\u011bn\u00e9 slu\u017eby. T\u00edmto zp\u016fsobem se testuje \u0159e\u0161en\u00ed v podob\u011b, ve kter\u00e9 se v budoucnu ocitne na produkci.<\/p>\n<p>Existuj\u00ed servery, na kter\u00fdch jsou pouze produk\u010dn\u00ed verze slu\u017eeb. Tyto servery jsou pot\u0159eba pro p\u0159\u00edpad incident\u016f, pro kontrolu dod\u00e1vky p\u0159ed nasazen\u00edm a pro intern\u00ed \u0161kolen\u00ed.<\/p>\n<p>P\u0159idali jsme proces automatick\u00e9ho testov\u00e1n\u00ed pomoc\u00ed popul\u00e1rn\u00ed knihovny Specflow. Testy se spou\u0161t\u011bj\u00ed automaticky pomoc\u00ed NUnit ihned po nasazen\u00ed z Ansible. Pokud je pokryt\u00ed \u00fakolu pln\u011b automatick\u00e9, nen\u00ed pot\u0159eba manu\u00e1ln\u00ed testov\u00e1n\u00ed. A\u010dkoli n\u011bkdy je vy\u017eadov\u00e1no dal\u0161\u00ed manu\u00e1ln\u00ed testov\u00e1n\u00ed. Pro ur\u010den\u00ed, kter\u00e9 testy spustit pro konkr\u00e9tn\u00ed \u00fakol, pou\u017e\u00edv\u00e1me tagy v Jira.<\/p>\n<p>D\u00e1le vzrostla pot\u0159eba z\u00e1t\u011b\u017eov\u00e9ho testov\u00e1n\u00ed, kter\u00e9 se d\u0159\u00edve prov\u00e1d\u011blo pouze ve vz\u00e1cn\u00fdch p\u0159\u00edpadech. Pro spu\u0161t\u011bn\u00ed test\u016f pou\u017e\u00edv\u00e1me JMeter, pro jejich ulo\u017een\u00ed InfluxDB a pro vytv\u00e1\u0159en\u00ed graf\u016f procesu Grafana.<\/p>\n<p><b><\/p>\n<h3>Co jsme dos\u00e1hli?<\/h3>\n<p><\/b><br \/>\nZa prv\u00e9, zbavili jsme se pojmu \u201erelease\u201c. Zmizely dvoum\u011bs\u00ed\u010dn\u00ed monstr\u00f3zn\u00ed releasy, kdy se tato ma\u0161ina nasazovala do produk\u010dn\u00edho prost\u0159ed\u00ed, co\u017e do\u010dasn\u011b naru\u0161ovalo podnikov\u00e9 procesy. Nyn\u00ed nasazujeme slu\u017eby v pr\u016fm\u011bru ka\u017ed\u00fdch 1,5 dne, agregujeme je, proto\u017ee do provozu vych\u00e1zej\u00ed po schv\u00e1len\u00ed.<\/p>\n<p>V na\u0161em syst\u00e9mu nejsou fat\u00e1ln\u00ed selh\u00e1n\u00ed. Pokud jsme vydali mikroslu\u017ebu s chybou, tak souvisej\u00edc\u00ed funk\u010dnost bude po\u0161kozena, ale ve\u0161ker\u00e1 ostatn\u00ed funk\u010dnost nebude ovlivn\u011bna. To v\u00fdznamn\u011b zlep\u0161uje u\u017eivatelskou zku\u0161enost.<\/p>\n<p>M\u016f\u017eeme spravovat sch\u00e9ma nasazen\u00ed. M\u016f\u017eeme vy\u010dlenit skupiny slu\u017eeb odd\u011blen\u011b od ostatn\u00edch \u0159e\u0161en\u00ed, pokud je to pot\u0159eba.<\/p>\n<p>Krom\u011b toho jsme v\u00fdrazn\u011b sn\u00ed\u017eili probl\u00e9m s velk\u00fdm frontem \u00faprav. M\u00e1me nyn\u00ed samostatn\u00e9 produktov\u00e9 t\u00fdmy, kter\u00e9 pracuj\u00ed na \u010d\u00e1sti slu\u017eeb nez\u00e1visle. Tady u\u017e se dob\u0159e uplat\u0148uje proces Scrum. Ka\u017ed\u00fd konkr\u00e9tn\u00ed t\u00fdm m\u016f\u017ee m\u00edt sv\u00e9ho samostatn\u00e9ho vlastn\u00edka produktu, kter\u00fd mu zad\u00e1v\u00e1 \u00fakoly. <\/p>\n<p><b><\/p>\n<h3>Shrnut\u00ed<\/h3>\n<p><\/b><\/p>\n<ul>\n<li>Mikroslu\u017eby jsou dob\u0159e p\u0159izp\u016fsobeny dekompozici slo\u017eit\u00fdch syst\u00e9m\u016f. V pr\u016fb\u011bhu toho za\u010d\u00edn\u00e1me rozum\u011bt tomu, co v na\u0161em syst\u00e9mu existuje, jak\u00e9 jsou omezen\u00e9 kontexty a kde jsou jejich hranice. To n\u00e1m umo\u017e\u0148uje spr\u00e1vn\u011b rozd\u011blovat \u00fapravy podle modul\u016f a zabr\u00e1nit zmaten\u00ed k\u00f3du. <\/li>\n<li>Mikroslu\u017eby nab\u00edzej\u00ed organiza\u010dn\u00ed v\u00fdhody. O nich se \u010dasto hovo\u0159\u00ed pouze jako o architektu\u0159e, ale jak\u00e1koli architektura je pot\u0159ebn\u00e1 pro \u0159e\u0161en\u00ed pot\u0159eb podnik\u00e1n\u00ed, nikoli sama o sob\u011b. Proto m\u016f\u017eeme \u0159\u00edci, \u017ee mikroslu\u017eby jsou dob\u0159e p\u0159izp\u016fsobeny pro \u0159e\u0161en\u00ed \u00fakol\u016f mal\u00fdmi t\u00fdmy, zvl\u00e1\u0161\u0165 nyn\u00ed, kdy\u017e je Scrum velmi popul\u00e1rn\u00ed.<\/li>\n<li>D\u011blen\u00ed je iterativn\u00ed proces. Nelze vz\u00edt aplikaci a jen ji rozd\u011blit na mikroslu\u017eby. V\u00fdsledn\u00fd produkt pravd\u011bpodobn\u011b nebude funk\u010dn\u00ed. P\u0159i vy\u010dle\u0148ov\u00e1n\u00ed mikroslu\u017eeb je v\u00fdhodn\u00e9 p\u0159episovat existuj\u00edc\u00ed legacy, tedy p\u0159etv\u00e1\u0159et ho na k\u00f3d, kter\u00fd se n\u00e1m l\u00edb\u00ed a l\u00e9pe uspokojuje pot\u0159eby podnik\u00e1n\u00ed z hlediska funk\u010dnosti a rychlosti.\n<p><i>Mal\u00e9 varov\u00e1n\u00ed:<\/i> n\u00e1klady na p\u0159echod k mikroslu\u017eb\u00e1m jsou pom\u011brn\u011b zna\u010dn\u00e9. Pouze na \u0159e\u0161en\u00ed probl\u00e9m\u016f s infrastrukturou bylo zapot\u0159eb\u00ed hodn\u011b \u010dasu. Proto, pokud m\u00e1te malou aplikaci, kter\u00e1 nevy\u017eaduje specifick\u00e9 \u0161k\u00e1lov\u00e1n\u00ed, pokud nen\u00ed velk\u00e9 mno\u017estv\u00ed z\u00e1kazn\u00edk\u016f, kte\u0159\u00ed sout\u011b\u017e\u00ed o pozornost a \u010das va\u0161eho t\u00fdmu, pak mikroslu\u017eby mo\u017en\u00e1 nejsou to, co dnes pot\u0159ebujete. Je to dost drah\u00e9. Pokud za\u010dnete proces mikroslu\u017ebami, n\u00e1klady budou na za\u010d\u00e1tku vy\u0161\u0161\u00ed ne\u017e kdy\u017e stejn\u00fd projekt za\u010dnete v\u00fdvojem monolitu. <\/p>\n<p>P.S. Emotivn\u011bj\u0161\u00ed p\u0159\u00edb\u011bh (jako by byl ur\u010den p\u0159\u00edmo v\u00e1m) \u2013 podle <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=qTNbx18DzpQ\">odkazu<\/a><\/noindex>. <br \/>\nZde je pln\u00e1 verze p\u0159edn\u00e1\u0161ky.<\/li>\n<\/ul>\n<p>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/raiffeisenbank\/blog\/458404\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u0440\u043e\u0435\u043a\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u0441\u044f \u0438\u0437 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0430 \u0432 \u043d\u0430\u0431\u043e\u0440 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0447\u0430\u043b \u0441\u0432\u043e\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u0430\u0432\u043d\u043e, \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 2000. \u041f\u0435\u0440\u0432\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u044b\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 Visual Basic 6. \u0421 \u0442\u0435\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043d\u0430 \u044d\u0442\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a IDE [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":26858,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-35906","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u0440\u043e\u0435\u043a\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u0441\u044f \u0438\u0437 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0430 \u0432 \u043d\u0430\u0431\u043e\u0440 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0447\u0430\u043b \u0441\u0432\u043e\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u0430\u0432\u043d\u043e, \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 2000.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/perehod-ot-monolita-k-mikroservisam-istoriya-i-praktika\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043e\u0442 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0430 \u043a \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c: \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u0440\u043e\u0435\u043a\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u0441\u044f \u0438\u0437 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0430 \u0432 \u043d\u0430\u0431\u043e\u0440 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0447\u0430\u043b \u0441\u0432\u043e\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u0430\u0432\u043d\u043e, \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 2000.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/perehod-ot-monolita-k-mikroservisam-istoriya-i-praktika\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:07:29+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:07:29+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47P\u0159echod od monolitu k mikroslu\u017eb\u00e1m: historie a praxe | ProHoster","description":"V tomto \u010dl\u00e1nku se pod\u011bl\u00edm o to, jak se projekt, na kter\u00e9m pracuji, transformoval z velk\u00e9ho monolitu na sadu mikroslu\u017eeb. Projekt za\u010dal svou cestu ji\u017e d\u00e1vno, na po\u010d\u00e1tku roku 2000.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/perehod-ot-monolita-k-mikroservisam-istoriya-i-praktika","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043e\u0442 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0430 \u043a \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c: \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 | ProHoster","og:description":"\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u0440\u043e\u0435\u043a\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u0441\u044f \u0438\u0437 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0430 \u0432 \u043d\u0430\u0431\u043e\u0440 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0447\u0430\u043b \u0441\u0432\u043e\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u0430\u0432\u043d\u043e, \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 2000.","og:url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/perehod-ot-monolita-k-mikroservisam-istoriya-i-praktika","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:07:29+00:00","article:modified_time":"2019-10-31T19:07:29+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35906","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-02-09 17:04:56","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:54:38","updated":"2026-02-09 17:04:56","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/35906","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=35906"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/35906\/revisions"}],"predecessor-version":[{"id":158582,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/35906\/revisions\/158582"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/26858"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=35906"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=35906"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=35906"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}