PÄreja no monolÄ«ta uz mikropakalpojumiem: vÄsture un prakse
Å ajÄ rakstÄ es runÄÅ”u par to, kÄ projekts, pie kura es strÄdÄju, no liela monolÄ«ta tika pÄrveidots par mikropakalpojumu komplektu.
Projekts savu vÄsturi sÄka diezgan sen, 2000. gada sÄkumÄ. PirmÄs versijas tika rakstÄ«tas Visual Basic 6. Laika gaitÄ kļuva skaidrs, ka attÄ«stÄ«ba Å”ajÄ valodÄ nÄkotnÄ bÅ«s grÅ«ti atbalstÄma, jo IDE un pati valoda ir vÄji attÄ«stÄ«ta. 2000. gadu beigÄs tika nolemts pÄriet uz daudzsoloÅ”Äko C#. JaunÄ versija tika rakstÄ«ta paralÄli vecÄs versijas pÄrskatÄ«Å”anai, pakÄpeniski arvien vairÄk kodu tika ierakstÄ«ts .NET. C# aizmugure sÄkotnÄji bija vÄrsta uz pakalpojumu arhitektÅ«ru, taÄu izstrÄdes laikÄ tika izmantotas kopÄ«gas bibliotÄkas ar loÄ£iku un pakalpojumi tika palaisti vienÄ procesÄ. RezultÄts bija lietojumprogramma, ko mÄs saucÄm par "pakalpojuma monolÄ«tu".
Viena no nedaudzajÄm Ŕīs kombinÄcijas priekÅ”rocÄ«bÄm bija pakalpojumu iespÄja zvanÄ«t viens otram, izmantojot ÄrÄju API. Bija skaidri priekÅ”noteikumi pÄrejai uz pareizÄku servisu un nÄkotnÄ mikropakalpojumu arhitektÅ«ru.
MÄs sÄkÄm darbu pie dekompozÄ«cijas ap 2015. gadu. MÄs vÄl neesam sasnieguÅ”i ideÄlu stÄvokli - joprojÄm ir liela projekta daļas, kuras diez vai var saukt par monolÄ«tiem, taÄu tÄs arÄ« neizskatÄs pÄc mikropakalpojumiem. TomÄr progress ir ievÄrojams.
Par to es runÄÅ”u rakstÄ.
SÄkotnÄji arhitektÅ«ra izskatÄ«jÄs Å”Ädi: UI ir atseviŔķa lietojumprogramma, monolÄ«tÄ daļa ir rakstÄ«ta Visual Basic 6, .NET lietojumprogramma ir saistÄ«tu pakalpojumu kopums, kas strÄdÄ ar diezgan lielu datu bÄzi.
IepriekÅ”ÄjÄ risinÄjuma trÅ«kumi
Viens neveiksmes punkts
Mums bija viens neveiksmes punkts: .NET lietojumprogramma darbojÄs vienÄ procesÄ. Ja kÄds modulis neizdevÄs, visa lietojumprogramma neizdevÄs, un tÄ bija jÄrestartÄ. TÄ kÄ mÄs automatizÄjam lielu skaitu procesu dažÄdiem lietotÄjiem, kļūmes dÄļ vienÄ no tiem visi kÄdu laiku nevarÄja strÄdÄt. Un programmatÅ«ras kļūdas gadÄ«jumÄ pat dublÄÅ”ana nepalÄ«dzÄja.
Uzlabojumu rinda
Å is trÅ«kums ir diezgan organizatorisks. MÅ«su lietojumprogrammai ir daudz klientu, un viÅi visi vÄlas to uzlabot pÄc iespÄjas ÄtrÄk. IepriekÅ” to nebija iespÄjams izdarÄ«t paralÄli, un visi klienti stÄvÄja rindÄ. Å is process uzÅÄmÄjiem bija negatÄ«vs, jo viÅiem bija jÄpierÄda, ka viÅu uzdevums ir vÄrtÄ«gs. Un izstrÄdes komanda pavadÄ«ja laiku, organizÄjot Å”o rindu. Tas prasÄ«ja daudz laika un pūļu, un galu galÄ produkts nevarÄja mainÄ«ties tik Ätri, kÄ viÅi bÅ«tu vÄlÄjuÅ”ies.
NeoptimÄla resursu izmantoÅ”ana
Mitinot pakalpojumus vienÄ procesÄ, mÄs vienmÄr pilnÄ«bÄ kopÄjÄm konfigurÄciju no servera uz serveri. MÄs vÄlÄjÄmies visvairÄk noslogotos pakalpojumus izvietot atseviŔķi, lai netÄrÄtu resursus un iegÅ«tu elastÄ«gÄku kontroli pÄr mÅ«su izvietoÅ”anas shÄmu.
Grūti ieviest mūsdienu tehnoloģijas
ProblÄma, kas pazÄ«stama visiem izstrÄdÄtÄjiem: ir vÄlme projektÄ ieviest modernÄs tehnoloÄ£ijas, bet nav iespÄju. Izmantojot lielu monolÄ«tu risinÄjumu, jebkurÅ” paÅ”reizÄjÄs bibliotÄkas atjauninÄjums, nemaz nerunÄjot par pÄreju uz jaunu, pÄrvÄrÅ”as par diezgan netriviÄlu uzdevumu. Ir nepiecieÅ”ams ilgs laiks, lai pierÄdÄ«tu komandas vadÄ«tÄjam, ka tas dos vairÄk bonusu nekÄ iztÄrÄti nervi.
GrÅ«tÄ«bas izdot izmaiÅas
Å Ä« bija visnopietnÄkÄ problÄma ā mÄs izlaidÄm ik pÄc diviem mÄneÅ”iem.
Katrs laidiens bankai kļuva par Ä«stu katastrofu, neskatoties uz izstrÄdÄtÄju testiem un centieniem. UzÅÄmums saprata, ka nedÄļas sÄkumÄ daļa tÄ funkcionalitÄtes nedarbosies. Un izstrÄdÄtÄji saprata, ka viÅus gaida nopietnu incidentu nedÄļa.
Ikvienam bija vÄlme mainÄ«t situÄciju.
Cerības no mikropakalpojumiem
SastÄvdaļu problÄma, kad tÄ ir gatava. SastÄvdaļu piegÄde, kad tÄs ir gatavas, sadalot Ŕķīdumu un atdalot dažÄdus procesus.
Mazas produktu komandas. Tas ir svarÄ«gi, jo lielu komandu, kas strÄdÄja pie vecÄ monolÄ«ta, bija grÅ«ti vadÄ«t. Å Äda komanda bija spiesta strÄdÄt pÄc stingra procesa, taÄu viÅi vÄlÄjÄs vairÄk radoÅ”uma un neatkarÄ«bas. To varÄja atļauties tikai mazas komandas.
Pakalpojumu izolÄÅ”ana atseviŔķos procesos. IdeÄlÄ gadÄ«jumÄ es gribÄju to izolÄt konteineros, taÄu liels skaits .NET Framework rakstÄ«to pakalpojumu darbojas tikai operÄtÄjsistÄmÄ Windows. Tagad tiek parÄdÄ«ti pakalpojumi, kuru pamatÄ ir .NET Core, taÄu to vÄl ir maz.
IzvietoÅ”anas elastÄ«ba. MÄs vÄlÄtos apvienot pakalpojumus tÄ, kÄ mums tas ir nepiecieÅ”ams, nevis tÄ, kÄ kods to uzspiež.
Jauno tehnoloÄ£iju izmantoÅ”ana. Tas ir interesanti jebkuram programmÄtÄjam.
PÄrejas problÄmas
Protams, ja monolÄ«tu bÅ«tu viegli sadalÄ«t mikropakalpojumos, par to nebÅ«tu jÄrunÄ konferencÄs un jÄraksta raksti. Å ajÄ procesÄ ir daudz nepilnÄ«bu, es aprakstÄ«Å”u galvenÄs, kas mums traucÄja.
PirmÄ problÄma raksturÄ«gs lielÄkajai daļai monolÄ«tu: biznesa loÄ£ikas saskaÅotÄ«ba. Kad mÄs rakstÄm monolÄ«tu, mÄs vÄlamies atkÄrtoti izmantot savas klases, lai nerakstÄ«tu nevajadzÄ«gu kodu. Un, pÄrejot uz mikropakalpojumiem, tÄ kļūst par problÄmu: viss kods ir diezgan cieÅ”i savienots, un pakalpojumus ir grÅ«ti nodalÄ«t.
Darba uzsÄkÅ”anas brÄ«dÄ« repozitorijÄ bija vairÄk nekÄ 500 projektu un vairÄk nekÄ 700 tÅ«kstoÅ”i koda rindu. Tas ir diezgan liels lÄmums un otrÄ problÄma. NevarÄja vienkÄrÅ”i paÅemt un sadalÄ«t mikropakalpojumos.
TreÅ”Ä problÄma ā nepiecieÅ”amÄs infrastruktÅ«ras trÅ«kums. Faktiski mÄs manuÄli kopÄjÄm avota kodu uz serveriem.
KÄ pÄriet no monolÄ«ta uz mikropakalpojumiem
Mikropakalpojumu nodroÅ”inÄÅ”ana
PirmkÄrt, mÄs uzreiz paÅ”i noteicÄm, ka mikropakalpojumu atdalÄ«Å”ana ir iteratÄ«vs process. Mums vienmÄr tika prasÄ«ts paralÄli attÄ«stÄ«t biznesa problÄmas. KÄ mÄs to tehniski Ä«stenosim, tÄ jau ir mÅ«su problÄma. TÄpÄc mÄs sagatavojÄmies iteratÄ«vam procesam. Tas nedarbosies citÄdi, ja jums ir liela lietojumprogramma un tÄ sÄkotnÄji nav gatava pÄrrakstÄ«Å”anai.
KÄdas metodes mÄs izmantojam, lai izolÄtu mikropakalpojumus?
PirmÄ metode ā pÄrvietot esoÅ”os moduļus kÄ pakalpojumus. Å ajÄ ziÅÄ mums paveicÄs: jau bija reÄ£istrÄti pakalpojumi, kas darbojÄs, izmantojot WCF protokolu. Tie tika sadalÄ«ti atseviŔķÄs asamblejÄs. MÄs tos pÄrnÄsÄjÄm atseviŔķi, katrai bÅ«vei pievienojot nelielu palaiÅ”anas programmu. Tas tika uzrakstÄ«ts, izmantojot brÄ«niŔķīgo Topshelf bibliotÄku, kas ļauj palaist lietojumprogrammu gan kÄ pakalpojumu, gan kÄ konsoli. Tas ir Ärti atkļūdoÅ”anai, jo risinÄjumÄ nav nepiecieÅ”ami papildu projekti.
Pakalpojumi tika savienoti saskaÅÄ ar biznesa loÄ£iku, jo tie izmantoja kopÄjus mezglus un strÄdÄja ar kopÄ«gu datu bÄzi. Diez vai tos varÄtu saukt par mikropakalpojumiem tÄ«rÄ veidÄ. TaÄu Å”os pakalpojumus mÄs varÄtu sniegt atseviŔķi, dažÄdos procesos. Tas vien ļÄva samazinÄt to ietekmi vienam uz otru, samazinot problÄmu ar paralÄlu attÄ«stÄ«bu un vienu neveiksmes punktu.
MontÄža ar resursdatoru ir tikai viena koda rindiÅa Programmas klasÄ. MÄs slÄpÄm darbu ar Topshelf palÄ«gklasÄ.
namespace RBA.Services.Accounts.Host
{
internal class Program
{
private static void Main(string[] args)
{
HostRunner<Accounts>.Run("RBA.Services.Accounts.Host");
}
}
}
Otrs veids, kÄ pieŔķirt mikropakalpojumus, ir: izveidot tos jaunu problÄmu risinÄÅ”anai. Ja tajÄ paÅ”Ä laikÄ monolÄ«ts neaug, tas jau ir lieliski, kas nozÄ«mÄ, ka mÄs virzÄmies pareizajÄ virzienÄ. Lai atrisinÄtu jaunas problÄmas, mÄÄ£inÄjÄm izveidot atseviŔķus pakalpojumus. Ja bija tÄda iespÄja, tad izveidojÄm ākanoniskÄkusā servisus, kas pilnÄ«bÄ pÄrvalda savu datu modeli, atseviŔķu datu bÄzi.
MÄs, tÄpat kÄ daudzi, sÄkÄm ar autentifikÄcijas un autorizÄcijas pakalpojumiem. Tie ir ideÄli piemÄroti Å”im nolÅ«kam. Tie ir neatkarÄ«gi, kÄ likums, tiem ir atseviŔķs datu modelis. ViÅi paÅ”i nesadarbojas ar monolÄ«tu, tikai tas vÄrÅ”as pie viÅiem, lai atrisinÄtu dažas problÄmas. Izmantojot Å”os pakalpojumus, varat sÄkt pÄreju uz jaunu arhitektÅ«ru, atkļūdot tajos esoÅ”o infrastruktÅ«ru, izmÄÄ£inÄt dažas ar tÄ«kla bibliotÄkÄm saistÄ«tas pieejas utt. MÅ«su organizÄcijÄ nav nevienas komandas, kas nevarÄtu izveidot autentifikÄcijas pakalpojumu.
TreÅ”ais veids, kÄ pieŔķirt mikropakalpojumusTas, ko mÄs izmantojam, mums ir nedaudz specifisks. TÄ ir biznesa loÄ£ikas noÅemÅ”ana no lietotÄja interfeisa slÄÅa. MÅ«su galvenÄ lietotÄja saskarnes lietojumprogramma ir darbvirsma; tÄ, tÄpat kÄ aizmugure, ir rakstÄ«ta C#. IzstrÄdÄtÄji periodiski pieļÄva kļūdas un pÄrsÅ«tÄ«ja uz lietotÄja saskarni loÄ£ikas daļas, kurÄm vajadzÄja pastÄvÄt aizmugursistÄmÄ un izmantot atkÄrtoti.
Ja paskatÄs uz reÄlu piemÄru no UI daļas koda, jÅ«s varat redzÄt, ka lielÄkÄ daļa Ŕī risinÄjuma satur reÄlu biznesa loÄ£iku, kas ir noderÄ«ga citos procesos, ne tikai UI veidlapas veidoÅ”anÄ.
ÄŖstÄ lietotÄja interfeisa loÄ£ika ir tikai pÄdÄjÄs pÄris rindiÅÄs. MÄs to pÄrsÅ«tÄ«jÄm uz serveri, lai to varÄtu izmantot atkÄrtoti, tÄdÄjÄdi samazinot lietotÄja interfeisu un panÄkot pareizo arhitektÅ«ru.
Ceturtais un vissvarÄ«gÄkais veids, kÄ izolÄt mikropakalpojumus, kas ļauj samazinÄt monolÄ«tu, ir esoÅ”o pakalpojumu noÅemÅ”ana ar apstrÄdi. Ja mÄs izÅemam esoÅ”os moduļus tÄdus, kÄdi tie ir, rezultÄts ne vienmÄr atbilst izstrÄdÄtÄjiem, un biznesa process var bÅ«t novecojis kopÅ” funkcionalitÄtes izveides. Izmantojot pÄrstrukturÄÅ”anu, mÄs varam atbalstÄ«t jaunu biznesa procesu, jo biznesa prasÄ«bas pastÄvÄ«gi mainÄs. MÄs varam uzlabot avota kodu, novÄrst zinÄmos defektus un izveidot labÄku datu modeli. UzkrÄsies daudz priekÅ”rocÄ«bu.
Pakalpojumu nodalÄ«Å”ana no apstrÄdes ir nesaraujami saistÄ«ta ar ierobežota konteksta jÄdzienu. Å Ä« ir domÄna vadÄ«ta dizaina koncepcija. Tas nozÄ«mÄ domÄna modeļa sadaļu, kurÄ visi vienas valodas termini ir unikÄli definÄti. ApskatÄ«sim apdroÅ”inÄÅ”anas un rÄÄ·inu konteksta piemÄru. Mums ir monolÄ«ta lietojumprogramma, un mums ir jÄstrÄdÄ ar kontu apdroÅ”inÄÅ”anÄ. MÄs sagaidÄm, ka izstrÄdÄtÄjs atradÄ«s esoÅ”u konta klasi citÄ komplektÄ, atsaucÄs uz to no apdroÅ”inÄÅ”anas klases, un mums bÅ«s darba kods. Tiks ievÄrots DRY princips, uzdevums tiks paveikts ÄtrÄk, izmantojot esoÅ”o kodu.
RezultÄtÄ izrÄdÄs, ka kontu un apdroÅ”inÄÅ”anas konteksti ir saistÄ«ti. ParÄdoties jaunÄm prasÄ«bÄm, Ŕī sakabe traucÄs attÄ«stÄ«bai, palielinot jau tÄ sarežģītÄs biznesa loÄ£ikas sarežģītÄ«bu. Lai atrisinÄtu Å”o problÄmu, kodÄ jÄatrod robežas starp kontekstiem un jÄnovÄrÅ” to pÄrkÄpumi. PiemÄram, apdroÅ”inÄÅ”anas kontekstÄ pilnÄ«gi iespÄjams, ka pietiks ar 20 ciparu CentrÄlÄs bankas konta numuru un konta atvÄrÅ”anas datumu.
Lai atdalÄ«tu Å”os ierobežotos kontekstus vienu no otra un sÄktu mikropakalpojumu atdalÄ«Å”anas procesu no monolÄ«ta risinÄjuma, mÄs izmantojÄm tÄdu pieeju kÄ ÄrÄjo API izveidoÅ”ana lietojumprogrammÄ. Ja mÄs zinÄjÄm, ka kÄdam modulim ir jÄkļūst par mikropakalpojumu, kaut kÄ modificÄtam procesa gaitÄ, tad ar ÄrÄjiem izsaukumiem nekavÄjoties izsaucÄm loÄ£iku, kas pieder citam ierobežotam kontekstam. PiemÄram, izmantojot REST vai WCF.
MÄs stingri nolÄmÄm, ka neizvairÄ«simies no koda, kas prasÄ«s izplatÄ«tus darÄ«jumus. MÅ«su gadÄ«jumÄ izrÄdÄ«jÄs, ka ir diezgan viegli ievÄrot Å”o noteikumu. MÄs vÄl neesam saskÄruÅ”ies ar situÄcijÄm, kad patieÅ”Äm bÅ«tu nepiecieÅ”amas stingri sadalÄ«tas transakcijas - galÄ«gÄ konsekvence starp moduļiem ir diezgan pietiekama.
ApskatÄ«sim konkrÄtu piemÄru. Mums ir orÄ·estra jÄdziens ā konveijera, kas apstrÄdÄ ālietojumprogrammasā entÄ«tiju. ViÅÅ” pÄc kÄrtas izveido klientu, kontu un bankas karti. Ja klients un konts ir izveidots veiksmÄ«gi, bet kartes izveide neizdodas, lietojumprogramma nepÄriet uz āveiksmÄ«gaā statusu un paliek ākarte nav izveidotaā statusÄ. TurpmÄk fona darbÄ«bas to uztvers un pabeigs. SistÄma jau kÄdu laiku ir bijusi nekonsekvences stÄvoklÄ«, taÄu kopumÄ esam apmierinÄti ar to.
Ja radÄ«sies situÄcija, kad ir nepiecieÅ”ams konsekventi saglabÄt daļu datu, visticamÄk, dosimies uz pakalpojuma konsolidÄciju, lai to apstrÄdÄtu vienÄ procesÄ.
ApskatÄ«sim mikropakalpojuma pieŔķirÅ”anas piemÄru. KÄ to var salÄ«dzinoÅ”i droÅ”i nogÄdÄt ražoÅ”anÄ? Å ajÄ piemÄrÄ mums ir atseviŔķa sistÄmas daļa - algas apkalpoÅ”anas modulis, kura vienu no koda sadaļÄm vÄlamies izveidot mikroservisu.
PirmkÄrt, mÄs izveidojam mikropakalpojumu, pÄrrakstot kodu. MÄs uzlabojam dažus aspektus, ar kuriem mÄs nebijÄm apmierinÄti. MÄs ievieÅ”am jaunas biznesa prasÄ«bas no klienta puses. MÄs pievienojam API vÄrteju savienojumam starp UI un aizmugursistÄmu, kas nodroÅ”inÄs zvanu pÄradresÄciju.
PÄc tam mÄs laižam Å”o konfigurÄciju ekspluatÄcijÄ, bet izmÄÄ£inÄjuma stÄvoklÄ«. LielÄkÄ daļa mÅ«su lietotÄju joprojÄm strÄdÄ ar veciem biznesa procesiem. Jaunajiem lietotÄjiem mÄs izstrÄdÄjam jaunu monolÄ«tÄs lietojumprogrammas versiju, kurÄ vairs nav Ŕī procesa. BÅ«tÄ«bÄ mums ir monolÄ«ta un mikropakalpojuma kombinÄcija, kas darbojas kÄ pilots.
Ar veiksmÄ«gu izmÄÄ£inÄjuma versiju mÄs saprotam, ka jaunÄ konfigurÄcija patieÅ”Äm ir funkcionÄla, mÄs varam noÅemt veco monolÄ«tu no vienÄdojuma un atstÄt jauno konfigurÄciju vecÄ risinÄjuma vietÄ.
KopumÄ mÄs izmantojam gandrÄ«z visas esoÅ”Äs metodes monolÄ«ta avota koda sadalÄ«Å”anai. Visi no tiem ļauj mums samazinÄt lietojumprogrammas daļu lielumu un pÄrtulkot tÄs jaunÄs bibliotÄkÄs, padarot labÄku pirmkodu.
Darbs ar datu bÄzi
Datu bÄzi var sadalÄ«t sliktÄk nekÄ avota kodu, jo tajÄ ir ne tikai paÅ”reizÄjÄ shÄma, bet arÄ« uzkrÄtie vÄsturiskie dati.
MÅ«su datubÄzei, tÄpat kÄ daudzÄm citÄm, bija vÄl viens bÅ«tisks trÅ«kums - tÄs milzÄ«gais izmÄrs. Å Ä« datu bÄze tika veidota saskaÅÄ ar sarežģīto monolÄ«ta biznesa loÄ£iku un attiecÄ«bÄm, kas uzkrÄtas starp dažÄdu ierobežotu kontekstu tabulÄm.
MÅ«su gadÄ«jumÄ, lai papildinÄtu visas nepatikÅ”anas (liela datu bÄze, daudzi savienojumi, dažreiz neskaidras robežas starp tabulÄm), radÄs problÄma, kas rodas daudzos lielos projektos: koplietotÄs datu bÄzes veidnes izmantoÅ”ana. Dati tika Åemti no tabulÄm caur skatu, izmantojot replikÄciju un nosÅ«tÄ«ti uz citÄm sistÄmÄm, kur Ŕī replikÄcija bija nepiecieÅ”ama. TÄ rezultÄtÄ mÄs nevarÄjÄm pÄrvietot tabulas atseviÅ”Ä·Ä shÄmÄ, jo tÄs tika aktÄ«vi izmantotas.
Tas pats iedalÄ«jums ierobežotos kontekstos kodÄ palÄ«dz mums atdalÄ«ties. Tas parasti sniedz mums diezgan labu priekÅ”statu par to, kÄ mÄs sadalÄm datus datu bÄzes lÄ«menÄ«. MÄs saprotam, kuras tabulas pieder vienam ierobežotam kontekstam un kuras citam.
MÄs izmantojÄm divas globÄlas datu bÄzes sadalÄ«Å”anas metodes: esoÅ”o tabulu sadalÄ«Å”anu un sadalÄ«Å”anu ar apstrÄdi.
EsoÅ”o tabulu sadalÄ«Å”ana ir laba metode, ko izmantot, ja datu struktÅ«ra ir laba, atbilst biznesa prasÄ«bÄm un visi ir ar to apmierinÄti. Å ajÄ gadÄ«jumÄ esoÅ”Äs tabulas varam atdalÄ«t atseviÅ”Ä·Ä shÄmÄ.
Nodaļa ar apstrÄdi ir vajadzÄ«ga, kad biznesa modelis ir ļoti mainÄ«jies, un tabulas mÅ«s vairs neapmierina.
EsoÅ”o tabulu sadalÄ«Å”ana. Mums ir jÄnosaka, ko mÄs atdalÄ«sim. Bez Ŕīm zinÄÅ”anÄm nekas nedarbosies, un Å”eit mums palÄ«dzÄs ierobežoto kontekstu atdalÄ«Å”ana kodÄ. Parasti, ja jÅ«s varat saprast kontekstu robežas avota kodÄ, kļūst skaidrs, kuras tabulas jÄiekļauj nodaļas sarakstÄ.
IedomÄsimies, ka mums ir risinÄjums, kurÄ divi monolÄ«ti moduļi mijiedarbojas ar vienu datu bÄzi. Mums ir jÄpÄrliecinÄs, ka tikai viens modulis mijiedarbojas ar atdalÄ«to tabulu sadaļu, bet otrs sÄk mijiedarboties ar to, izmantojot API. SÄkumÄ pietiek ar to, ka caur API tiek veikta tikai ierakstÄ«Å”ana. Tas ir nepiecieÅ”ams nosacÄ«jums, lai mÄs varÄtu runÄt par mikropakalpojumu neatkarÄ«bu. LasÄ«Å”anas savienojumi var saglabÄties tik ilgi, kamÄr nav lielu problÄmu.
NÄkamais solis ir tas, ka mÄs varam atdalÄ«t koda sadaļu, kas darbojas ar atdalÄ«tÄm tabulÄm, ar vai bez apstrÄdes, atseviÅ”Ä·Ä mikropakalpojumÄ un palaist to atseviÅ”Ä·Ä procesÄ, konteinerÄ. Tas bÅ«s atseviŔķs pakalpojums ar savienojumu ar monolÄ«tu datu bÄzi un tÄm tabulÄm, kas ar to tieÅ”i neattiecas. MonolÄ«ts joprojÄm mijiedarbojas lasÄ«Å”anai ar noÅemamo daļu.
VÄlÄk mÄs noÅemsim Å”o savienojumu, tas ir, datu nolasÄ«Å”ana no monolÄ«tÄs lietojumprogrammas no atdalÄ«tÄm tabulÄm tiks pÄrsÅ«tÄ«ta arÄ« uz API.
TÄlÄk no vispÄrÄjÄs datu bÄzes atlasÄ«sim tabulas, ar kurÄm strÄdÄ tikai jaunais mikropakalpojums. MÄs varam pÄrvietot tabulas uz atseviŔķu shÄmu vai pat uz atseviŔķu fizisku datu bÄzi. JoprojÄm ir lasÄ«Å”anas savienojums starp mikroservisu un monolÄ«tu datu bÄzi, taÄu nav par ko uztraukties, Å”ÄdÄ konfigurÄcijÄ tÄ var dzÄ«vot diezgan ilgu laiku.
PÄdÄjais solis ir pilnÄ«bÄ noÅemt visus savienojumus. Å ÄdÄ gadÄ«jumÄ mums var bÅ«t nepiecieÅ”ams migrÄt datus no galvenÄs datu bÄzes. Dažreiz mÄs vÄlamies atkÄrtoti izmantot dažus datus vai direktorijus, kas replicÄti no ÄrÄjÄm sistÄmÄm vairÄkÄs datu bÄzÄs. Pie mums tas notiek periodiski.
ApstrÄdes nodaļa. Å Ä« metode ir ļoti lÄ«dzÄ«ga pirmajai, tikai apgrieztÄ secÄ«bÄ. MÄs nekavÄjoties pieŔķiram jaunu datu bÄzi un jaunu mikropakalpojumu, kas mijiedarbojas ar monolÄ«tu, izmantojot API. Bet tajÄ paÅ”Ä laikÄ paliek datu bÄzes tabulu kopa, kuru mÄs vÄlamies dzÄst nÄkotnÄ. Mums tas vairs nav vajadzÄ«gs; mÄs to nomainÄ«jÄm jaunajÄ modelÄ«.
Lai Ŕī shÄma darbotos, mums, visticamÄk, bÅ«s nepiecieÅ”ams pÄrejas periods.
Tad ir divas iespÄjamÄs pieejas.
Pirmais: mÄs dublÄjam visus datus jaunajÄ un vecajÄ datubÄzÄ. Å ajÄ gadÄ«jumÄ mums ir datu dublÄÅ”ana un var rasties sinhronizÄcijas problÄmas. Bet mÄs varam uzÅemt divus dažÄdus klientus. Viens darbosies ar jauno versiju, otrs ar veco.
Otrais: mÄs sadalÄm datus pÄc dažiem biznesa kritÄrijiem. PiemÄram, mums sistÄmÄ bija 5 produkti, kas tika saglabÄti vecajÄ datu bÄzÄ. Sesto ievietojam jaunÄ biznesa uzdevuma ietvaros jaunÄ datu bÄzÄ. Bet mums bÅ«s nepiecieÅ”ama API vÄrteja, kas sinhronizÄs Å”os datus un parÄdÄ«s klientam, no kurienes un ko iegÅ«t.
Abas pieejas darbojas, izvÄlieties atkarÄ«bÄ no situÄcijas.
Kad esam pÄrliecinÄti, ka viss darbojas, monolÄ«ta daļu, kas darbojas ar vecÄm datu bÄzes struktÅ«rÄm, var atspÄjot.
PÄdÄjais solis ir noÅemt vecÄs datu struktÅ«ras.
RezumÄjot, varam teikt, ka mums ir problÄmas ar datu bÄzi: ar to ir grÅ«ti strÄdÄt, salÄ«dzinot ar avota kodu, grÅ«tÄk koplietot, bet to var un vajag darÄ«t. MÄs esam atraduÅ”i dažus veidus, kas ļauj to izdarÄ«t diezgan droÅ”i, taÄu joprojÄm ir vieglÄk kļūdÄ«ties ar datiem, nevis ar pirmkodu.
Darbs ar pirmkodu
Å Ädi izskatÄ«jÄs pirmkoda diagramma, kad sÄkÄm analizÄt monolÄ«tu projektu.
To var aptuveni sadalÄ«t trÄ«s slÄÅos. Å is ir palaistu moduļu, spraudÅu, pakalpojumu un atseviŔķu darbÄ«bu slÄnis. Faktiski tie bija ieejas punkti monolÄ«tÄ risinÄjumÄ. Visi tie bija cieÅ”i noslÄgti ar kopÄjo slÄni. Tam bija biznesa loÄ£ika, ko pakalpojumi koplietoja, un daudz savienojumu. Katrs pakalpojums un spraudnis izmantoja lÄ«dz pat 10 vai vairÄk izplatÄ«tu komplektu atkarÄ«bÄ no to lieluma un izstrÄdÄtÄju sirdsapziÅas.
Mums paveicÄs ar infrastruktÅ«ras bibliotÄkÄm, kuras varÄja izmantot atseviŔķi.
DažkÄrt radÄs situÄcija, kad daži kopÄ«gi objekti faktiski nepiederÄja Å”im slÄnim, bet bija infrastruktÅ«ras bibliotÄkas. Tas tika atrisinÄts, pÄrdÄvÄjot.
VislielÄkÄs bažas radÄ«ja ierobežotie konteksti. GadÄ«jÄs, ka 3-4 konteksti tika sajaukti vienÄ kopÄjÄ komplektÄcijÄ un viens otru izmantoja vienÄs un tajÄs paÅ”Äs biznesa funkcijÄs. Bija jÄsaprot, kur to var sadalÄ«t un pa kÄdÄm robežÄm, un ko darÄ«t tÄlÄk, kartÄjot Å”o sadalÄ«jumu avota koda komplektos.
Pirmais: mÄs vairs nevÄlÄjÄmies koplietot biznesa loÄ£iku starp pakalpojumiem, darbÄ«bÄm un spraudÅiem. MÄs vÄlÄjÄmies padarÄ«t biznesa loÄ£iku neatkarÄ«gu mikropakalpojumos. No otras puses, mikropakalpojumi ideÄlÄ gadÄ«jumÄ tiek uzskatÄ«ti par pakalpojumiem, kas pastÄv pilnÄ«gi neatkarÄ«gi. Uzskatu, ka Å”Äda pieeja ir zinÄmÄ mÄrÄ izŔķÄrdÄ«ga un grÅ«ti panÄkama, jo, piemÄram, servisi C# valodÄ jebkurÄ gadÄ«jumÄ tiks savienoti ar standarta bibliotÄku. MÅ«su sistÄma ir rakstÄ«ta C#, citas tehnoloÄ£ijas mÄs vÄl neesam izmantojuÅ”i. TÄpÄc nolÄmÄm, ka varam atļauties izmantot kopÄ«gus tehniskos mezglus. Galvenais, lai tie nesatur nekÄdus biznesa loÄ£ikas fragmentus. Ja jÅ«su izmantotajam ORM ir Ärts iesaiÅojums, tÄ kopÄÅ”ana no pakalpojuma uz pakalpojumu ir ļoti dÄrga.
MÅ«su komanda ir domÄna virzÄ«ta dizaina cienÄ«tÄja, tÄpÄc sÄ«polu arhitektÅ«ra mums bija lieliski piemÄrota. MÅ«su pakalpojumu pamatÄ ir nevis datu piekļuves slÄnis, bet gan komplekss ar domÄna loÄ£iku, kas satur tikai biznesa loÄ£iku un nav saistÄ«ts ar infrastruktÅ«ru. TajÄ paÅ”Ä laikÄ mÄs varam neatkarÄ«gi modificÄt domÄna komplektu, lai atrisinÄtu ar ietvariem saistÄ«tas problÄmas.
Å ajÄ posmÄ mÄs saskÄrÄmies ar savu pirmo nopietno problÄmu. Pakalpojumam bija jÄatsaucas uz vienu domÄna komplektu, mÄs vÄlÄjÄmies padarÄ«t loÄ£iku neatkarÄ«gu, un DRY princips mums Å”eit ļoti traucÄja. IzstrÄdÄtÄji vÄlÄjÄs atkÄrtoti izmantot klases no blakus esoÅ”ajiem kompleksiem, lai izvairÄ«tos no dublÄÅ”anÄs, un rezultÄtÄ domÄni atkal sÄka saistÄ«t kopÄ. MÄs analizÄjÄm rezultÄtus un nolÄmÄm, ka, iespÄjams, problÄma ir arÄ« avota koda atmiÅas ierÄ«ces jomÄ. Mums bija liels repozitorijs, kurÄ bija viss avota kods. Visa projekta risinÄjumu bija ļoti grÅ«ti salikt vietÄjÄ maŔīnÄ. TÄpÄc projekta daļÄm tika izveidoti atseviŔķi mazi risinÄjumi, un neviens neaizliedza tiem pievienot kÄdu kopÄ«gu vai domÄna komplektÄciju un izmantot atkÄrtoti. VienÄ«gais rÄ«ks, kas mums neļÄva to izdarÄ«t, bija koda pÄrskatÄ«Å”ana. Bet dažreiz tas arÄ« neizdevÄs.
PÄc tam mÄs sÄkÄm pÄriet uz modeli ar atseviŔķÄm krÄtuvÄm. Biznesa loÄ£ika vairs neplÅ«st no pakalpojuma uz pakalpojumu, domÄni ir patiesi kļuvuÅ”i neatkarÄ«gi. Ierobežoti konteksti tiek atbalstÄ«ti skaidrÄk. KÄ mÄs atkÄrtoti izmantojam infrastruktÅ«ras bibliotÄkas? MÄs tos sadalÄ«jÄm atseviÅ”Ä·Ä repozitorijÄ, pÄc tam ievietojÄm Nuget pakotnÄs, kuras ievietojÄm artifactory. Veicot jebkÄdas izmaiÅas, montÄža un publicÄÅ”ana notiek automÄtiski.
MÅ«su pakalpojumi sÄka atsaukties uz iekÅ”ÄjÄm infrastruktÅ«ras pakotnÄm tÄpat kÄ uz ÄrÄjÄm. MÄs lejupielÄdÄjam ÄrÄjÄs bibliotÄkas no Nuget. Lai strÄdÄtu ar Artifactory, kur ievietojÄm Ŕīs pakotnes, mÄs izmantojÄm divus pakotÅu pÄrvaldniekus. MazajÄs krÄtuvÄs mÄs izmantojÄm arÄ« Nuget. RepozitorijÄs ar vairÄkiem pakalpojumiem mÄs izmantojÄm Paket, kas nodroÅ”ina lielÄku versiju konsekvenci starp moduļiem.
TÄdÄjÄdi, strÄdÄjot pie pirmkoda, nedaudz mainot arhitektÅ«ru un atdalot repozitorijus, mÄs padarÄm savus pakalpojumus neatkarÄ«gÄkus.
InfrastruktÅ«ras problÄmas
LielÄkÄ daļa negatÄ«vo aspektu, kas saistÄ«ti ar pÄreju uz mikropakalpojumiem, ir saistÄ«ti ar infrastruktÅ«ru. Jums bÅ«s nepiecieÅ”ama automatizÄta izvietoÅ”ana, jums bÅ«s nepiecieÅ”amas jaunas bibliotÄkas, lai palaistu infrastruktÅ«ru.
ManuÄla uzstÄdÄ«Å”ana vidÄs
SÄkotnÄji risinÄjumu vidÄm uzstÄdÄ«jÄm manuÄli. Lai automatizÄtu Å”o procesu, mÄs izveidojÄm CI/CD konveijeru. MÄs izvÄlÄjÄmies nepÄrtrauktas piegÄdes procesu, jo nepÄrtraukta izvietoÅ”ana mums vÄl nav pieÅemama no biznesa procesu viedokļa. TÄpÄc nosÅ«tÄ«Å”ana darbÄ«bai tiek veikta, izmantojot pogu, un pÄrbaudei - automÄtiski.
MÄs izmantojam Atlassian, Bitbucket pirmkoda glabÄÅ”anai un Bamboo bÅ«vÄÅ”anai. Mums patÄ«k rakstÄ«t veidoÅ”anas skriptus programmÄ Cake, jo tas ir tas pats, kas C#. GatavÄs pakotnes nonÄk Artifactory, un Ansible automÄtiski nokļūst testa serveros, pÄc tam tÄs var nekavÄjoties pÄrbaudÄ«t.
AtseviŔķa mežizstrÄde
Savulaik viena no monolÄ«ta idejÄm bija nodroÅ”inÄt kopÄ«gu mežizstrÄdi. Mums arÄ« bija jÄsaprot, ko darÄ«t ar atseviŔķiem diskos esoÅ”ajiem žurnÄliem. MÅ«su žurnÄli tiek ierakstÄ«ti teksta failos. MÄs nolÄmÄm izmantot standarta ELK kaudzi. MÄs nerakstÄ«jÄm ELK tieÅ”i caur pakalpojumu sniedzÄjiem, bet nolÄmÄm, ka modificÄsim teksta žurnÄlus un ierakstÄ«sim tajos izsekoÅ”anas ID kÄ identifikatoru, pievienojot pakalpojuma nosaukumu, lai vÄlÄk Å”os žurnÄlus varÄtu parsÄt.
Izmantojot Filebeat, mÄs iegÅ«stam iespÄju apkopot savus žurnÄlus no serveriem, pÄc tam tos pÄrveidot, izmantot Kibana, lai izveidotu vaicÄjumus lietotÄja saskarnÄ un redzÄtu, kÄ notika zvans starp pakalpojumiem. IzsekoÅ”anas ID Å”ajÄ jautÄjumÄ Ä¼oti palÄ«dz.
Ar testÄÅ”anu un atkļūdoÅ”anu saistÄ«ti pakalpojumi
SÄkotnÄji mÄs pilnÄ«bÄ nesapratÄm, kÄ atkļūdot pakalpojumus, kas tiek izstrÄdÄti. Ar monolÄ«tu viss bija vienkÄrÅ”i; mÄs to izmantojÄm vietÄjÄ maŔīnÄ. SÄkumÄ viÅi mÄÄ£inÄja darÄ«t to paÅ”u ar mikropakalpojumiem, taÄu dažreiz, lai pilnÄ«bÄ palaistu vienu mikropakalpojumu, ir jÄpalaiž vairÄki citi, un tas ir neÄrti. MÄs sapratÄm, ka mums ir jÄpÄriet uz modeli, kurÄ vietÄjÄ maŔīnÄ atstÄjam tikai pakalpojumu vai pakalpojumus, kurus vÄlamies atkļūdot. PÄrÄjie pakalpojumi tiek izmantoti no serveriem, kas atbilst konfigurÄcijai ar prod. PÄc atkļūdoÅ”anas, testÄÅ”anas laikÄ katram uzdevumam testa serverim tiek izsniegti tikai mainÄ«tie pakalpojumi. TÄdÄjÄdi risinÄjums tiek testÄts tÄdÄ formÄ, kÄdÄ tas nÄkotnÄ parÄdÄ«sies ražoÅ”anÄ.
Ir serveri, kuros darbojas tikai pakalpojumu ražoÅ”anas versijas. Å ie serveri ir nepiecieÅ”ami incidentu gadÄ«jumÄ, lai pÄrbaudÄ«tu piegÄdi pirms izvietoÅ”anas un lai veiktu iekÅ”Äjo apmÄcÄ«bu.
MÄs esam pievienojuÅ”i automatizÄtu testÄÅ”anas procesu, izmantojot populÄro Specflow bibliotÄku. Testi tiek veikti automÄtiski, izmantojot NUnit tÅ«lÄ«t pÄc izvietoÅ”anas no Ansible. Ja uzdevumu pÄrklÄjums ir pilnÄ«bÄ automÄtisks, manuÄla pÄrbaude nav nepiecieÅ”ama. Lai gan dažreiz joprojÄm ir nepiecieÅ”ama papildu manuÄla pÄrbaude. MÄs izmantojam Jira tagus, lai noteiktu, kuri testi jÄveic konkrÄtai problÄmai.
TurklÄt ir pieaugusi nepiecieÅ”amÄ«ba pÄc slodzes testÄÅ”anas, iepriekÅ” tÄ tika veikta tikai retos gadÄ«jumos. MÄs izmantojam JMeter, lai palaistu testus, InfluxDB, lai tos saglabÄtu, un Grafana, lai izveidotu procesa grafikus.
Ko esam sasnieguŔi?
PirmkÄrt, mÄs atbrÄ«vojÄmies no jÄdziena āatbrÄ«voÅ”anaā. Ir pagÄjuÅ”i divu mÄneÅ”u milzÄ«gie izlaidumi, kad Å”is koloss tika izvietots ražoÅ”anas vidÄ, Ä«slaicÄ«gi traucÄjot biznesa procesus. Tagad mÄs izvietojam pakalpojumus vidÄji ik pÄc 1,5 dienÄm, grupÄjot tos, jo tie tiek nodoti ekspluatÄcijÄ pÄc apstiprinÄÅ”anas.
MÅ«su sistÄmÄ nav fatÄlu kļūmju. Ja mÄs izlaidÄ«sim mikropakalpojumu ar kļūdu, ar to saistÄ«tÄ funkcionalitÄte tiks bojÄta, un visas pÄrÄjÄs funkcionalitÄtes netiks ietekmÄtas. Tas ievÄrojami uzlabo lietotÄja pieredzi.
MÄs varam kontrolÄt izvietoÅ”anas modeli. Ja nepiecieÅ”ams, varat atlasÄ«t pakalpojumu grupas atseviŔķi no pÄrÄjÄ risinÄjuma.
TurklÄt mÄs esam ievÄrojami samazinÄjuÅ”i problÄmu ar lielu uzlabojumu rindu. Tagad mums ir atseviŔķas produktu komandas, kas ar dažiem pakalpojumiem strÄdÄ neatkarÄ«gi. Scrum process jau Å”eit ir piemÄrots. KonkrÄtai komandai var bÅ«t atseviŔķs produkta Ä«paÅ”nieks, kas tai pieŔķir uzdevumus.
Kopsavilkums
Mikropakalpojumi ir labi piemÄroti sarežģītu sistÄmu sadalÄ«Å”anai. Å ajÄ procesÄ mÄs sÄkam saprast, kas ir mÅ«su sistÄmÄ, kÄdi ir ierobežoti konteksti, kur ir to robežas. Tas ļauj pareizi sadalÄ«t uzlabojumus starp moduļiem un novÄrst koda sajaukÅ”anu.
Mikropakalpojumi sniedz organizatoriskas priekÅ”rocÄ«bas. Par tiem bieži runÄ tikai kÄ par arhitektÅ«ru, taÄu jebkura arhitektÅ«ra ir nepiecieÅ”ama biznesa vajadzÄ«bu risinÄÅ”anai, nevis pati par sevi. LÄ«dz ar to varam teikt, ka mikropakalpojumi ir labi piemÄroti problÄmu risinÄÅ”anai mazÄs komandÄs, Åemot vÄrÄ, ka Å”obrÄ«d Scrum ir ļoti populÄrs.
AtdalÄ«Å”ana ir iteratÄ«vs process. JÅ«s nevarat paÅemt pieteikumu un vienkÄrÅ”i sadalÄ«t to mikropakalpojumos. IegÅ«tais produkts, visticamÄk, nebÅ«s funkcionÄls. PieŔķirot mikropakalpojumus, ir izdevÄ«gi pÄrrakstÄ«t esoÅ”o mantojumu, tas ir, pÄrvÄrst to par kodu, kas mums patÄ«k un labÄk atbilst biznesa vajadzÄ«bÄm funkcionalitÄtes un Ätruma ziÅÄ.
Neliels brÄ«dinÄjums: Izmaksas, pÄrejot uz mikropakalpojumiem, ir diezgan ievÄrojamas. Lai vienatnÄ atrisinÄtu infrastruktÅ«ras problÄmu, bija nepiecieÅ”ams ilgs laiks. TÄtad, ja jums ir neliela lietojumprogramma, kurai nav nepiecieÅ”ama Ä«paÅ”a mÄrogoÅ”ana, ja vien jums nav liels klientu skaits, kas sacenÅ”as par jÅ«su komandas uzmanÄ«bu un laiku, mikropakalpojumi var nebÅ«t tie, kas jums Å”odien ir nepiecieÅ”ami. Tas ir diezgan dÄrgi. Ja procesu sÄksi ar mikropakalpojumiem, tad izmaksas sÄkotnÄji bÅ«s lielÄkas nekÄ tad, ja tÄdu paÅ”u projektu uzsÄksi ar monolÄ«ta izstrÄdi.
PS EmocionÄlÄks stÄsts (un it kÄ jums personÄ«gi) - saskaÅÄ ar saite.
Å eit ir pilna ziÅojuma versija.