Kas iš tikrųjų yra service discovery ir kodėl tai svarbu
Mikroservisų architektūra tapo norma daugelyje šiuolaikinių IT projektų, bet kartu su ja atėjo ir naujų iššūkių. Vienas iš pagrindinių – kaip visi tie servisai turi vienas kitą rasti? Įsivaizduokite situaciją: turite 50 skirtingų mikroservisų, kurie veikia įvairiuose serveriuose, konteineriai nuolat keliami iš vienos vietos į kitą, IP adresai keičiasi kaip vėjas. Kaip čia nepasimiršti?
Čia ir ateina į pagalbą service discovery – sistema, kuri veikia kaip telefonų knyga jūsų mikroservisams. Vietoj to, kad kiekvienas servisas turėtų žinoti kiekvieno kito tikslų adresą (kas būtų košmaras palaikyti), jie tiesiog klausia centralizuoto registro „Ei, kur dabar yra atsargų valdymo servisas?” ir gauna aktualų atsakymą.
Šiandien pažvelgsime į du populiariausius sprendimus šiai problemai spręsti: HashiCorp Consul ir Netflix Eureka. Abu daro panašius dalykus, bet labai skirtingais būdais, ir pasirinkimas tarp jų gali turėti nemažą įtaką jūsų projekto ateičiai.
Consul: šveicariškas peiliukas infrastruktūros pasaulyje
HashiCorp Consul – tai ne tik service discovery įrankis. Tai pilnavertė infrastruktūros valdymo platforma, parašyta Go kalba. Consul atsirado 2014 metais ir greitai tapo vienu iš populiariausių sprendimų ne tik mikroservisų pasaulyje, bet ir platesniame DevOps kontekste.
Kas daro Consul ypatingą? Pirma, jis naudoja Raft consensus algoritmą, kuris užtikrina duomenų konsistenciją visame klasteryje. Tai reiškia, kad net jei dalis jūsų Consul serverių nukrista, sistema ir toliau veikia patikimai. Antra, Consul turi integruotą DNS serverį – tai reiškia, kad jūsų aplikacijos gali rasti kitus servisus naudodamos paprastus DNS užklausas, be jokių specialių bibliotekų.
Bet tai dar ne viskas. Consul siūlo key-value saugyklą, kuri puikiai tinka konfigūracijų valdymui. Galite saugoti bet kokius duomenis ir pasiekti juos iš bet kurio taško jūsų infrastruktūroje. Dar vienas galingas funkcionalumas – health checking. Consul ne tik žino, kur yra jūsų servisai, bet ir nuolat tikrina, ar jie sveikatingi. Jei servisas neatsako arba grąžina klaidas, Consul automatiškai jį pašalina iš registro.
Diegiant Consul, turite suprasti jo architektūrą. Yra du tipai node’ų: serveriai ir agentai (clients). Serveriai saugo duomenis ir dalyvauja konsensuso procese, o agentai veikia kiekviename serveryje/konteineryje ir praneša apie vietinius servisus. Rekomenduojama turėti 3 arba 5 Consul serverius produkcinėje aplinkoje – tai optimalus balansas tarp atsparumo gedimams ir našumo.
Eureka: Netflix dovana Java bendruomenei
Netflix Eureka gimė iš realių poreikių – kai valdai vieną didžiausių streaming platformų pasaulyje, tau reikia patikimo būdo valdyti tūkstančius mikroservisų. Eureka tapo dalimi Spring Cloud ekosistemos ir dėl to yra neįtikėtinai populiari Java pasaulyje.
Eureka filosofija skiriasi nuo Consul. Ji paremta AP modeliu (Availability and Partition tolerance) pagal CAP teoremą, o ne CP kaip Consul. Paprastai tariant, Eureka prioritetą teikia prieinamumui, net jei tai reiškia, kad kartais duomenys gali būti ne visai sinchronizuoti. Mikroservisų pasaulyje tai dažnai yra protingesnis pasirinkimas – geriau turėti šiek tiek pasenusią informaciją, nei visai neturėti jokios.
Eureka architektūra yra paprastesnė už Consul. Turite Eureka serverį (arba kelis serverius, kurie replikuoja duomenis tarpusavyje) ir Eureka klientus, integruotus į kiekvieną mikroservisą. Klientai registruojasi serveryje ir periodiškai siunčia „heartbeat” signalus, kad praneštų, jog vis dar gyvi. Jei serveris negauna heartbeat tam tikrą laiką, servisas pašalinamas iš registro.
Vienas iš Eureka privalumų – self-preservation režimas. Jei staiga daug servisų nustoja siųsti heartbeats (pvz., dėl tinklo problemų), Eureka neišmeta jų visų iš registro, o įjungia apsaugos režimą. Tai apsaugo nuo situacijos, kai laikinas tinklo sutrikimas sunaikintų visą jūsų service registry.
Našumo ir mastelio klausimai
Kai kalbame apie service discovery, našumas yra kritinis aspektas. Jūsų servisai gali daryti šimtus ar tūkstančius užklausų per sekundę, ieškodami kitų servisų.
Consul šioje srityje yra tikras čempionas. Go kalba parašyta sistema sugeba apdoroti milžinišką kiekį užklausų su minimaliomis resursų sąnaudomis. DNS integracija reiškia, kad daugeliu atvejų jūsų aplikacijos gali naudoti standartinį DNS caching, kas dar labiau sumažina apkrovą. Praktikoje Consul klasteris gali aptarnauti tūkstančius servisų su minimaliu latency.
Eureka, būdama Java aplikacija, reikalauja daugiau resursų. JVM overhead yra realus dalykas, ir Eureka serveris gali prireikti nemažai RAM, ypač kai registry auga. Tačiau tai nereiškia, kad Eureka yra lėta – ji puikiai susidoroja su dauguma realių scenarijų. Netflix ja naudoja produkcinėje aplinkoje su tūkstančiais servisų, taigi ji tikrai gali išlaikyti apkrovą.
Svarbus skirtumas – kaip klientai gauna informaciją. Consul klientai gali naudoti DNS arba HTTP API, ir duomenys yra labai švieži. Eureka klientai periodiški atnaujina savo lokalų cache’ą iš serverio (pagal nutylėjimą kas 30 sekundžių). Tai reiškia, kad gali būti iki 30 sekundžių vėlavimas, kol naujas servisas tampa matomas visiems. Daugelyje scenarijų tai nėra problema, bet jei jums reikia beveik realaus laiko atnaujinimų, Consul yra geresnis pasirinkimas.
Integracija su egzistuojančia infrastruktūra
Vienas iš svarbiausių kriterijų renkantis tarp Consul ir Eureka – kaip gerai jie integruojasi su jūsų dabartine technologijų krūva.
Jei jūsų pasaulis sukasi aplink Spring Boot ir Spring Cloud, Eureka yra beveik akivaizdus pasirinkimas. Integracija yra neįtikėtinai paprasta – pridedi kelias anotacijas, keletą konfigūracijos eilučių, ir viskas veikia. Spring Cloud ekosistema suteikia daug papildomų įrankių, kurie puikiai veikia su Eureka: Ribbon load balancing, Hystrix circuit breakers, Zuul API gateway. Viskas kartu sudaro labai galingą mikroservisų platformą.
Consul, kita vertus, yra technologijų agnostikas. Jis veikia su bet kokia programavimo kalba, bet kokia framework. Turite Python servisus? Node.js? Go? Ruby? Visi jie gali naudoti Consul be jokių problemų. Tai ypač svarbu, jei turite heterogenišką aplinką arba planuojate naudoti skirtingas technologijas skirtingiems servisams.
Kubernetes aplinkoje abu sprendimai turi savo vietą, bet čia atsiranda trečias žaidėjas – pats Kubernetes su savo integruotu service discovery. Tačiau Consul gali suteikti papildomų funkcijų, kaip service mesh su Consul Connect, kas gali būti labai naudinga sudėtingesnėse situacijose. Eureka Kubernetes aplinkoje veikia, bet reikalauja daugiau konfigūracijos ir ne visada jaučiasi natūraliai.
Saugumo aspektai ir produkcinė aplinka
Produkcinėje aplinkoje saugumas nėra pasirenkamas dalykas – tai būtinybė. Service discovery sistema žino apie visus jūsų servisus, jų lokacijas, būsenas. Tai labai jautri informacija.
Consul siūlo ACL (Access Control Lists) sistemą, kuri leidžia smulkiai kontroliuoti, kas gali skaityti ir rašyti duomenis. Galite sukurti skirtingus token’us skirtingiems servisams su skirtingomis teisėmis. Pavyzdžiui, jūsų mokėjimų servisas gali turėti teisę registruoti save ir skaityti informaciją apie duomenų bazės servisus, bet negalėti matyti kitų servisų konfigūracijos.
Consul taip pat palaiko TLS šifravimą visai komunikacijai tarp agent’ų ir serverių. Tai apsaugo nuo man-in-the-middle atakų ir užtikrina, kad jūsų service discovery duomenys keliauja saugiai per tinklą. Consul Connect eina dar toliau, suteikdamas mutual TLS autentifikaciją tarp pačių servisų.
Eureka saugumo požiūriu yra paprastesnė. Ji palaiko bazinę HTTP autentifikaciją ir gali veikti per HTTPS, bet neturi tokios sudėtingos ACL sistemos kaip Consul. Daugeliu atvejų tai yra pakankama, ypač jei Eureka veikia privačiame tinkle už firewall. Tačiau jei jums reikia labai smulkios prieigos kontrolės, Consul yra geresnis pasirinkimas.
Produkcinėje aplinkoje HA (High Availability) yra kritinis. Consul su savo Raft consensus algoritmu garantuoja, kad duomenys yra konsistentūs ir sistema veikia net praradus dalį serverių. Rekomenduojama konfigūracija – 5 serveriai, kas leidžia išgyventi 2 serverių praradimą. Eureka replikacija yra paprastesnė, bet dėl AP modelio gali būti trumpalaikių inconsistency situacijų.
Realūs panaudojimo scenarijai ir patarimai
Teorija yra gera, bet kas iš tikrųjų veikia praktikoje? Pažvelkime į konkrečius scenarijus.
Startuolis su Spring Boot mikroservisais: Jei kuriate naują projektą su Spring Boot, Eureka yra puikus pasirinkimas. Greita pradėti, lengva integruoti, daugybė pavyzdžių ir tutorialų. Galite turėti veikiančią sistemą per kelias valandas. Pradėkite su vienu Eureka serveriu development aplinkoje, vėliau pereikite prie dviejų ar trijų serverių produkcinėje.
Enterprise su įvairių technologijų mišiniu: Jei turite Java, Python, Node.js ir Go servisus, Consul yra akivaizdus pasirinkimas. Jo technologijų agnostiškumas reiškia, kad visi servisai gali naudoti tą pačią service discovery sistemą. Be to, Consul key-value store gali pakeisti atskirą konfigūracijos valdymo sistemą, sumažindamas infrastruktūros sudėtingumą.
Migracija iš monolito: Jei skaidote senąjį monolitą į mikroservisus, Eureka gali būti švelnesnis kelias, ypač jei jau naudojate Spring. Galite palaipsniui iškelti funkcionalumą į atskirus servisus, o Eureka padės jiems rasti vienas kitą. Self-preservation režimas apsaugos nuo atsitiktinių problemų migracijos metu.
Multi-cloud ar hybrid cloud aplinka: Consul čia spindi. Jo WAN federation funkcionalumas leidžia turėti Consul klasterius skirtinguose datacenter’iuose ar cloud provider’iuose, kurie sinchronizuoja duomenis tarpusavyje. Tai puikiai tinka, jei turite servisus AWS, Azure ir savo datacenter’yje.
Praktinis patarimas: nesvarbu, kurį pasirinksite, visada testuokite failure scenarios. Kas nutiks, jei service discovery serveris nukris? Ar jūsų aplikacijos sugrius, ar tęs darbą su cache’intu registry? Eureka klientai turi lokalų cache’ą, kas padeda, bet reikia užtikrinti, kad jūsų aplikacijos grakštingai susidoroja su situacija, kai servisas registry’je yra, bet realiai nepasiekiamas.
Monitoringas, debugging ir kasdienė priežiūra
Service discovery sistema yra kritinė infrastruktūros dalis, todėl turite gerai ją monitorinti ir greitai reaguoti į problemas.
Consul siūlo puikų web UI, kuris rodo visus servisus, jų būsenas, health checks rezultatus. Galite greitai pamatyti, kas veikia, kas ne, ir kur yra problemos. Consul taip pat eksportuoja metricas Prometheus formatuose, todėl integracija su moderniomis monitoringo sistemomis yra paprasta. Svarbu stebėti tokius dalykus kaip Raft leader elections (jei jų per daug, yra problema), failed health checks, ir agent’ų prisijungimo būsenas.
Eureka taip pat turi web UI, kuris rodo registruotus servisus. Jis paprastesnis už Consul, bet daro savo darbą. Svarbu stebėti, ar Eureka serveriai tarpusavyje replikuoja duomenis teisingai, ar nėra įjungtas self-preservation režimas be priežasties (tai gali reikšti tinklo problemas), ir ar heartbeat’ai ateina reguliariai.
Debugging gali būti sudėtingas. Jei servisas A negali rasti serviso B, kur problema? Ar B neužsiregistravo? Ar health check’as failed? Ar tinklo problema? Consul ir Eureka abu turi API endpoints, kuriuos galite naudoti debugging’ui. Pavyzdžiui, Consul `/v1/health/service/` grąžina visą informaciją apie servisą ir jo būseną. Eureka `/eureka/apps/` daro panašiai.
Vienas dažnas klaidų šaltinis – neteisingi health check’ai. Jei health check’as per griežtas, servisai bus žymimi kaip unhealthy net ir veikdami normaliai. Jei per minkštas – neveikiantys servisai liks registry’je. Reikia rasti balansą. Geras health check’as turėtų tikrinti ne tik ar aplikacija atsako, bet ir ar ji gali pasiekti kritines priklausomybes (duomenų bazę, cache, etc.).
Kaina, licencijos ir bendruomenės palaikymas
Abu sprendimai yra open source, bet yra niuansų.
Consul turi du variantus: Consul OSS (open source) ir Consul Enterprise. OSS versija yra visiškai nemokama ir turi visas pagrindines funkcijas, kurių pakanka daugumai projektų. Enterprise versija prideda tokius dalykus kaip automated backups, enhanced read scalability, network segments, ir priority support. Jei esate didelė organizacija su griežtais compliance reikalavimais, Enterprise gali būti verta investicijos.
Eureka yra visiškai open source ir nemokama. Nėra jokios „enterprise” versijos. Tai gali būti privalumas, jei biudžetas ribotas, bet reiškia, kad negausite oficialaus palaikymo iš Netflix. Kita vertus, Spring Cloud komercinis palaikymas (per VMware/Pivotal) apima ir Eureka, jei naudojate visą Spring Cloud stack’ą.
Bendruomenės palaikymas yra svarbus. Consul turi labai aktyvią bendruomenę, daugybę tutorialų, blog post’ų, ir Stack Overflow atsakymų. HashiCorp, kaip kompanija, aktyviai palaiko produktą ir reguliariai išleidžia atnaujinimus. Eureka taip pat turi stiprią bendruomenę, ypač Spring ekosistemoje, bet reikia paminėti, kad Netflix paskutiniais metais mažiau aktyviai palaiko kai kuriuos savo OSS projektus, įskaitant Eureka. Tai nereiškia, kad Eureka mirė – ji vis dar plačiai naudojama ir palaiko Spring Cloud komanda, bet naujų funkcijų greičiausiai nesulauksite.
Kuris pasirinkimas jums tinkamesnis ir kaip pradėti
Taigi, Consul ar Eureka? Atsakymas, kaip dažnai būna, yra „depends”.
Pasirinkite Eureka, jei:
– Naudojate Spring Boot ir Spring Cloud ekosistemą
– Jūsų komanda gerai išmano Java
– Jums reikia greito start’o su minimaliu mokymosi kreive
– Availability yra svarbesnė už absoliučią konsistenciją
– Neturite poreikio papildomoms funkcijoms kaip service mesh ar key-value store
Pasirinkite Consul, jei:
– Turite heterogenišką technologijų aplinką
– Jums reikia papildomų funkcijų (key-value store, service mesh, etc.)
– Svarbus našumas ir mažos resursų sąnaudos
– Planuojate multi-datacenter ar multi-cloud setup’ą
– Norite stiprios konsistencijos garantijų
– Reikia sudėtingesnės prieigos kontrolės ir saugumo funkcijų
Kaip pradėti? Su abiem įrankiais galite turėti veikiančią sistemą per vieną dieną.
Eureka pradžiai: sukurkite naują Spring Boot projektą su `spring-cloud-starter-netflix-eureka-server` dependency. Pridėkite `@EnableEurekaServer` anotaciją prie main klasės, sukonfiguruokite `application.yml`, ir turite veikiantį Eureka serverį. Klientams – `spring-cloud-starter-netflix-eureka-client` ir `@EnableDiscoveryClient`. Pavyzdžių pilnas internetas.
Consul pradžiai: atsisiųskite binary (vienas failas!), paleiskite `consul agent -dev` development režimu, ir turite veikiantį Consul. Servisų registracijai galite naudoti HTTP API arba konfigūracijos failus. Jei naudojate Docker, yra oficialus Consul image. Kubernetes aplinkoje – Helm chart’as.
Nepriklausomai nuo pasirinkimo, pradėkite paprastai. Vienas serveris development’ui, paprastas setup. Kai suprasite, kaip viskas veikia, galite pereiti prie sudėtingesnių konfigūracijų su HA, saugumu, ir monitoringu. Mikroservisų pasaulyje nėra tobulų sprendimų – yra tik sprendimai, kurie geriau ar prasčiau atitinka jūsų konkrečius poreikius. Consul ir Eureka abu yra brandūs, patikimi įrankiai, kurie padės jūsų servisams rasti vienas kitą patikimai ir efektyviai. Pasirinkimas tarp jų daugiau priklauso nuo jūsų technologijų stack’o, komandos įgūdžių, ir specifinių projekto reikalavimų nei nuo to, kuris yra „geresnis” abstrakčiai.
